我在CentOS 4上安装了Apache 2.0.52服务器,前端安装了几个App服务器(Jetty和Tomcat的混合)。 Apache有一些像这样configuration的虚拟主机:
<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
我最初试图closuresIPv6,这似乎在很大程度上治愈它,但我仍然零星的这些消息爆发。
另外,我们在同一个前端运行memcache,并且在Apache日志中收到这些消息的时候,下面的命令不起作用:
echo stats | nc 127.0.0.1 11211
没有消息打印,但打印的数据也不是。 我完全失去了如何解决这个问题。 =(
要解决这个问题,你需要在你的App服务器的'iptables'中添加规则。 对于Red Hat Enterprise,文件是'/ etc / sysconfig / iptables'。 CentOS应该是一样的。
你可能有一个或多个接受来自前端的NEW连接的规则,如下所示:
-A RH-Firewall-1-INPUT -m状态–state新-m tcp -p tcp -s '前端的IP'– dport '端口号' -j ACCEPT
要么
-A RH-Firewall-1-INPUT -m状态 – 状态新-m多端口-m tcp -p tcp -s '前端的IP ' – 端口'端口号' -j ACCEPT
你的问题应该通过添加规则,发送一个tcp-reset到通过前置规则的每个SYN数据包的前端。 规则应该看起来像这样:
-A RH-Firewall-1-INPUT -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 ' – 端口'端口号' –syn -j REJECT –reject-with tcp-reset
在规则如下所示之前,在“iptables”的末尾添加规则:
-A RH-Firewall-1-INPUT -j REJECT –reject-with icmp-host-prohibited
祝你好运。
保罗
我有这个问题(113 – 没有路由到主机)在CentOS 6.5与Apache 2.2,虽然它只是间歇性的 – 大约每20分钟。 我怀疑这是与你的问题有关,但这可能有助于某人。
我使用Wireshark捕获了两端的networkingstream量,并发现响应来自反向代理服务器的SYN数据包,App服务器有时会返回ICMP主机pipe理禁止的数据包。 但是,SYN的大部分时间都被接受。
基于Paul的回答,我检查了iptables的规则 – 实际上规则当然是可以接受8009端口上的NEW连接的。
我决定用命令重置iptables:
service iptables restart
重新启动iptables后,'113 – 没有路由到主机'的问题已经完全消失。