相信自己,加油!
****
nginx+php 出現502 bad gateway,一般這都不是nginx的問題,而是由於 fastcgi或者php的問題導致的
服務器出現 502 的原因是連接超時 我們向服務器發送請求 由於服務器當前鏈接太多,導致服務器方面無法給於正常的響應 , 產生此類報錯
因此如果你服務器併發量非常大,那隻能先增加機器,然後按以下方式優化會取得更好效果 ; 但如果你併發不大卻出現 502 ,一般都可以歸結爲配置問題,腳本超時問題。
****
1、memory_limit /etc/php/7.2/cli/php.ini
如果有個別php程序進程需要佔用極大內存時這個必須注意
2、max_children php-fpm.conf
設置不合理,php-fpm 進程數不夠用,設置過小會因爲沒有足夠的cgi進程處理請求,設置過
大會出現一會兒有響應正常,一會兒等很久纔有響應的情況,使用 netstat -napo |grep "php-
fpm" | wc -l 查看一下當前 fastcgi 進程個數,如果個數接近 conf 裏配置的上限,就需要調高
進程數(一般情況下children 按照內存計算,比如說1G設置64,2G128。這個根據實際情況
自行調整。)
3、pstream sent too big header while reading response headerfrom upstream nginx日誌
檢查client head buffer,fastcgi buffer size是否過小
4、 timeout PHP程序執行時間過長而超時
檢查nginx和fastcgi中各種timeout設置。nginx 中的 fastcgi_connect_timeout 300;
fastcgi_send_timeout 300 fastcgi_read_timeout300 keepalive_timeout ;
php-fpm中的request_terminate_timeout,php.ini中的max_execution_time
5、max_requests php-fpm
該參數指明瞭每個children最多處理多少個請求後便會被關閉。在大量處理請求下,如果該值
設置過小會導致 children頻繁的自殺和建立 而浪費大量時間,若所有的children差不多都在這
個時候自殺,則重建前將沒有children響應請求,於是出現502。可以將該值設置大一些或者
是0[無限]。
6、調高 linux 內核打開文件數量
( 必須是 root 帳號 )
echo 'ulimit -HSn 65536'>> /etc/profile
echo 'ulimit -HSn 65536'>> /etc/rc.local
source /etc/profile
7、腳本執行時間超時
如果腳本因爲某種原因長時間等待不返回 ,導致新來的請求不能得到處理,調小如下配置。
nginx.conf 裏面主要是如下
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
php-fpm.conf 裏如要是如下
request_terminate_timeout =10s
8、緩存設置較小
修改或增加配置到 nginx.conf
proxy_buffer_size 64k;
proxy_buffers 512k;
proxy_busy_buffers_size 128k;
9、recv()failed (104: Connection reset by peer) while reading response header
fromupstream
最重要的是程序裏要設置好超時,不要使用 php-fpm 的 request_terminate_timeout ,
最好設成 request_terminate_timeout=0;
因爲這個參數會直接殺掉 php 進程,然後重啓 php 進程,這樣前端 nginx 就會返回 104:
Connection reset by peer 。這個過程是很慢,總體感覺就是網站很卡。
還應該注意到php.ini中的max_execution_time參數。當請求終止時,也會出現502錯誤的。
10、調整增大php 和Nginx 的backlog數
listen.backlog = 4096