今天升級完P(guān)HP出現(xiàn)了502 Bad Gateway錯誤,根據(jù)經(jīng)驗是php-fpm的問題,但是看到網(wǎng)上那些什么訪問量,子進程設(shè)置什么的,但是我這太服務(wù)器壓根沒啥流量。所以只能從配置文件下手看看。
- [global]
- pid = /usr/local/php/var/run/php-fpm.pid
- error_log = /usr/local/php/var/log/php-fpm.log
- log_level = notice
- [www]
- listen = /tmp/php-cgi.sock
- user = www
- group = www
- pm = dynamic
- pm.max_children = 20
- pm.start_servers = 2
- pm.min_spare_servers = 1
- pm.max_spare_servers = 6
- <a href="/"/tags.php/request//"" target="/"_blank/"">request</a>_terminate_timeout = 100
看到 /tmp/php-cgi.sock 直覺發(fā)現(xiàn)應(yīng)該是個文件,所以前往該目錄查看權(quán)限,發(fā)現(xiàn)文件屬主是 root:root,而我的nginx和php-fpm進程是以www用戶運行的。所以應(yīng)該是權(quán)限問題。
而配置文件中的user = www,group = www也設(shè)置了一個權(quán)限,通過 ps -aux|grep php 發(fā)現(xiàn),這是php-fpm進程的屬主。
知道問題的源頭后便開始查php-fpm的配置,查到了 listen.ower listen.group 設(shè)置。
這是改進之后的文件:
- [global]
- pid = /usr/local/php/var/run/php-fpm.pid
- error_log = /usr/local/php/var/log/php-fpm.log
- log_level = notice
- [www]
- listen = /tmp/php-cgi.sock
- listen.owner = www
- listen.group = www
- user = www
- group = www
- pm = dynamic
- pm.max_children = 20
- pm.start_servers = 2
- pm.min_spare_servers = 1
- pm.max_spare_servers = 6
- request_terminate_timeout = 100
如果不知道查看配置可以嘗試下面方法
1、查看當前的PHP FastCGI進程數(shù)是否夠用:
netstat -anpo | grep "php-cgi" | wc -l
如果實際使用的“FastCGI進程數(shù)”接近預設(shè)的“FastCGI進程數(shù)”,那么,說明“FastCGI進程數(shù)”不夠用,需要增大。
2、部分PHP程序的執(zhí)行時間超過了Nginx的等待時間,可以適當增加nginx.conf配置文件中FastCGI的timeout時間,例如:
- ......
- http
- {
- ......
- fastcgi_connect_timeout 300;
- fastcgi_send_timeout 300;
- fastcgi_read_timeout 300;
- ......
- }
補充另一篇文章
1.php-fpm進程數(shù)不夠用
使用 netstat -napo |grep "php-fpm" | wc -l 查看一下當前fastcgi進程個數(shù),如果個數(shù)接近conf里配置的上限,就需要調(diào)高進程數(shù)。
但也不能無休止調(diào)高,可以根據(jù)服務(wù)器內(nèi)存情況,可以把php-fpm子進程數(shù)調(diào)到100或以上,在4G內(nèi)存的服務(wù)器上200就可以。
2. 調(diào)高調(diào)高linux內(nèi)核打開文件數(shù)量
可以使用這些命令(必須是root帳號)
- echo 'ulimit -HSn 65536' >> /etc/profile
- echo 'ulimit -HSn 65536' >> /etc/rc.local
- source /etc/profile
3.腳本執(zhí)行時間超時
如果腳本因為某種原因長時間等待不返回 ,導致新來的請求不能得到處理,可以適當調(diào)小如下配置。
nginx.conf里面主要是如下:
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
php-fpm.conf里如要是如下:
request_terminate_timeout = 10s
4.緩存設(shè)置比較小
修改或增加配置到nginx.conf
- proxy_buffer_size 64k;
- proxy_buffers 512k;
- proxy_busy_buffers_size 128k;
- 5. recv() failed (104: Connection reset by peer) while reading response header from upstream
可能的原因機房網(wǎng)絡(luò)丟包或者機房有硬件防火墻禁止訪問該域名
但最重要的是程序里要設(shè)置好超時,不要使用php-fpm的request_terminate_timeout,最好設(shè)成request_terminate_timeout=0;
因為這個參數(shù)會直接殺掉php進程,然后重啟php進程,這樣前端nginx就會返回104: Connection reset by peer。這個過程是很慢,總體感覺就是網(wǎng)站很卡。
May 01 10:50:58.044162 [WARNING] [pool www] child 4074, script '/usr/local/nginx/html/quancha/sameip/detail.php' execution timed out (15.129933 sec), terminating
May 01 10:50:58.045725 [WARNING] [pool www] child 4074 exited on signal 15 SIGTERM after 90.227060 seconds from start
May 01 10:50:58.046818 [NOTICE] [pool www] child 4082 started
說一千道一萬最重要的就是程序里控制好超時,gethostbyname、curl、file_get_contents等函數(shù)的都要設(shè)置超時時間。
新聞熱點
疑難解答