Apache httpd 代理上的连接错误,但仅限于某些虚拟主机

Apache httpd 代理上的连接错误,但仅限于某些虚拟主机

我在 CentOS 7 机器上设置了 Apache v2.4 反向代理,为多个虚拟主机提供请求;其中有 Atlassian 应用程序服务器。

代理的私有 IP 地址是 10.0.0.77,其公共 IP 地址是 77.77.77.77,多个 DNS A 记录将公共 IP 映射到各种 FQDN:foo.example.combar.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,我想找到一些更复杂的工具。

答案1

如果问题出在配置中,您应该能够在 Apache 错误日志中看到失败请求的内容。通常他们在/var/log/apache2/error.log类似的地方或某个地方。超时表明无法到达配置中的后端服务器。由于您可以使用curl 到达它,因此这可能是一个配置问题。

如果其中没有任何内容或您发出的请求的访问日志(在同一位置),那么它们可能一开始就没有到达代理。我会检查bamboo.example.com 的 DNS 配置是否正确,并按预期指向您的代理。

您可以使用curl外部访问代理来更详细地查看发生的情况。尝试dignslookup首先检查名称是否解析为您期望的 IP。

我的猜测是客户端 -> 代理之间存在问题,因为如果代理 -> 后端超时,您可能会在浏览器中收到 504 错误代码。

答案2

IE 报告的错误给了我提示。失败虚拟主机的 DNS A 记录不指向代理服务器,而是指向服务器的私有 IP。

我没有更快地发现问题,因为 Firefox 只报告了一般超时。

相关内容