我想向你展示一些非常奇怪的事情,是在装有 Apache 的 Centos7 服务器上发现的httpd
:
如果我从同一台机器访问一个域,我将获得正确的虚拟主机的服务:
wget http://foo-test.cloud -O -
-> Welcome in Foo Test.cloud!
无论如何,如果我从 WAN 访问同一个域,我就会受到错误的虚拟主机的服务:
wget http://foo-test.cloud -O -
-> Welcome in awesome.com!
这是 Apache 从我的配置文件中理解的内容(的输出httpd -S
):
# httpd -S
VirtualHost configuration:
*:80 is a NameVirtualHost
default server ewm-dummy-default
port 80 namevhost dummy-default
port 80 namevhost awesome.com
port 80 namevhost foo-test.cloud
如您所见,奇怪的是域名是正确的,并且默认网站不是这些域名之一。
到底是什么呢?我愿意接受任何建议。
笔记:
- 从本地主机访问时,服务器将打印访问日志行
- 从互联网访问时,服务器不会打印任何日志行
补充笔记:
- 我进行了测试
tcpdump
,在两种情况下我都能够看到对端口 80 的传入请求。两者都具有正确的Host:
HTTP 标头。 - 我看到的过程在
httpd
聆听:::80
netstat
任何想法?
谢谢你!
答案1
如果你遇到这种奇怪的情况:
tcpdump
查看端口上的传入连接:80
,没有遗漏任何内容- Apache 正在监听端口
:80
大量日志一些传入请求
请检查您的iptables
规则。就我而言,我遇到了这种情况:
# iptables -t nat -L -n -v
3418 150K REDIRECT tcp -- eth0 * 0.0.0.0/0 10.0.1.4 tcp dpt:80 redir ports 8080
因此,似乎在此 Web 服务器(即10.0.1.4
)上设置了一个低级旧式端口转发,从一个端口:80
到另一个端口:8080
,以公开 Tomcat Web 服务器。删除该旧式 iptable 规则可解决该问题。
这就是 Apache 没有记录某些内容的原因:Apache 有时无法通过其端口访问。
故障排除可能并不容易,因为 Apache 的目的通常是充当其他内部 Web 服务器的前端 Web 服务器,因此您可能无法仅从响应主体中区分一个 Web 服务器与另一个 Web 服务器,因为它们的响应有时应该是相同的。
还要注意,来自 localhost 的连接可能来自与::1
该 iptables 规则不匹配的 IPv6 环回接口 ()。这就是行为不同的原因。
希望这可能对其他人有用,以节省解决非常奇怪的问题的时间,简短的回答是:查看遗留的 iptable 规则。