Linux

沉睡的 apache 伺服器拒絕連接,但不是通過 localhost

  • June 26, 2012

我將適量的流量(大約 20 req/s)推送到在 Apache 伺服器上執行的簡單 PHP API。Apache 伺服器處於休眠狀態(mod_status 幾乎沒有註冊一個活動請求),但是,儘管如此,我還是看到“連接被拒絕”錯誤定期發生。我嘗試清盤uname -n and MinSpareServers,但沒有效果。

我在負載下執行了這樣的診斷腳本,我會看到大約十分之一的請求因“連接被拒絕”而失敗

while [ 1 ]; do echo "" | telnet <server> 80; sleep 1; done

但是,當在本地機器上執行類似的請求時,它很好。

while [ 1 ]; do echo "" | telnet localhost 80; sleep 1; done

最初我認為可能是所有請求都來自同一個客戶端,並且伺服器被限制了。但是,在負載下,所有其他嘗試連接的主機都會遇到相同的間歇性問題。

localhost 行為不同的事實向我表明這是一個網路問題,而不是 apache 問題,但我不確定在哪裡診斷這個問題。是否有日誌記錄我可以檢查/啟用以查看連接拒絕是否發生在 O/S(或可能是 iptables)級別。

相關軟體:

  • Ubuntu Lucid,2.6.33 核心
  • 阿帕奇 2.2.14

更新:

在我們的 iptables 配置中,我可以在“Chain TCPACCEPT”下看到以下規則:

655K 34M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x02 limit: avg 12/sec burst 24

似乎這個速率限制肯定會導致一些“連接被拒絕”錯誤。我可以在短時間內禁用防火牆,看看這是否能解決問題,但我認為這條規則是為了幫助應對 DOS 攻擊。目前限制對於 avg 和 Burst 來說似乎都太小了。什麼是更明智的限制(我可以在我們的 iptables 配置中調整這些限制)?

如果它定期發生,很可能不是 iptables,而是要查看您的 iptables 規則,執行

sudo iptables -L -n -v

您的 iptables 日誌將位於 /var/log 下,但可能會因您的配置而異。檢查 /etc/rsyslog.d 目錄下是否有您的 iptables 日誌位置的配置文件。

您還可以使用 netstat 或 lsof 來查看埠上發生的情況。

netstat -an | grep "80.*LIST"

lsof -i :80

最後,您可能想要進行網路擷取以查看是否有 TCP RST 被發回,或者根本沒有響應返回 - 為此使用 tcpdump。

更新問題更新:

如果禁用該 iptables 規則會發生什麼?它做了幾件事,但其中之一似乎是限制 tcp 段,這些段僅將 syn 數據包設置為 12/sec 平均值並具有突發限制。如果您發送的平均速度為 20/秒,我相信您超出了 iptables 規則中設置的限制。

因此,您可以在防火牆上關閉此規則以進行測試(我不建議完全關閉防火牆),或者您可以將其修改為 22/秒,突發 36。

在修改之前,我會強烈考慮修改您不熟悉或不確定它為什麼存在的配置。

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