不得不说,英文不好弄linux服务器有时是挺痛苦的,苦逼的博主没好好学习英文,导致被lnmp折腾的够呛.
php-fpm配置不当,导致服务器经常出现502错误,上个学期多次调整都没有解决,网上找来资料,大都是增加max_children,可是我都加到顶了,php-fpm log里面还是有大量的警告:
eems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 88 total children
不想看英文,一看就头晕,但是502更头晕,特别是昨天,刚重启了lnmp没多久,容不得松口气,就看到负载飙到20多,一开网站,又特么502了。
硬着头皮看默认配置里面的英文注释,才发现自己的三个参数配置貌似有相当大的问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
Choose how the process manager will control the number of child processes. ; Possible Values: ; static – a fixed number (pm.max_children) of child processes; ; dynamic – the number of child processes are set dynamically based on the ; following directives. With this process management, there will be ; always at least 1 children. ; pm.max_children – the maximum number of children that can ; be alive at the same time. ; pm.start_servers – the number of children created on startup. ; pm.min_spare_servers – the minimum number of children in ‘idle’ ; state (waiting to process). If the number ; of ‘idle’ processes is less than this ; number then some children will be created. ; pm.max_spare_servers – the maximum number of children in ‘idle’ ; state (waiting to process). If the number ; of ‘idle’ processes is greater than this ; number then some children will be killed. ; ondemand – no children are created at startup. Children will be forked when ; new requests will connect. The following parameter are used: ; pm.max_children – the maximum number of children that ; can be alive at the same time. ; pm.process_idle_timeout – The number of seconds after which ; an idle process will be killed. ; Note: This value is mandatory. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
; The number of child processes to be created when pm is set to ‘static’ and the ; maximum number of child processes when pm is set to ‘dynamic’ or ‘ondemand’. ; This value sets the limit on the number of simultaneous requests that will be ; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. ; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP ; CGI. The below defaults are based on a server without much resources. Don’t ; forget to tweak pm.* to fit your needs. ; Note: Used when pm is set to ‘static’, ‘dynamic’ or ‘ondemand’ ; Note: This value is mandatory. pm.max_children = 5 ; The number of child processes created on startup. ; Note: Used only when pm is set to ‘dynamic’ ; Default Value: min_spare_servers + (max_spare_servers – min_spare_servers) / 2 pm.start_servers = 2 ; The desired minimum number of idle server processes. ; Note: Used only when pm is set to ‘dynamic’ ; Note: Mandatory when pm is set to ‘dynamic’ pm.min_spare_servers = 1 ; The desired maximum number of idle server processes. ; Note: Used only when pm is set to ‘dynamic’ ; Note: Mandatory when pm is set to ‘dynamic’ pm.max_spare_servers = 3 |
注释上貌似是说,static模式时,只有pm.max_children生效,dynamic模式时,pm.max_children依然生效,另外:
pm.start_server #控制服务启动时创建的进程数,
pm.min_spare_servers #控制最小备用进程数
pm.max_spare_servers #最大备用进程数
spare_servers翻译成备用进程,不知道合适不适合,如果真这样,那我之前的配置就让人无奈了: pm.min_space_servers 20,pm.max_spare_servers 80,pm.max_children 80,会不会是因为备用的太多才导致502呢?
另外,下面的具体配置里面,注释中给出了计算pm.start_servers默认值的公式:
Default Value: min_spare_servers + (max_spare_servers – min_spare_servers) / 2
按这个公式,我之前的pm.start_servers应该是 20+(80-20)/2=50,可是我当时设置的是20…
重新规划如下:
pm = dynamic
pm.max_children =80
pm.start_servers = 12
pm.min_spare_servers = 4
pm.max_spare_servers = 20
rlimit_files = 65535
pm.max_requests = 102400
貌似要好点了,内存使用不像之前那么夸张了:

具体如何,留待之后几天的观察吧,502君,求不要在折腾善良的博主了 ~~o(>_<)o ~~