Linux
源自 NATed 網路的會話的奇怪問題
我遇到了一個奇怪的 Apache 問題,即同一遠端網路上的兩台設備中的一台設備將在 60 秒時超時。通過將 TimeOut 設置為 120 秒,我已經能夠將其延長到兩分鐘,但第二台設備仍然失去與伺服器的連接。A 得到一個通用的“由於伺服器停止響應而無法打開頁面”(Safari)。
我的測試是在我的桌面和 iPad Pro 上傳入一個簡單的頁面(僅列印日期的 php 腳本)。我正好等了 60 秒,然後刷新 iPad,我得到了錯誤。這個結果可以在許多最終使用者網路上複製。
我的第一個想法是 Apache 需要為遠端網路上的每個實體維護一個會話,因為 Apache 會看到它們來自同一個 IP,但是 mod_session 沒有任何效果。
目標伺服器是執行 Centos 7、Apache 2.4(完全修補)和 PHP 5.6.4 的 AWS 實例。(我知道,有一個更新到 PHP 7.X 的項目正在進行中)。
我會注意到這在執行 Apache 2.2 的 Centos 6 伺服器上沒有發生,並且現有環境只有 4 個或更少的使用者,因為它是一個開發環境。
任何幫助將不勝感激。
設置:
httpd.conf:
超時 300
KeepAlive On
前叉設置:
StartServers 8<br> MinSpareServers 5<br> MaxSpareServers 20<br> ServerLimit 256<br> MaxClients 256<br> MaxRequestsPerChild 4000<br> MaxConnectionsPerChild 0<br>
一些附加說明:這似乎只發生在 PHP 文件中,即使是那些只包含文本的文件。
對於那些可能偶然發現相同症狀的人:問題是從舊版本的作業系統帶來的核心設置。
“net.ipv4.tcp_tw_recycle=1”已設置,但不應該設置。命令
"sysctl net.ipv4.tcp_tw_recycle=0"
解決了一切。如果您遇到同樣的問題,只需執行該命令並立即查看結果。
如果您需要還原,只需執行:
"sysctl net.ipv4.tcp_tw_recycle=1"
撤銷。當然,將其添加到 /etc/sysctl.conf 文件將使其永久更改。
希望這在某些時候對某人有所幫助。