LNMP配置完成以后,經常遇到502 Bad Gateway的錯誤提示,究其原因多為2種。下面對這兩方面的問題進行分析:
1. 配置方面的錯誤
配置錯誤中,或者因為php-fpm找不到路徑,或者是權限問題。
【1】先對路徑進行分析: 在Nginx的配置文件中,有這么一段:
# vim /usr/local/nginx/conf/nginx.conf location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; }
如果開啟了虛擬主機配置文件目錄,那么這段配置多放在/usr/local/nginx/conf/vhosts目錄下的以域名為名的conf文件里面。注意里面的兩個地方:
fastcgi_pass unix:/tmp/php-fcgi.sock; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
第一行里面,fastcgi_pass是php-fpm的監聽方式,可以用下面的命令獲得:
# netstat -lnp |grep php-fpm
如果得到的php-fpm的監聽方式是socket的形式,就按照上面的格式配置就可以。若在php-fpm.conf中,我們對php-fpm的監聽配置是下面這樣:
Listen = 127.0.0.1:9000
那么,我們相應的Nginx的配置就應該是:
fastcgi_pass 127.0.0.1:9000;
第二行里面,配置的是Nginx的網頁文件路徑,配置正確后就不會提示502了。
【2】 權限的問題
# cat /usr/local/nginx/conf/nginx.conf ## 找到我們配置的第一行: user nobody nobody;
那么,這就是問題的關鍵了。如果要訪問內容的權限足夠,需要在php-fpm.conf配置里面,[www]模塊下加入如下配置:
[www] listen = /tmp/www.sock user = php-fpm group = php-fpm listen.owner = nobody listen.group = nobody
如此,權限統一,訪問不受限制,就不會顯示502!
2. 資源耗盡
LNMP架構處理php是直接調取后端的php-fpm服務, 如果nginx的請求量高,而又沒有給php-fpm配置足夠子進程,那么總有php-fpm耗盡的時候;耗盡后,nginx找不到php-fpm,導致502。
解決方案:
增加php-fpm.conf中的pm.max_children數值。
但服務器的資源也有限。根據經驗,4G內存機器只跑php-fpm和nginx,不跑mysql服務,pm.max_children最高可以設置為150,盡量不要超過該數值,8G內存可用設置為300,以此類推。
其他情況引起的502就極少了。如果出現,借助錯誤日志來排查。錯誤日志還可定義級別,默認為crit;該級別最嚴謹,記錄日志也最少;有時候一些小問題發現不了,會把日志級別調整一下,如“error_log /usr/local/nginx/logs/nginx_error.log debug;”。這樣顯示的日志就會有很多。不要忘記調試完后將級別改回crit,否則error_log會撐爆磁盤!