我在 CentOS 7 机器上设置了 Apache v2.4 反向代理,为多个虚拟主机提供请求;其中有 Atlassian 应用程序服务器。
代理的私有 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,我想找到一些更复杂的工具。
答案1
如果问题出在配置中,您应该能够在 Apache 错误日志中看到失败请求的内容。通常他们在/var/log/apache2/error.log
类似的地方或某个地方。超时表明无法到达配置中的后端服务器。由于您可以使用curl 到达它,因此这可能是一个配置问题。
如果其中没有任何内容或您发出的请求的访问日志(在同一位置),那么它们可能一开始就没有到达代理。我会检查bamboo.example.com 的 DNS 配置是否正确,并按预期指向您的代理。
您可以使用curl
外部访问代理来更详细地查看发生的情况。尝试dig
或nslookup
首先检查名称是否解析为您期望的 IP。
我的猜测是客户端 -> 代理之间存在问题,因为如果代理 -> 后端超时,您可能会在浏览器中收到 504 错误代码。
答案2
IE 报告的错误给了我提示。失败虚拟主机的 DNS A 记录不指向代理服务器,而是指向服务器的私有 IP。
我没有更快地发现问题,因为 Firefox 只报告了一般超时。