解決nginx 504 Gateway Time-out的一些方法

在CentOS下配置lnmp組合基本上用的都是一樣的配置文件,一直都沒出現過問題,可最近在一個vps上安裝一樣的環境以後,網站在線10多人就出 現了打開速度很是緩慢的狀況,有好幾回都是直接達到了nginx中設置的腳本最大超時時間300秒,結果致使nginx往客戶端瀏覽器發送了一個504 Gateway Time-out的錯誤代碼,分析了以後改動了幾處配置文件,終於避免了該狀況的出現。
  

  從 錯誤代碼基本能夠肯定跟nginx自己無關,主要是提交給php-fpm的請求未能正確反饋而致使,通常狀況下,提交動態請求的時候,nginx會直接把 請求轉交給php-fpm,而php-fpm再分配php-cgi進程來處理相關的請求,以後再依次返回,最後由nginx把結果反饋給客戶端瀏覽器,但 我這個vps目前跑的是個純php應用內容,實際上用戶全部的請求都是php請求,有的耗費時間比較久,php-cgi進程就一直都被用滿,而php- fpm自己的配置文件只打開了10組php-cgi進程,這樣的話在線用戶稍微多的話就會致使請求沒法被正常處理而出錯。
  
  大概分析出了原 因,下面作就比較容易了,首先是更改php-fpm的幾處配置:
  
  把max_children由以前的10改成如今的30,這樣就能夠保證 有充足的php-cgi進程能夠被使用;
  把request_terminate_timeout由以前的0s改成60s,這樣php-cgi進程 處理腳本的超時時間就是60秒,能夠防止進程都被掛起,提升利用效率。
  
  接着再更改nginx的幾個配置項,減小FastCGI的請求次 數,儘可能維持buffers不變:
  

  fastcgi_buffers由 4 64k 改成 2 256k;
  fastcgi_buffer_size 由 64k 改成 128K;
  fastcgi_busy_buffers_size 由 128K 改成 256K;
  fastcgi_temp_file_write_size 由 128K 改成 256K。
  
  好了,從新加載php-fpm和nginx的配置,再次測試,至今兩週時間內沒有再出現504 Gateway Time-out的狀況,算是達到效果了。

  另外,php-fpm的默認靜態處理方式會使得php-cgi的進程長期佔用內存而沒法釋放,這也是致使nginx出錯的緣由之一,所以能夠將php-fpm的處理方式改爲apache模式。
  <value name=」style」>apache-like</value>
  從更改完畢到如今的測試代表上述方式的效果仍是很明顯的,並無發現一次Nginx502 bad gateway或504 Gateway Time-out錯誤。固然,若是你的VPS或者服務器的性能足夠好能夠根據具體狀況沒必要作無謂的改動。php

 

 

 

 

二. 狀態碼解釋
502 Bad Gateway:做爲網關或者代理工做的服務器嘗試執行請求時,從上游服務器接收到無效的響應。
504 Gateway Time-out:做爲網關或者代理工做的服務器嘗試執行請求時,未能及時從上游服務器(URI標識出的服務器,例如HTTP、FTP、LDAP)或者輔助服務器(例如DNS)收到響應。html

三. 502 Bad Gateway緣由分析
將請求提交給網關如php-fpm執行,可是因爲某些緣由沒有執行完畢致使php-fpm進程終止執行。說到此,這個問題就很明瞭了,與網關服務如php-fpm的配置有關了。
php-fpm.conf配置文件中有兩個參數就須要你考慮到,分別是max_children和request_terminate_timeout。
max_children最大子進程數,在高併發請求下,達到php-fpm最大響應數,後續的請求就會出現502錯誤的。能夠經過netstat命令來查看當前鏈接數。
request_terminate_timeout設置單個請求的超時終止時間。還應該注意到php.ini中的max_execution_time參數。當請求終止時,也會出現502錯誤的。
當積累了大量的php請求,你重啓php-fpm釋放資源,但一兩分鐘不到,502又再次呈現,這是什麼緣由致使的呢? 這時還應該考慮到數據庫,查看下數據庫進程是否有大量的locked進程,數據庫死鎖致使超時,前端終止了繼續請求,可是SQL語句還在等待釋放鎖,這時就要重啓數據庫服務了或kill掉死鎖SQL進程了。
對於長時間的請求能夠考慮使用異步方式,能夠參閱《關於PHP實現異步操做的研究》。前端

四. 504 Gateway Time-out緣由分析
504錯誤通常是與nginx.conf配置有關了。主要與如下幾個參數有關:fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout、fastcgi_buffer_size、fastcgi_buffers、fastcgi_busy_buffers_size、fastcgi_temp_file_write_size、fastcgi_intercept_errors。特別是前三個超時時間。若是fastcgi緩衝區過小會致使fastcgi進程被掛起從而演變爲504錯誤。nginx

五. 小結
總而言之,502錯誤主要從四個方向入手:
1. max_children
2. request_terminate_timeout、max_execution_time
3. 數據庫
4. 網關服務是否啓動如php-fpm數據庫

504錯誤主要查看nginx.conf關於網關如fastcgi的配置。apache

相關文章
相關標籤/搜索