关于apache的mpm-event的参数无法调整问题

时间:2022-10-24 19:47:42

在前面介绍了apache的几种工作模式后,但是参数调整会出现一系列问题:

/usr/local/apache/bin/apachectl -k start后httpd服务无法启动,错误日志报错:

[Fri May 08 08:21:00.903245 2015] [core:warn] [pid 29799:tid 140652774147840] AH00098: pid file /usr/local/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
[Fri May 08 08:21:00.913540 2015] [mpm_event:notice] [pid 29799:tid 140652774147840] AH00489: Apache/2.4.2 (Unix) PHP/5.4.1 mod_fcgid/2.3.6 configured -- resuming normal operations
[Fri May 08 08:21:00.913605 2015] [core:notice] [pid 29799:tid 140652774147840] AH00094: Command line: '/usr/local/apache/bin/httpd'
[Fri May 08 08:21:00.916519 2015] [mpm_event:alert] [pid 30514:tid 140652574951168] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread
[Fri May 08 08:21:00.916528 2015] [mpm_event:alert] [pid 30441:tid 140652574951168] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread
[Fri May 08 08:21:00.916537 2015] [mpm_event:alert] [pid 30311:tid 140652574951168] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread
Error in my_thread_global_end(): 1 threads didn't exit
Error in my_thread_global_end(): 1 threads didn't exit
Error in my_thread_global_end(): 1 threads didn't exit


这其实是有两方面原因导致:

1.系统内核限制,主要是max user processes,这个参数默认为1024,意思是限制每个用户的最大进程使用数,如果超过此限制即使mpm的参数设置正确也会导致httpd服务无法启动。

我们通过ulimit -u 102400来设置

具体了解请参考http://blog.yufeng.info/archives/2568这篇文章。

若设为开机启动,需要先更改/etc/security/limits.d/90-nproc.conf,此文件中nproc为进程的意思,将其修改为

*          soft    nproc     102400

然后再在/etc/rc.local中加入ulimit -u 102400

2.如果部分参数设置不正确,导致httpd服务器无法启动,至于如何调整在错误日志会有提示。

假设内核参数正常,我们以一个可以运行但是会有所warn的mpm-event来讲解下:

#<IfModule mpm_event_module>
# ServerLimit 100
# StartServers 20
# MinSpareThreads 25
# MaxSpareThreads 1200
# ThreadsPerChild 50
# MaxRequestWorkers 2000
# MaxConnectionsPerChild 10000
#</IfModule>
ThreadsPerChild默认为64,若需修改需要设置ThreadLimit,必须先stop apache,然后再start,否则配置无效。

MaxSpareThreads的参数设置,需要根据StartServers*ThreadsPerChild=1000,因此MaxSpareThreads必须大于1000,在此为1200,否则会有StartServers-MaxSpareThreads/ThreadsPerChild个进程被杀掉。

MaxRequestWorkers的参数设置,需要根据ServerLimit*ThreadsPerChild=5000,在此出我们设置为2000,启动后会有警告,我们根据提示将其改为5000即可。


如果我们发现服务器的负载有点高,大都是httpd占用的,而我们还有剩余系统资源,那么我们需要更改我们的参数了。


另外,如果我们的nginx反向代理httpd,而此时httpd由于负载高处理相关请求会进入队列等待,这就会造成nginx返回502 bad gateway,而其实这是由于后端服务器处理超时导致的,我们需要查看我们的后端服务器进行解决。