本文介紹nginx出現504 Gateway Time-out問題的原因,分析問題並提供解決方法。
1.問題分析
nginx訪問出現504 Gateway Time-out,一般是由於程序執行時間過長導致響應超時,例如程序需要執行90秒,而nginx最大響應等待時間為30秒,這樣就會出現超時。
通常有以下幾種情況導致
1.程序在處理大量數據,導致等待超時。
2.程序中調用外部請求,而外部請求響應超時。
3.連接數據庫失敗而沒有停止,死循環重新連。
出現這種情況,我們可以先優化程序,縮短執行時間。另一方面,可以調大nginx超時限制的參數,使程序可以正常執行。
對於訪問超時的設定,nginx與php都有相關的設置,可以逐一進行修改。
2.解決方法
nginx配置
nginx.conf中,設置以下幾個參數,增加超時時間
#修改Nginx配置: fastcgi_connect_timeout 1200s;#原設置為300s fastcgi_send_timeout 1200s;#原設置為300s fastcgi_read_timeout 1200s;#原設置為300s fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; 這里最主要的設置是前三條,即 fastcgi_connect_timeout #同 FastCGI 服務器的連接超時時間,默認值60秒,它不能超過75秒; fastcgi_send_timeout #Nginx 進程向 FastCGI 進程發送 request ,整個過程的超時時間,默認值60秒; fastcgi_read_timeout #FastCGI 進程向 Nginx 進程發送 response ,整個過程的超時時間,默認值60秒;
php配置
php.ini
max_execution_time php腳本最大執行時間 display_errors = on memory_limit = 256M
php-fpm
request_terminate_timeout
設置單個請求的超時時間
php程序中可加入set_time_limit(seconds)設置最長執行時間
例如 set_time_limit(0) 表示不超時。