Nginx是俄羅斯人所編寫的十分輕量級的HTTP服務器,Nginx提供了一個高性能的HTTP和反向代理服務器。以小編習慣的用法是在ubuntu 安裝 LEMP (linux + nginx + mysql + php)環境。

在Nginx的環境裡面,定時檢視error.log是很重要的事情,這次小編就遇到了這問題。在 /var/log底下的php7.0-fpm.log裡面可以發現下列的錯誤。

定期查看php7.0-fpm.log

WARNING: [pool www] server reached pm.max_children setting (*), consider raising it

在處理php時,是Nginx直接調用php-fpm,如果請求量過高然後又沒有給php-fpm足夠的配置,就會有資源耗盡的可能,一旦找不到php-fpm,就會出現502的錯誤畫面。

這時候需要調整php的www.conf,如果是php7.0,位置會在 /etc/php/7.0/fpm/poo.ld/www.conf,而需要調整的部分如下,

pm.max_children
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers
pm.max_requests

計算要調整的數量,則是需要依據Server上的記憶體進行調配。可以先查看每一個php-fpm使用的記憶體數量,可以用下列方式來查看。

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | grep php-fpm

會跑出每一個php-fpm所需要的記憶體

33.88 Mb php-fpm: pool www
33.83 Mb php-fpm: pool www
33.57 Mb php-fpm: pool www
33.52 Mb php-fpm: pool www
33.28 Mb php-fpm: pool www
32.34 Mb php-fpm: pool www
32.32 Mb php-fpm: pool www
31.88 Mb php-fpm: pool www
31.86 Mb php-fpm: pool www
31.78 Mb php-fpm: pool www
31.38 Mb php-fpm: pool www
30.35 Mb php-fpm: pool www
28.11 Mb php-fpm: pool www
26.17 Mb php-fpm: pool www
24.29 Mb php-fpm: pool www
24.02 Mb php-fpm: pool www
5.90 Mb php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
0.34 Mb grep –color=auto php-fpm

這樣推算平均大概在30MB左右,如果Server的記憶體是4G來看,扣掉系統運作的部分,假設是3G來計算pm.max_children = 3072MB / 30MB = 102,所以每一個參數都要自己進行調整測試才可以找出符合自己Server的數量,別忘記,調整完畢之後記得要重啟服務。

sudo service php7.0-fpm restart

參考來源:https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/