我在 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 - 没有到主机的路由”问题已完全消失。