我正在使用 digital ocean droplet(Ubuntu 14.04.2 LTS(GNU/Linux 3.13.0-52-generic x86_64))来托管 jira 和 confluence。它们在同一个 ip 上启动,但端口不同。我想使用 jira.team.domain.com 和 confluence.team.domain.com 访问它们,所以我选择了反向代理解决方案,使用 apache 2.4.7。
一切进展顺利,我让它们运行得非常快。问题是,几天后,在一段时间内,反向代理无法工作,我在浏览器中收到“主机名未解析”的信息。我检查了一下,jira 和 confluence 应用程序可以在 ip:port 地址(端口 8081 和 8091)上访问。过了一段时间,不知道具体多久,它又开始工作了。
设置如下:
Jira server.xml 包含两个连接器:
<Connector port="8080"
maxThreads="150"
minSpareThreads="25"
connectionTimeout="20000"
enableLookups="false"
maxHttpHeaderSize="8192"
protocol="HTTP/1.1"
useBodyEncodingForURI="true"
redirectPort="8443"
acceptCount="100"
disableUploadTimeout="true"
proxyName="jira.team.domain.com"
proxyPort="80"/>
<Connector port="8081"
maxThreads="150"
minSpareThreads="25"
connectionTimeout="20000"
enableLookups="false"
maxHttpHeaderSize="8192"
protocol="HTTP/1.1"
useBodyEncodingForURI="true"
redirectPort="8443"
acceptCount="100"
disableUploadTimeout="true"/>
Confluence server.xml 还有 2 个连接器:
<Connector port="8091" connectionTimeout="20000" redirectPort="8443"
maxThreads="200" minSpareThreads="10"
enableLookups="false" acceptCount="10" debug="0" URIEncoding="UTF-8"
protocol="org.apache.coyote.http11.Http11NioProtocol" />
<Connector port="8090" connectionTimeout="20000" redirectPort="8443"
maxThreads="200" minSpareThreads="10"
enableLookups="false" acceptCount="10" debug="0" URIEncoding="UTF-8"
protocol="org.apache.coyote.http11.Http11NioProtocol"
proxyName="confluence.team.domain.com" proxyPort="80" />
并且 /etc/apache2/sites-enabled/000-default.conf 如下所示:
<VirtualHost *:*>
ServerName localhost
# DocumentRoot /var/www/html
<Proxy *>
Require all granted
</Proxy>
# ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://jira.team.domain.com:8080/
ProxyPassReverse / http://jira.team.domain.com:8080/
</VirtualHost>
<VirtualHost *:*>
ServerName confluence.team.domain.com
DocumentRoot /var/www/html
<Proxy *>
Require all granted
</Proxy>
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://confluence.team.domain.com:8090/
ProxyPassReverse / http://confluence.team.domain.com:8090/
</VirtualHost>
有人能帮我解决这个问题吗?
答案1
这听起来有点类似于我曾经遇到的反向代理 Atlassian 应用程序的问题,其特点是 Apache 出现间歇性问题,而 Tomcat 实例似乎一切正常。浏览器中的“主机名未解析”与此不符,所以可能不行,但你可以试一试。尝试一下不会有什么坏处。
如果 Apache 服务器本身偶尔在执行 DNS 查询时遇到问题,那么使用 hosts 文件可以很容易地解决。确保 fqdn 已分配/etc/hosts
给环回 (127.0.0.1) 或 JIRA/Confluence 正在监听的任何接口:
127.0.0.1 localhost jira.team.domain.com confluence.team.domain.com
如果将其分配给环回,则需要确保 JIRA 和 Confluence 正在监听环回接口(或所有接口)。
我见过几次的问题(通常向用户返回 503 错误)是 Apache 检测到后端存在某种问题。当它检测到时,默认情况下会后退 60 秒。这可能是一个有用的线索,表明 JIRA 和/或 Confluence 存在资源争用问题,因此不应忽略它,但每次后端出现问题时 60 秒的停机时间有点多。您可以通过在 ProxyPass 指令上配置重试参数来禁用此功能:
<VirtualHost *:*>
ServerName localhost
# DocumentRoot /var/www/html
<Proxy *>
Require all granted
</Proxy>
# ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://jira.team.domain.com:8080/ retry=0
ProxyPassReverse / http://jira.team.domain.com:8080/
</VirtualHost>
<VirtualHost *:*>
ServerName confluence.team.domain.com
DocumentRoot /var/www/html
<Proxy *>
Require all granted
</Proxy>
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://confluence.team.domain.com:8090/ retry=0
ProxyPassReverse / http://confluence.team.domain.com:8090/
</VirtualHost>
来自 mod_proxy 文档:
连接池工作器重试超时(以秒为单位)。如果后端服务器的连接池工作器处于错误状态,Apache httpd 将不会将任何请求转发到该服务器,直到超时到期。这可以关闭后端服务器进行维护,稍后再将其重新联机。值为 0 表示始终重试处于错误状态的工作器,没有超时。
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html
如果这不起作用,请尝试使用浏览器的开发人员工具来查看 Apache 返回了什么或没有返回什么以及设置了哪些标头。在按下刷新按钮的同时查看 Apache 日志tail -f /path/to/logs/goes/here
也没什么坏处。
答案2
您甚至不需要在 Apache conf 中的后端/代理部分使用主机名。只要您正确设置了“后端”的代理部分:
proxyName="jira.team.domain.com"
proxyPort="80"
... 或者如果是 https ...
proxyName="jira.team.domain.com"
scheme="https"
proxyPort="443"
和 confluence 的类似设置(正如您在问题中提到的,您已经为 http 做了选择)。因此 ProxyPass 可以轻松使用一个 IP:
<VirtualHost *:*>
ServerName jira.team.domain.com
...
ProxyPass / http://127.0.0.1:8080/
...
</VirtualHost>
<VirtualHost *:*>
ServerName confluence.team.domain.com
...
ProxyPass / http://127.0.0.1:8090/
...
</VirtualHost>
使用此设置,您只需要指向主机的 DNS 记录即可避免需要/etc/hosts客户端记录并更正服务器名称在 Apache 配置中正确匹配虚拟主机(你只有 localhost 用于 jira 定义)和适当的代理名称在 Atlassian 产品中获取正确的响应并将其发送回用户……
如果是这种设置,Apache 上甚至没有空间作为代理层进行 DNS 解析,所以我想说你绕过了你提到的问题 ;-)。