nginx+FastCGI到底是誰影響逾時時間

來源:互聯網
上載者:User

標籤:逾時   nginx php fastcgi   

需求:

一個php程式要跑一段時間,但是時間不確定。

問題:    

當該php程式運行超過一段時間被強制中斷連線。

PHP本身逾時處理

在 php.ini 中,有一個參數 max_execution_time 可以設定 PHP 指令碼的最大執行時間,但是,在 php-cgi(php-fpm) 中,該參數不會起效。真正能夠控制 PHP 指令碼最大執行時:

 

<value name="request_terminate_timeout">0s</value>  

 

就是說如果是使用 mod_php5.so 的模式運行 max_execution_time 是會生效的,但是如果是php-fpm模式中運行時不生效的。

max_execution_time

計算的只是PHP指令碼本身執行的時間,執行之外的時間都不會計算在內。哪些屬於執行之外的時間呢?包含sleep、資料互動、socket互動等等。 

request_terminate_timeout = 0  即為不受時間控制,永不逾時


request_terminate_timeout引起的資源問題

request_terminate_timeout的值如果設定為0或者過長的時間,可能會引起file_get_contents的資源問題。

如果file_get_contents請求的遠端資源如果反應過慢,file_get_contents就會一直卡在那裡不會逾時。我們知道php.ini 裡面max_execution_time 可以設定 PHP 指令碼的最大執行時間,但是,在 php-cgi(php-fpm) 中,該參數不會起效。真正能夠控制 PHP 指令碼最大執行時間的是 php-fpm.conf 設定檔中的request_terminate_timeout參數。

request_terminate_timeout預設值為 0 秒,也就是說,PHP 指令碼會一直執行下去。這樣,當所有的 php-cgi 進程都卡在 file_get_contents() 函數時,這台 Nginx+PHP 的 WebServer 已經無法再處理新的 PHP 請求了,Nginx 將給使用者返回“502 Bad Gateway”。修改該參數,設定一個 PHP 指令碼最大執行時間是必要的,但是,治標不治本。例如改成 30s,如果發生 file_get_contents() 擷取網頁內容較慢的情況,這就意味著 150 個 php-cgi 進程,每秒鐘只能處理 5 個請求,WebServer 同樣很難避免”502 Bad Gateway”。解決辦法是request_terminate_timeout設定為10s或者一個合理的值,或者給file_get_contents加一個逾時參數

如果常有請求逾時,請開啟php-fpm的慢日誌,通過日誌來確認評估逾時時間。

Ngnix中的fastcgi 請求時間控制

fastcgi_connect_timeout

文法:fastcgi_connect_timeout time 

預設值:fastcgi_connect_timeout 60 

使用欄位:http, server, location 

指定同FastCGI伺服器的連線逾時時間,這個值不能超過75秒。

fastcgi_read_timeout

文法:fastcgi_read_timeout time 

預設值:fastcgi_read_timeout 60 

使用欄位:http, server, location 

前端FastCGI伺服器的響應逾時時間,如果有一些直到它們運行完才有輸出的長時間啟動並執行FastCGI進程,或者在錯誤記錄檔中出現前端伺服器響應逾時錯誤,可能需要調整這個值。

fastcgi_send_timeout

文法:fastcgi_send_timeout time 

預設值:fastcgi_send_timeout 60 

使用欄位:http, server, location 

指令為上遊伺服器設定等待一個FastCGI進程的傳送資料時間,如果有一些直到它們運行完才有輸出的長時間啟動並執行FastCGI進程,那麼可以修改這個值,如果你在上有伺服器的error log裡面發現一些逾時錯誤,那麼可以恰當的增加這個值。

指令指定請求伺服器的逾時時間,指完成了2次握手的串連,而不是完整的串連,如果在這期間用戶端沒有進行資料傳遞,那麼伺服器將關閉這個串連。

在nginx+FastCGI 配置測試中

其中在request_terminate_timeout設定為永不逾時的情況下,nginx中fastcgi_read_timeout 的設定時間將影響到最終的逾時時間。

測試中,如果是php-fpm中的逾時

將顯示 502 Bad Gateway

<html>

<head><title>502 Bad Gateway</title></head>

<body bgcolor="white">

<center><h1>502 Bad Gateway</h1></center>

<hr><center>nginx</center>

</body>

</html>

如果是nginx中cgi配置逾時

將顯示 504 Gateway Time-out

<html>

<head><title>504 Gateway Time-out</title></head>

<body bgcolor="white">

<center><h1>504 Gateway Time-out</h1></center>

<hr><center>nginx</center>

</body>

</html>

本文出自 “章小魚兒_linux” 部落格,請務必保留此出處http://zhangxylinux.blog.51cto.com/5041623/1543035

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.