Apache-2.2

TCP 443 連接進入伺服器但從未到達 Apache2(乘客)

  • December 21, 2013

當外部伺服器嘗試通過 Apache2+Passenger 和 Rails 應用程序埠 443(TCP) 連接到我們的網站時,我們遇到了一些奇怪的問題。這個問題很少發生。我開始通過使用啟用 iptables 日誌記錄來調查這iptables -I INPUT -m state --state NEW,INVALID -j LOG --log-prefix "iptables [INPUT]: "一點(對於 FORWARD (通常不使用)和 OUTPUT 也是這樣做的)。

現在每個新連接都記錄到系統日誌中。現在我在該系統日誌上看到了正常連接,然後連接到 Vhost(正常工作請求),但有時(大約 100 個連接中的 1 個)我只在 iptables 日誌中看到新連接,但連接似乎沒有到達 apache2(或乘客實例)(沒有 apache 日誌條目,也沒有連接結果)。使用 curl 執行此操作時,我們會收到超時或空字元串。我們剛剛發送了一個啟用調試的 curl 請求程式碼片段,用於增強記錄 curl 錯誤的樣子。

我們正在使用在 VMWare ESXi 環境中執行的 Debian Squeeze(穩定版),該環境帶有帶有 E1000 NIC(虛擬化)的橋接乙太網。但是當數據包到達 VM-OS 本身時,我認為這不會導致問題。

我還檢查了 ip_conntrack,它有大約 40 到 50 個連接,Squeezes Limit 大約是 65k,所以這不是問題。此外,我們在 NIC 本身上沒有任何丟棄的包。

核心版本:Linux 伺服器名稱 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64 GNU/Linux Apache2:伺服器版本:Apache/2.2.16 (Debian) - 伺服器建構時間:2012 年 11 月 30 日08:58:38 乘客:Phusion 乘客版本 3.0.12 Ruby:RVM 1.17.9 + Ruby 1.9.3-p362

iptables -L

Chain INPUT (policy ACCEPT) target prot opt source destination

LOG all – 任何地方任何地方狀態無效,新日誌級別警告前綴`iptables

$$ INPUT $$: ' Chain FORWARD (policy ACCEPT) target prot opt source destination

LOG all – 任何地方任何地方狀態無效,新日誌級別警告前綴`iptables

$$ FORWARD $$: ' Chain OUTPUT (policy ACCEPT) target prot opt source destination

LOG all – 任何地方任何地方狀態 INVALID,NEW LOG 級別警告前綴iptables [OUTPUT]: '

我對此沒有真正的“答案”,但也許有一種方法可以讓您進一步追踪它。問題似乎發生在核心空間中,就在 iptables 連結之後或使用者空間中,當 apache 接受連接時或之前。

由於數據包擷取成本的負載,核心可以在 nic 和 iptables 之後自行丟棄數據包。您是否曾經建構過沒有 iptables 的測試環境以及可以在 apache 日誌中計算的已定義訪問次數?

如果你有一些 C 經驗,你應該試試 libpcap,這是一個很好的庫,可以做壞事和好事。這是一篇很好的入門文章:http ://recursos.aldabaknocking.com/libpcapHakin9LuisMartinGarcia.pdf

這可能會向您顯示通過的數據包和將被丟棄的數據包的差異。

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