![Nginx 服务器可以用 IP 来工作,但是不能用任意域名来工作](https://linux22.com/image/691673/Nginx%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%AF%E4%BB%A5%E7%94%A8%20IP%20%E6%9D%A5%E5%B7%A5%E4%BD%9C%EF%BC%8C%E4%BD%86%E6%98%AF%E4%B8%8D%E8%83%BD%E7%94%A8%E4%BB%BB%E6%84%8F%E5%9F%9F%E5%90%8D%E6%9D%A5%E5%B7%A5%E4%BD%9C.png)
我有一台装有 Ubuntu Server 14.04 和 LEMP 堆栈的主机,我打算将其用作我正在开发的 Web 应用程序的暂存/测试服务器。
我没有服务器的域名,使用 IP 地址就可以正常工作。但是,对于某些测试,我需要使用域名访问它。因此,我在本地计算机的 hosts 文件中添加了以下内容:
1.2.3.4 nt1.stg
这个问题里的IP明显不是我服务器的真实IP,只是我nt1.stg
当做域名来用的。
当我去时,http://1.2.3.4/path/to/script.php
我得到了预期的回应。
但http://nt1.stg/path/to/script.php
我得到了ERR_CONNECTION_RESET
。
我已经使用 Wireshark 验证了该请求是使用第二个地址时发送。Wireshark 捕获显示,随着请求的进行,发生了以下交换:
Me > Server: (TCP) [SYN]
Server > Me: (TCP) [ACK, SYN]
Me > Server: (TCP) [ACK]
Me > Server: (HTTP) GET /path/to/script.php HTTP/1.1
Server > Me: (TCP) [ACK]
Server > Me: (TCP) [RST, ACK]
这是我的 nginx 配置文件,其中我已经设置了 server_name,并且还有 default_server:
server {
listen 80 default_server;
server_name nt1.stg;
root /var/www/nt/app;
index index.php index.html;
access_log /var/log/nginx/access.log;
error_log /var/www/nt/nt1_data/logs/error.log;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
对于所提出的请求,没有任何错误或访问日志条目,nt1.stg
就好像从未收到过一样。
这可能是防火墙问题吗?应该如何排查?
更新
问题不在于提供了什么解决方案这个答案。我用 wget 检查了一下,也出现了同样的情况(IP 有效,但域名无效)。
更新 2
根据@TheFiddlerWins 的建议,我也将域名添加到服务器上的 hosts 文件中(两者都使用 127.0.0.1 和实际服务器 IP)。但这也没有解决问题。
更新 3
根据@drookie 的建议,我在服务器上执行了 tcpdump:
tcpdump -i eth0 -s 65535 -w dumpfile.pcap -Z root
开始捕获后,我向基于 IP 和基于名称的 URL 发出了请求。终止捕获后,摘要显示:
71 packets captured
72 packets received by filter
0 packets dropped by kernel
使用 Wireshark 检查转储,没有显示对基于名称的地址发出的请求的踪迹。尽管如此,在服务器捕获正在进行的同时进行本地捕获,显示了相同的结果——对基于名称的地址发出的请求是发送到正确的 IP 并建立 TCP 会话后,HTTP 请求是发送到服务器并得到确认,但随后服务器发送 TCP RST。
当 wireshark 告诉我这是发生的事情时,我应该得出结论,这确实发生了。如果服务器对此不负责,那么有人是。
我唯一的猜测是,流量通过数据中心代理透明地路由到我的服务器,该代理不喜欢请求标记的(任意)主机名不能解析为服务器 IP,因此丢弃 HTTP 请求。
这发生在 digitalocean droplet 上,我将开具一张支持票来确认这一点。
更新 4
我已经联系了支持人员,他们告诉我的是:
... 你的 droplet 肯定没有使用代理。所有 droplet 都直接连接到互联网
和
如果网络确认数据包到达了正确的主机,那么问题可能出在更高级别的防火墙/Web 服务器上。有任何应用程序响应崩溃的迹象吗?也许是某些配置问题,导致应用程序没有以与 IP 相同的方式由域传送?
我在这方面没有调试技能。我能想到的就是检查 syslog、iptables 规则以及 ufw 日志(如果有的话)。如果能提供任何关于我应该在哪里寻找迹象和嫌疑犯的指导,我将不胜感激。
答案1
为什么不为主机 nt1.stg 创建一个新的 conf 文件?这将很快让您知道它是 nginx 配置问题、网络问题还是其他问题。
server {
listen 80;
server_name nt1.stg;
root /var/www/nt/app;
index index.php index.html;
access_log /var/log/nginx/access.log;
error_log /var/www/nt/nt1_data/logs/error.log;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}