深入探討:Nginx 502 Bad Gateway錯誤的解決方法
Nginx 502 Bad Gateway的含義是請求的PHP-CGI已經(jīng)執(zhí)行,但是由于某種原因(一般是讀取資源的問題)沒有執(zhí)行完畢而導致PHP-CGI進程終止,
一般來說Nginx 502 Bad Gateway和php-fpm.conf的設(shè)置有關(guān)。
php-fpm.conf有兩個至關(guān)重要的參數(shù),一個是max_children,
另一個是request_terminate_timeout,但是這個值不是通用的,而是需要自己計算的。
在安裝好使用過程中出現(xiàn)502問題,一般是因為默認php-cgi進程是5個,可能因為phpcgi進程不夠用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 將其中的max_children值適當增加。
計算的方式如下:
如果你的服務(wù)器性能足夠好,且寬帶資源足夠充足,PHP腳本沒有死循環(huán)或BUG的話你可以直接將 request_terminate_timeout設(shè)置成0s。0s的含義是讓PHP-CGI一直執(zhí)行下去而沒有時間限制。而如果你做不到這一點,也就 是說你的PHP-CGI可能出現(xiàn)某個BUG,或者你的寬帶不夠充足或者其他的原因?qū)е履愕腜HP-CGI假死那么就建議你給request_terminate_timeout賦一個值,這個值可以根據(jù)服務(wù)器的性能進行設(shè)定。一般來說性能越好你可以設(shè)置越高,20分鐘-30分 鐘都可以。
而max_children這個值又是怎么計算出來的呢?這個值原則上是越大越好,php-cgi的進程多了就會處理的很快,排隊的請求就會很少。 設(shè)置max_children也需要根據(jù)服務(wù)器的性能進行設(shè)定,
一般來說一臺服務(wù)器正常情況下每一個php-cgi所耗費的內(nèi)存在20M左右。
按照官方的答案,排查了相關(guān)的可能,并結(jié)合了網(wǎng)友的答案,得出了下面的解決辦法。
1、查看php fastcgi的進程數(shù)(max_children值)
代碼:netstat -anpo | grep “php-cgi” | wc -l
5(假如顯示5)
2、查看當前進程
代碼:top
觀察fastcgi進程數(shù),假如使用的進程數(shù)等于或高于5個,說明需要增加(根據(jù)你機器實際狀況而定)
3、調(diào)整/usr/local/php/etc/php-fpm.conf 的相關(guān)設(shè)置
<value name=”max_children”>10</value>
<value name=”request_terminate_timeout”>60s</value>
max_children最多10個進程,按照每個進程20MB內(nèi)存,最多200MB。
request_terminate_timeout執(zhí)行的時間為60秒,也就是1分鐘。
#################################################
網(wǎng)站運行環(huán)境是Nginx +php fastcgi模式的。這幾天運行一直不穩(wěn)定,總是出錯,報502錯誤。
今天跟以前的同事請教了一下,他告訴我檢查一下php-fpm的日志,那里記錄了很多有用的信息。
于是我檢查了一下,發(fā)現(xiàn)確實有很多報錯信息:
Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200
如果和nginx.conf : worker_rlimit_nofile 65500; 不一致必須檢查,設(shè)置重啟服務(wù)
Mar 01 14:39:15.881047 [NOTICE] fpm_children_make(), line 352: child 12364 (pool default) started
Mar 01 14:39:21.715825 [NOTICE] fpm_got_signal(), line 48: received SIGCHLD
Mar 01 14:39:21.715899 [NOTICE] fpm_children_bury(), line 215: child 11947 (pool default) exited with code 0 after 175.443305 seconds from start
有的報錯信息,就好說了,直接上網(wǎng)查信息。
經(jīng)過搜索,最后總結(jié)出以下幾條優(yōu)化策略:
1、提升服務(wù)器的文件句柄打開打開
# vi /etc/security/limits.conf 加上
* soft nofile 65500
* hard nofile 65500
2、提升nginx的進程文件打開數(shù)
nginx.conf : worker_rlimit_nofile 65500;
3、修改php-fpm.conf文件,主要需要修改2處。
命令 ulimit -n 查看限制的打開文件數(shù),php-fpm.conf 中的選項rlimit_files 確保和此數(shù)值一致。
<value name=”max_requests”>10240</value>
<value name=”rlimit_files”>65500</value>
4、
# vi /etc/sysctl.conf
底部添加
fs.file-max=65500
經(jīng)過以上修改,重啟PHP。/usr/local/webserver/php/sbin/php-fpm restart
在查看ulimit -n 是否生效,否則重啟服務(wù)器或者/etc/sysctl.conf、/etc/security/limits.conf的配置生效
到目前為止還沒有出現(xiàn)過以上的報錯信息。一切運行正常。
- Nginx 502 bad gateway和Nginx 504 Gateway Time-out錯誤解決方法 錯誤解決辦法
- 502 bad gateway是什么意思 502 bad gateway錯誤解決方法
- nginx 502 Bad Gateway 錯誤解決辦法
- Nginx 502 Bad Gateway錯誤常見的4種原因和解決方法
- PHP 502bad gateway原因及解決方案
- Nginx 502 Bad Gateway錯誤原因及解決方案
- nginx服務(wù)器異常502 bad gateway原因排查
- Nginx?502?bad?gateway錯誤解決的九種方案及原因
- Nginx 502 Bad Gateway錯誤解決詳細指南與實例
相關(guān)文章
PHP7使用ODBC連接SQL Server2008 R2數(shù)據(jù)庫示例【基于thinkPHP5.1框架】
這篇文章主要介紹了PHP7使用ODBC連接SQL Server2008 R2數(shù)據(jù)庫,結(jié)合實例形式分析了基于thinkPHP5.1框架使用ODBC連接SQL Server2008數(shù)據(jù)庫相關(guān)操作技巧,需要的朋友可以參考下2019-05-05thinkphp 中的volist標簽在ajax操作中的特殊性(推薦)
在一個ThinkPHP的復雜頁面(包含volist)中實現(xiàn)volist標簽顯示Jquery查詢結(jié)果的返回。這篇文章給大家介紹了thinkphp 中的volist標簽在ajax操作中的特殊性(推薦),需要的朋友參考下吧2018-01-01PHP水印類,支持添加圖片、文字、填充顏色區(qū)域的實現(xiàn)
下面小編就為大家?guī)硪黄狿HP水印類,支持添加圖片、文字、填充顏色區(qū)域的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02thinkPHP5框架auth權(quán)限控制類與用法示例
這篇文章主要介紹了thinkPHP5框架auth權(quán)限控制類與用法,結(jié)合實例形式分析了thinkPHP5框架擴展auth權(quán)限控制類的定義與使用方法,代碼注釋中備有較為詳盡的使用說明與數(shù)據(jù)庫操作語句,需要的朋友可以參考下2018-06-06