Nginx 服务器可以用 IP 来工作,但是不能用任意域名来工作

Nginx 服务器可以用 IP 来工作,但是不能用任意域名来工作

我有一台装有 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;
        }
} 

相关内容