apache 反向代理有时不工作

apache 反向代理有时不工作

我正在使用 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 解析,所以我想说你绕过了你提到的问题 ;-)。

相关内容