在前面介绍了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>ThreadsPerChild默认为64,若需修改需要设置ThreadLimit,必须先stop apache,然后再start,否则配置无效。
# ServerLimit 100
# StartServers 20
# MinSpareThreads 25
# MaxSpareThreads 1200
# ThreadsPerChild 50
# MaxRequestWorkers 2000
# MaxConnectionsPerChild 10000
#</IfModule>
MaxSpareThreads的参数设置,需要根据StartServers*ThreadsPerChild=1000,因此MaxSpareThreads必须大于1000,在此为1200,否则会有StartServers-MaxSpareThreads/ThreadsPerChild个进程被杀掉。
MaxRequestWorkers的参数设置,需要根据ServerLimit*ThreadsPerChild=5000,在此出我们设置为2000,启动后会有警告,我们根据提示将其改为5000即可。
如果我们发现服务器的负载有点高,大都是httpd占用的,而我们还有剩余系统资源,那么我们需要更改我们的参数了。
另外,如果我们的nginx反向代理httpd,而此时httpd由于负载高处理相关请求会进入队列等待,这就会造成nginx返回502 bad gateway,而其实这是由于后端服务器处理超时导致的,我们需要查看我们的后端服务器进行解决。