我有一个Ubuntu Server 14.04的主机和一个LEMP堆栈,我打算用作我正在开发的Web应用程序的登台/testing服务器。
我没有服务器的域名,它可以正常使用IP地址。 但是,对于某些testing,我需要使用域名访问它。 所以我已经将下列内容添加到本地机器的主机文件中:
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 。
我已经使用Wiresharkvalidation了使用第二个地址时发送的请求。 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]
这是我的nginxconfiguration文件, 我在其中设置了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的请求没有错误或访问日志条目,就好像它从未收到过一样。
这可能是一个防火墙问题? 应该怎么调查呢?
更新
这个问题不是在这个答案中提供了一个解决scheme。 我用wget进行了检查,发生了同样的情况(与IP一起工作,不能和域一起工作)。
更新2
Per @ TheFiddlerWins的build议我也将域添加到服务器上的hosts文件(包括127.0.0.1和实际的服务器IP)。 这也没有解决这个问题。
更新3
Per @ drookie的build议我在服务器上做了一个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检查转储不会显示对基于名称的地址的请求。 尽pipe如此,本地捕获同时捕获服务器正在进行,显示了相同的旧结果 – 基于名称的地址的请求被发送到正确的IP,并build立了TCP会话,HTTP请求被发送到服务器和确认,但然后服务器发送一个TCP RST。
当wireshark告诉我这是发生了什么,我应该得出结论,确实发生。 如果服务器不负责,有人。
我唯一的猜测是,stream量通过一个数据中心代理透明地路由到我的服务器,它不喜欢这个请求被标记的(任意的)主机名不parsing到服务器IP的事实,因此丢弃了HTTP请求。
这是发生在一个digitalocean墨滴,我要打开支持票来证实这一点。
更新4
我已经伸出援手,这是他们告诉我的:
…你的液滴绝对不是一个代理的背后。 所有的水滴直接连接到互联网
和
如果networking确认数据包到达正确的主机,那么问题将出现在更高级别的防火墙/networking服务器上。 任何应用程序响应崩溃的迹象? 也许有一些configuration问题,应用程序没有像IP那样通过域来提交?
我在这方面没有debugging技能。 我能想到的是检查系统日志,iptables规则,如果有的话,ufw日志。 任何我应该寻找标志和嫌疑人的任何指导将不胜感激。
你为什么不为你的主机nt1.stg创build一个新的conf文件? 这将很快让你知道,如果它的Nginxconfiguration问题,networking问题或其他。
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; } }