Httpd.worker Confused Me

来源:互联网 发布:雪梨的淘宝店 编辑:程序博客网 时间:2024/04/28 15:13

最近因为一个服务需要改版,而且是前端和后端都需要更新。那就免不了要倒腾一下 MySQL 、 Apache 这些服务了。

其实我是很怕倒腾服务器搭建的,在我看来,这要比搞研发麻烦的多,因为每次倒腾这些东西总会因为一些自己莫名其妙的疏忽或者是服务的 bug 而引起一堆连锁反应。

这次的起因其实是个很不起眼的事情。优化完数据库之后需要把数据库搬迁到另外一台服务器上,无意间发现 Apache 的日志很大。看了下 httpd.conf 配置文件,似乎是把日志的级别调的太低了,导致出现了一堆没用的日志。那就改一下配置文件吧,然后输入命令重启apache服务让配置生效。

service httpd restart

Apache 服务关闭失败,给我的回复是一个错误,悲剧!

[crit] Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP. Pre-configuration failed

其实之前也遇到过这个情况,我怕重新编译 PHP 后搞出什么别的问题,每次都是

killall httpdservice httpd start

完事。

想想每次这样也不是办法,于是就把 PHP 重新更新编译了一下。

yum update php

重启 Apache ,成功。本以为 Apache 的折腾到目前为止就告一段落了,哪知道新的问题又冒出来了。PHP页面可以被解释执行,但是 PHP 只要一操作 MySQL 就出错。根据以前的经验,我下意识的认为这是 php-mysql 模块丢失或出错导致的问题。于是想都不想地重装一下 php-mysql 模块。

yum reinstall php-mysql

无效,看看

<?php phpinfo(); ?>

php的编译信息里面竟然有 –without-mysql ,太雷了,更新了 PHP 之后,竟然变成这个样子。

百思不得其解之时,我用 top 看了下执行的进程,原先的 httpd 竟然都变成了 httpd.worker。上网查了下发现 worker 是 apache 不同于默认 prefork 模式的另外一个运行模式。

不光通过 .worker ,通过命令也可以区分。

$ httpd -lCompiled in modules:  core.c  prefork.c  http_core.c  mod_so.c$ httpd.worker -lCompiled in modules:  core.c  worker.c  http_core.c  mod_so.c

更恼人的时候,这个模式不支持 php-mysql ,这真是要了我的命。得想办法切换回 prefork 模式试试看。

killall httpd.worker/usr/sbin/httpd -k start

PHP 顺利连接 MySQL,由此可见问题出在了 service 上,它自作主张启动了 httpd.worker 。于是查看一下 /etc/init.d/httpd ,里面有一段清楚写着:

# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server# with the thread-based "worker" MPM; BE WARNED that some modules may not# work correctly with a thread-based MPM; notably PHP will refuse to start.

看来问题的根源找到了,把 /etc/sysconfig/httpd 中 HTTPD=/usr/sbin/httpd.worker 改为 HTTPD=/usr/sbin/httpd ,果然问题解决了,现在 PHP 可以连接 MySQL 了,service 启动 Apache 也正常了。哈哈~

唠叨了下这次改版遇到的问题。感觉自己遇到问题还是不够冷静,有些时候光靠经验不冷静思考还是挺容易走弯路的。其实在这次改版遇到的问题还不止这个,这篇已经够啰嗦了,就留到下次再说吧。
上面所提到的一些路径都是我用 yum 安装的默认路径,如果有些朋友是自己编译源码安装的,那路径会和文中有出入,请自行更换正确路径。嚯嚯!

======================

上面是转载的内容,如果使用yum安装的mysql、php,连接数据库报以下错误时:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/dbase.so' - /usr/lib64/php/modules/dbase.so: undefined symbol: core_globals in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/gd.so' - /usr/lib64/php/modules/gd.so: undefined symbol: core_globals in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/ldap.so' - /usr/lib64/php/modules/ldap.so: undefined symbol: executor_globals in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mbstring.so' - /usr/lib64/php/modules/mbstring.so: undefined symbol: sapi_globals in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mysql.so' - /usr/lib64/php/modules/mysql.so: undefined symbol: executor_globals in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mysqli.so' - /usr/lib64/php/modules/mysqli.so: undefined symbol: executor_globals in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo.so' - /usr/lib64/php/modules/pdo.so: undefined symbol: executor_globals in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_mysql.so' - /usr/lib64/php/modules/pdo_mysql.so: undefined symbol: php_pdo_register_driver in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_sqlite.so' - /usr/lib64/php/modules/pdo_sqlite.so: undefined symbol: executor_globals in Unknown on line 0

可能是因为httpd运行在work模式下,可以考虑用上面的方法修正,也可以修改:/etc/sysconfig/httpd(httpd的service配置文件)中注释掉:

#HTTPD=/usr/sbin/httpd.worker

ps:httpd MPM(多路处理模式)

--with-mpm=<MPM> 先择Apache多路处理模块,<MPM>={beos|event|worker|prefork|mpmt_os2},prefork为 Unix系统下默认处理模块,它将运行一个非线程型的、预派生的Web服务器,适合于没有线程安全库,需要避免线程兼容性问题的系统,它是要求将每个请求 相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。worker为支持混合的多线程多进程的多路处理模块,由于使用线程来处理 请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM,同时,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。 如果你的系统是基于线程安全的,那么笔者建议使用worker替代prefork,它将使得你的系统得到实际的性能改善。

原创粉丝点击