使用 mod_proxy 時如何正確增加 Apache 的超時時間
背景:
我有機器對機器的通信系統,客戶端不時向Apache伺服器發送數據。由於使用移動 2G 進行通信,因此通信速度很慢。Apache 使用 mod_wsgi(用於 Django)。
由於客戶端在開始通信時不知道實際數據量,因此客戶端和伺服器之間使用分塊傳輸編碼。因為 mod_wsgi 不支持分塊傳輸編碼,所以我使用 mod_proxy,它接收塊並將它們作為單個請求傳遞給 mod_wsgi,並在收到所有數據後添加內容長度資訊。
問題:
我將伺服器上的 Ubuntu 從 16.04 更新到 18.04,之後客戶端和伺服器之間的一些通信開始失敗。從 Apache 的 access.log 中,我可以看到,該伺服器使用“大”數據向客戶端響應 408。大意味著在這種情況下數據量需要大約 60 秒的時間進行傳輸。客戶端沒有任何變化。
我了解到,對於 Apache 2.4(我在伺服器的 Ubuntu 18.04 上擁有)TimeOut 是 60 秒,對於早期的 Apache 版本它是 300 秒。我想這是在“大”數據的情況下與新伺服器作業系統通信失敗的原因。
邊注:
我注意到啟用 mod_security 可以解決問題(沒有“大”數據的 408),但就在我禁用 mod_security 並重新啟動 Apache 時,408 返回圖片。security.conf 中沒有與超時相關的內容。
問題:
如何正確增加 TimeOut?
到目前為止嘗試過:
由於 Apache 真的不是我的核心能力,我一直在嘗試將 Timeout 增加到某些地方(也嘗試過 KeepAliveTimeout,即使我認為這不是正確的方法):
apache.conf 片段:
# # Timeout: The number of seconds before receives and sends time out. # Timeout 300 # # KeepAlive: Whether or not to allow persistent connections (more than # one request per connection). Set to "Off" to deactivate. # KeepAlive On # # MaxKeepAliveRequests: The maximum number of requests to allow # during a persistent connection. Set to 0 to allow an unlimited amount. # We recommend you leave this number high, for maximum performance. # MaxKeepAliveRequests 100 # # KeepAliveTimeout: Number of seconds to wait for the next request from the # same client on the same connection. # KeepAliveTimeout 300
example.com.conf 片段:
ProxyRequests Off ProxyTimeout 300 <Proxy http://example.com:81> Order deny,allow Allow from all </Proxy> <VirtualHost *:80> SetEnv proxy-sendcl 1 ProxyPass / http://example.com:81/ connectiontimeout=300 timeout=300 ProxyTimeout 300 ProxyPassReverse / http://example.com:81/ ProxyPreserveHost On ProxyVia Full <Directory proxy:*> Order deny,allow Allow from all </Directory> </VirtualHost> Listen 81 <VirtualHost *:81> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. ServerName example.com
您確定 408 錯誤是由於 Apache 處理請求的時間過長嗎?
HTTP 408 是“請求超時”。它發生在客戶端連接但在超時觸發之前未發送任何數據時。您可以使用 ReqTimeout 模組 ( https://httpd.apache.org/docs/2.4/mod/mod_reqtimeout.html ) 來增加接收請求之前的超時時間。請記住,通過增加超時,您將有更多的 apache 程序忙於等待客戶端丟棄或使用套接字。