Apache 在區域網路上的其他電腦上比在本機上慢

Apache 在區域網路上的其他電腦上比在本機上慢

我有幾台電腦連接到網路。該網路內有一台託管 WAMP(Windows + Apache + PHP + MySQL)的伺服器。其上安裝有 Windows 7 x32 Pro。我可以從我的無線連接伺服器 ping 該伺服器,所有 ping 均為 1 毫秒。有趣的是,當我在伺服器本身上瀏覽我的 Web 應用程式時,它會在眨眼之間加載。我可以瀏覽子頁面,就像它們是我剛剛切換的圖像一樣。

然而在其他計算機上它的運作速度較慢。這並不悲慘,但明顯慢了一些。在某些情況下,瀏覽器會顯示“正在等待...”,這需要一兩秒鐘,這是最痛苦的。

我發現,當我透過遠端桌面連接時,在伺服器上使用應用程式比在任何其他電腦上使用要快得多。如果我能對他們產生同樣的效果那就太棒了。

當我查看 Chrome 中的開發人員控制台時,我可以看到:伺服器上的 DOMContentLoaded 大約為 400-600 毫秒,而在其他所有電腦上為 1400 毫秒。

在這種情況下我能做什麼?

答案1

Off確保在 Apache 中將HostnameLookups 設定為。

您說伺服器透過 WAMP(相當於 Windows 的 LAMP)設定來運行 Apache,對嗎?好吧,如果是這種情況,請開啟httpd.confapache2.conf(一切都取決於它在您的設定中的安裝方式;兩個檔案基本上相同)並尋找HostnameLookups其中的設定行。HostnameLookups預設設定為註釋Off中所解釋的,該註釋應位於HostnameLookups該檔案中設定的正上方;我的大膽強調是:

HostnameLookups:記錄客戶端名稱或僅記錄其 IP 位址,例如 www.apache.org(開啟)或 204.62.129.132(關閉)。預設值是關閉的,因為如果人們必須有意地打開此功能,那麼整體上對網路來說會更好,因為啟用它意味著每個客戶端請求將導致至少一個對名稱伺服器的查找請求。

還有Apache 官方文檔也進入更深入的細節;我再次大膽強調:

預設值為“關閉”,以便為那些實際上不需要完成反向查找的網站節省網路流量。這對於最終用戶來說也更好,因為他們不必承受查找帶來的額外延遲。負載較重的網站應關閉此指令,因為 DNS 查找可能需要相當長的時間。

不要將主機名稱用於Allow from/Deny from指令。

另外,您是否有任何使用 Apache Basic Auth 的目錄或指令? Apache 中可以設定的最簡單的密碼保護是什麼?我記得在某些情況下,與連接Allow fromAllow from localhost.註解掉Allow from localhost或將其設為然後Allow from 127.0.0.1 ::1重新啟動 Apache 將清除該問題。

正如中所解釋的Apache 官方文檔即使在/指令中HostnameLookups設定為Off使用完整主機名,也會觸發整個 DNS 查找鏈,從而降低存取速度;我的大膽強調是:Allow fromDeny from

名稱與該字串匹配或以該字串結尾的主機將被允許存取。僅符合完整的元件,因此上面的範例將符合 foo.apache.org,但不會符合 fooapache.org。此配置將導致 Apache 對客戶端 IP 位址執行雙重反向 DNS 查找,無論 HostnameLookups 指令的設定為何。它將對 IP 位址進行反向 DNS 查找以查找關聯的主機名,然後對主機名稱進行正向查找以確保其與原始 IP 位址相符。只有正向和反向DNS一致且主機名匹配才允許存取。

部落格文章也很好地解釋了這一點如果您想了解更多有關具有主機名稱(而不是原始 IP 位址)的項目如何因多次 DNS 查找而減慢 Apache 存取的詳細Allow from資訊:Deny from

然而,我最近遇到了一個情況,我們無意中在沒有明確啟用 HostnameLookups 的情況下做了同樣的事情。如何?透過根據遠端主機名稱限制存取!閱讀「A(部分)網域」部分下有關「Allow」指令的文件:

此配置將導致 Apache 對客戶端 IP 位址執行雙重反向 DNS 查找,無論 HostnameLookups 指令的設定為何。它將對 IP 位址進行反向 DNS 查找以查找關聯的主機名,然後對主機名稱進行正向查找以確保其與原始 IP 位址相符。只有正向和反向DNS一致且主機名匹配才允許存取。這是完全合理的,但使用以下內容可能會產生很大的意想不到的副作用:

Allow from .example.com

在我們的例子中,這是一個不太明顯的例子,根本沒有讓我們想到主機名稱:

Allow from localhost

這裡寫了 localhost,也許是為了節省一些精力,或者可能是為了增加清晰度,而不是寫出 127.0.0.1 (IPv4) 和 ::1 (IPv6)。從心理學上來說,很容易認為「localhost」是 127.0.0.1 和 ::1 的直接別名,以至於我們忘記了名稱「localhost」只是一個約定,需要像任何其他名稱一樣進行查找。熟悉MySQL 資料庫的人可能知道,它實際上為“localhost”一詞分配了特殊的令人困惑的含義,以建立UNIX 套接字連接,而不是到127.0.0.1 或系統上定義的任何“localhost”的TCP 連線!

您可能還認為查找 127.0.0.1 很快,因為它通常會對應到 /etc/hosts 中的「localhost」。確實如此,但不在 /etc/hosts 中的所有其他訪客都會獲得緩慢的 DNS PTR 查找!根據作業系統的不同,您可能會在/etc/hosts 中看到「ip6-localhost」或「ip6-loopback」(Debian 7、Ubuntu 12.04)、「localhost6」(RHEL 5/6、Fedora 19)或其他內容。因此,拼出地址很重要:

Allow from 127.0.0.1
Allow from ::1

這樣做會立即停止隱式 HostnameLookups 行為並加快網站速度。在這種情況下,這不是問題,因為它是一個私有的內部網站,任何未經防火牆允許的人根本無法訪問該網站,因此流量水平相對較低。這種存取控制是首先需要允許 localhost 的部分原因。但由於服務流量的放緩,這對公共生產系統來說會非常糟糕。

相關內容