![Apache 使用 proxytimeout 指令配置為代理程式傳回的 HTTP 狀態碼](https://rvso.com/image/1586926/Apache%20%E4%BD%BF%E7%94%A8%20proxytimeout%20%E6%8C%87%E4%BB%A4%E9%85%8D%E7%BD%AE%E7%82%BA%E4%BB%A3%E7%90%86%E7%A8%8B%E5%BC%8F%E5%82%B3%E5%9B%9E%E7%9A%84%20HTTP%20%E7%8B%80%E6%85%8B%E7%A2%BC.png)
我對 Apache Web 伺服器的行為有一個一般性問題,該伺服器配置為代理伺服器並具有指令代理超時出於測試目的設定為 1 秒。
我的後端(upsteam)伺服器是一個Python內建的HTTP伺服器,它故意等待超過1秒的時間來將回應傳送到代理伺服器(上面提到的Apache),並在收到請求後3秒發送它。
根據 Apache 官方文件(https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxytimeout)
代理應等待後端伺服器的回應指定的時間代理超時指令,如果沒有回應,它必須“返回超時”,據我所知,這是狀態代碼 504,因為該狀態代碼的規範說:
504 網關逾時 - 伺服器充當網關或代理,沒有收到上游伺服器的及時回應。
然而,當我向代理伺服器發送請求時,它會傳回錯誤代碼 502,這表示代理從上游伺服器收到無效回應。
所以我試著去理解為什麼會發生這種情況。當上游伺服器正常,只是因為逾時而無法回應伺服器時,為什麼狀態碼是 502 而不是 504?
Apache 的錯誤日誌正確告知:
[proxy_http:error] [pid 6040] (70007)The timeout specified has expired: [client 192.168.56.1:53331] AH01102: error reading status line from remote server 127.0.0.1:8080"
上游後端伺服器拋出BrokenPipeError ,我在異常中捕獲它並且不讓它崩潰,所以據我所知,這不應該是伺服器的錯誤,而是預期的行為,因為連接在1 秒後關閉,並且沒有地方可以發送它。
也許有人可以幫助我理解這種行為的原因和原因代理超時不會使 Apache 返回 504,根據文檔,這是合乎邏輯的?
先致謝!