Centos

Apache httpd 代理上的連接錯誤,但僅適用於某些虛擬主機

  • October 5, 2018

我在 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從外部訪問代理以更詳細地查看正在發生的事情。嘗試dignslookup首先檢查名稱是否解析為您期望的 IP。

我的猜測是客戶端->代理之間的問題,因為如果代理->後端超時,您可能會在瀏覽器中收到 504 錯誤程式碼。

引用自:https://unix.stackexchange.com/questions/472085