Apache 反向代理间歇性错误 113 - 没有到主机的路由

Apache 反向代理间歇性错误 113 - 没有到主机的路由

我在 CentOS 4 上有一个 Apache 2.0.52 服务器,它前端是几个应用服务器(Jetty 和 Tomcat 的混合)。Apache 有一些虚拟主机配置如下:

<VirtualHost www1.example.com:443>
    ServerName www1.example.com
    DocumentRoot "/mnt/app_web/html"

    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
    SSLCertificateFile      /etc/httpd/conf/ssl.crt/server.crt
    SSLCertificateChainFile /etc/httpd/conf/ssl.crt/chain.crt
    SSLCertificateKeyFile   /etc/httpd/conf/ssl.key/server.key
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

    RewriteEngine on
    RewriteRule ^/app1/(.*)$ http://app1.example.com:8080/app1/$1 [P,L]
    RewriteRule ^/app2/(.*)$ http://app2.example.com:8080/app2/$1 [P,L]
</VirtualHost>

但是,我间歇性地在日志中收到以下错误:

[Fri Dec 04 07:19:41 2009] [error] (113)No route to host: proxy: HTTP: attempt to connect to 10.0.0.1:8080 (app1.example.com) failed

我最初尝试关闭 IPv6,这似乎很大程度上解决了这个问题,但我仍然会不时收到这些消息。

此外,我们在同一前端运行 memcache,当我在 Apache 日志中收到这些消息时,以下命令不起作用:

echo stats | nc 127.0.0.1 11211

没有打印任何消息,但也没有打印任何统计信息。我完全不知道如何继续排除故障。=(

答案1

要解决此问题,您需要在应用服务器的“iptables”中添加规则。对于 Red Hat Enterprise,文件为“/etc/sysconfig/iptables”。对于 CentOS 应该相同。

您可能有一条或多条规则接受来自前端的新连接,如下所示:

-A RH-Firewall-1-INPUT -m 状态 --状态 NEW -m tcp -p tcp -s“前端的 IP”--dport‘端口号’-j 接受

或者

-A RH-Firewall-1-INPUT -m 状态 --状态 NEW -m 多端口 -m tcp -p tcp -s“前端的 IP”--dports'端口号'-j 接受

您的问题应该通过添加规则来解决,这些规则为每个通过前面规则的 SYN 数据包向前端发送 tcp-reset。规则应该如下所示:

-A RH-防火墙-1-输入-m tcp -p tcp -s“前端的 IP”--dport‘端口号’–syn -j REJECT –reject-with tcp-reset

或者

-A RH-Firewall-1-INPUT -m 多端口 -m tcp -p tcp -s“前端的 IP”--dports'端口号'–syn -j REJECT –reject-with tcp-reset

在“iptables”末尾附近的规则之前添加如下规则:

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

祝你好运。

保罗

答案2

我在 CentOS 6.5 和 Apache 2.2 上遇到了这个问题 (113 - 没有到主机的路由),尽管它只是间歇性的 - 大约每 20 分钟一次。我怀疑它与您的问题无关,但这可能对某些人有帮助。

我使用 Wireshark 捕获了两端的网络流量,发现应用服务器有时会返回 ICMP 主机管理禁止的数据包来响应来自反向代理的 SYN 数据包。但是,大多数时候 SYN 都被接受了。

根据 Paul 的回答,我检查了 iptables 规则 - 确实,规则当然可以接受端口 8009 上的新连接。

我决定使用以下命令重置 iptables:

service iptables restart

重新启动 iptables 后,“113 - 没有到主机的路由”问题已完全消失。

相关内容