解決Nginx與php-fpm發生504 Gateway Time-out問題
會發生504 Gateway Time-out的問題,如果是非程式錯誤的情況下(例:無窮迴圈),通常是發生在有些需要長時間運算的頁面,這時我們的選擇就只有兩個,買更好的主機,或是延長504判斷的時間。
實際上,504的問題並不只會發生在Nginx+php-fpm的環境,任何伺服器環境都有可能發生,今天只是舉Nginx+php-fpm的設定檔修改為例子。
今天這個問題會在Nginx+php環境發生的原因,是因為php執行程式碼的時間預設是無限的,運算到結果出來為止;但Nginx不能無限的等下去,所以時間過長時,Nginx就告訴使用者"504″的錯誤。
因此我們今天可以對Nginx與php的設定參數進行適當的調整,讓這個錯誤在正常狀況下不會發生,影響網站的運作。
1.如果我們確定網站上的php程式碼不應該跑太久,例如說30秒,那我們可以設定php程式碼執行時間最長為30秒:
找到max_execution_time,取消註解並修改為30。
/etc/php5/fpm/php.ini
… max_execution_time = 30 ...
2.接下來請到nginx的網站設定檔中(一般來說位置在/etc/nginx/sites-available),例如我們今天修改一個叫abc.com.conf的設定檔:
取消註解或增加fastcgi_read_timeout設定為30。
/etc/nginx/site-available/abc.com.conf
… //請找到這個php設定的部份 location ~ .php$ { ... # With php5-cgi alone: #fastcgi_pass 127.0.0.1:9000; # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_read_timeout 30; ... } ...
3.這樣設定就完成了,之後重啟php-fpm與nginx載入新設定:
指令
service nginx restart service php-fpm restart
補充:
1.這兩個設定的時間(此次舉例為30秒),請視網站需要做調整,例如我的系統要運算報表可能會跑很久,那就該增加設定時間,防止報表還沒跑完就中斷顯示504;
2.建議這兩個時間設定為相同時間(此例為設定相同的30秒),因為設定沒有相同是沒有意義的,尤其是如果php > Nginx,php還沒跑完,Nginx就已經中斷並顯示504,這樣就看不到網頁結果了。
參考資源:
http://php.net/manual/en/info.configuration.php#ini.max-execution-time
http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_read_timeout
https://rtcamp.com/tutorials/php/increase-script-execution-time/
我要留言