Apache-2.4

使用 mod_proxy 時如何正確增加 Apache 的超時時間

  • December 7, 2020

背景:

我有機器對機器的通信系統,客戶端不時向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 程序忙於等待客戶端丟棄或使用套接字。

引用自:https://serverfault.com/questions/1041082