Apache httpd 代理上的連接錯誤,但僅適用於某些虛擬主機
我在 CentOS 7 機器上設置了一個 Apache v2.4 反向代理,為多個虛擬主機提供請求;其中有 Atlassian 應用伺服器。
proxy的私網IP地址為10.0.0.77,公網IP地址為77.77.77.77,若干DNS A記錄將公網IP映射到各種FQDN:
foo.example.com
、、bar.example.com
等。有一個 NAT:
77.77.77.77:10080 -> 10.0.0.77:80 77.77.77.77:10443 -> 10.0.0.77:443
這是必要的,因為代理的公共 IP 地址也用於其他服務。設置與其他問題相同。
下面是虛擬主機配置的範例(簡化)
/etc/httpd/conf.d/foo.conf
,:<VirtualHost *:80> ServerName foo.example.com ProxyRequests Off ProxyPreserveHost Off SetEnv proxy-nokeepalive 1 Redirect "/" "https://foo.example.com:10443/" </VirtualHost> <VirtualHost *:443> ServerName foo.example.com ServerSignature On <Proxy *> Order deny,allow Allow from all </Proxy> SSLEngine On SSLProtocol ALL -SSLv2 -SSLv3 SSLHonorCipherOrder on # SSLCipherSuite shortened here for simplicity SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384" SSLCertificateFile /etc/httpd/ssl/proxy.crt SSLCertificateKeyFile /etc/httpd/ssl/proxy.key SSLCACertificateFile /etc/httpd/ssl/proxy.ca.crt ProxyRequests Off ProxyPreserveHost On ProxyPass "/" "http://foo.example.com:8080/" ProxyPassReverse "/" "http://foo.example.com:8080/" </VirtualHost>
此配置適用於兩台 Jira 伺服器、一台 Stash 伺服器、一台 Confluence v6.10 伺服器和其他幾台伺服器。但是,Web 瀏覽器無法載入代理的 Bamboo v6.4 伺服器虛擬主機和 Question2Answer 平台。
在 Firefox 上,報告的錯誤是
NS_ERROR_NET_TIMEOUT
. 在 IE 上,錯誤是:出現臨時 DNS 錯誤。嘗試刷新頁面。
錯誤程式碼:INET_E_RESOURCE_NOT_FOUND
在每個失敗的虛擬主機的 httpd 訪問日誌中,沒有任何內容,甚至沒有
LogLevel trace8
,因此顯然該請求甚至沒有命中代理。我可以從代理通過 curl 訪問 Bamboo(
-L
需要一個標誌,因為 Bamboo 服務於 302):[root@proxy]# curl -XGET http://bamboo.example.com:8085/ [root@proxy]# curl -v -XGET http://bamboo.example.com:8085/ * About to connect() to bamboo.example.com port 8085 (#0) * Trying 10.0.0.11... * Connected to bamboo.example.com (10.0.0.11) port 8085 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.29.0 > Host: bamboo.example.com:8085 > Accept: */* > < HTTP/1.1 302 Found < Server: Apache-Coyote/1.1 < X-ASEN: SEN-4619603 < X-Frame-Options: SAMEORIGIN < X-Content-Type-Options: nosniff < Vary: Accept-Encoding < Set-Cookie: JSESSIONID=E4D13B8AD7D4D172F4E5F834D1E89710; Path=/; Secure; HttpOnly < Cache-Control: no-store < Location: /userlogin!doDefault.action?os_destination=%2Fstart.action < Content-Language: en-US < Content-Length: 0 < Date: Mon, 01 Oct 2018 15:06:19 GMT < * Connection #0 to host bamboo.example.com left intact [root@proxy]# curl -L -XGET http://bamboo.example.com:8085/ <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Log in as a Bamboo user</title> <meta http-equiv="X-UA-Compatible" content="IE=EDGE" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="-1" /> <meta name="application-name" content="Bamboo" /> (...)
目標伺服器上的防火牆從伺服器到代理是開放的(請注意,Atlassian 應用程序在非標準埠上執行,例如 Jira 在 TCP/8080 上提供內容)。
我很困惑,因為幾乎所有其他虛擬主機都可以完美執行。我還仔細檢查了 URL 路徑,它是正確的。
- 這個問題的原因可能是什麼?
- 有沒有辦法以更好的方式跟踪 HTTP 請求?我現在使用 Firefox 的附加 HTTP Header Live,我想找到一些更複雜的工具。
IE 報告的錯誤提示了我。失敗的虛擬主機的 DNS A 記錄不指向代理伺服器,而是指向伺服器的私有 IP。
我沒有早點發現問題,因為 Firefox 只報告了一個通用超時。
如果問題出在配置中,您應該能夠在 Apache 錯誤日誌中看到失敗請求的某些內容。通常它們位於
/var/log/apache2/error.log
或相似的地方。那裡的超時將表明無法訪問配置中的後端伺服器。由於您可以使用 curl 訪問它,因此可能是配置問題。如果那裡沒有任何內容或您正在發出的請求的訪問日誌(在同一位置),那麼它們可能一開始就沒有到達代理。我會檢查bamboo.example.com 的DNS 配置是否正確,並按預期指向您的代理。
您可以使用
curl
從外部訪問代理以更詳細地查看正在發生的事情。嘗試dig
或nslookup
首先檢查名稱是否解析為您期望的 IP。我的猜測是客戶端->代理之間的問題,因為如果代理->後端超時,您可能會在瀏覽器中收到 504 錯誤程式碼。