测试机域名不能访问ip却可以访问

最近在给测试机101.200.217.41 发送请求的时候碰到了问题。测试机的日志配置如下:Nginx服务器级别的日志:dev_error.log ,dev_access.log ;  Yii框架日志: request.log;

当我给dev.elliss.cn发送请求的时候,除了dev_access.log有日志记录外,其他两个大多数情况下没反应。

l 在app端看,appserver发送一个Get请求,希望获取 cookie 保存下来,但是总是获取失败。这就导致后续的请求由于请求数据不完整而不能被服务器验证;

l 从浏览器测试看,访问dev.elliss.cn也有问题,提示“暂时不能访问,可能网站需要备案”;

l 利用cmd ping 服务器的域名 dev.elliss.cn 也有问题,丢包率100%

解决思路:从server端的三个日志文件入手。首先看error.log中记录信息:

 

PHP message: PHP Warning:  Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/home/ileberry/session) in Unknown on line 0" while reading upstream, client: 122.72.53.12, server: dev.elliss.cn, request: "POST /r HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "dev.elliss.cn"

错误信息提示:会话信息写入 /home/ileberry/session 失败,可能是访问权限的问题。这个是PHP给我们提示消息,从php.ini 初始化文件入手:

session.save_path = "/home/ileberry/session"

上面指定了会话信息保存的位置,为了让该文件夹不再“拒绝”被写入,把文件夹以及里边的文件权限都改成 777 。测试了一下,还是出错。

 

2015/10/22 15:10:56 [error] 1741#0: *169 connect() failed (111: Connection refused) while connecting to upstream, client: 116.216.8.36, server: dev.elliss.cn, request: "POST /l HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "dev.elliss.cn"

这是error.log中的另一条可能帮助我解决问题的日志,网友的解释是:

It sounds like you haven't started and configured backend for Nginx. Start php-fpm and add the following to nginx.conf, in http context:

我试着重启php-fpm ,在我关闭php-fpm 后,果然又冒出了好多条以上的报错,开启之后就再也没有报错,所以上面的报错确实是和php-fpm 没有开启有关,但是没有帮助我解决目前的问题。

 

Error.log是指望不上了,这些报错都是好几天前的,我重新发送请求,error.log中并没有任何记录。那request.log呢?

试着在PHP的入口文件index.php中打印日志:

ob_start();

print_r($_POST);

$output = ob_get_clean();

\Yii::info("--------------------test cjw ".$output,__METHOD__);

Request.log中确实看到了我的日志,说明请求确实是进入了Yii框架当中被PHP处理了,不过$_POST一直是空的~~~

 

Request.log里边可以得到的线索也很有限,因为它总是接收不到日志记录,在接收到的异常日志中看,发现少了cookiepost请求也没有带上csrfToken ,我感觉是什么东西导致了请求端与server端无法建立正常的会话。

最后只能从 dev_access.log 入手了,每一次请求这里都有记录:

120.204.205.187 - - [23/Oct/2015:14:27:39 +0800] "GET / HTTP/1.1" 499 0 dev.elliss.cn "-" "DNSPod-Monitor/2.0" "120.204.200.21" 0.002 - 

日志的格式定义是在 nginx.conf 中配置的,从上面的日志文件可以看出状态码是499 ,请求页面大小是 0,这是解决问题的关键。

从网上搜索了一下499 ,这是nginx 自定义的异常,出现的原因可能是服务器处理的时间过长,客户端主动关闭了连接。也有说这个问题是 nginx 认为该连接不安全,从而限制了连接。解决的办法就是:

配置参数 proxy_ignore_client_abort on;表示代理服务端不要主要主动关闭客户端连接。

尝试了一下,重启了nginx,还是不行。

最后,尝试用浏览器访问服务器,结果竟然成功了~~~ 开始怀疑可能客户端和server端都没有错,是中间的某个环节出错了。为了验证想法,打开cmd ping ip地址,ping通了~~~ 那为什么域名访问出错,而ip访问正确呢?

脑补了一下输入url到访问到网页之间后台都干嘛了(以facebook为例)?

 

v  在浏览器中输入网址

v 浏览器查找域名的IP地址,导航的第一步是通过访问的域名找出其IP地址。(从浏览器缓存、系统缓存、路由器缓存、ISP DNS缓存中递归搜索)

v 浏览器给web服务器发一个HTTP请求(已经获取到了IP地址)

v facebook服务的永久重定向响应(把http://facebook.com/重定向到http://www.facebook.com/

v 浏览器跟踪重定向地址

v 服务器“处理”请求 ,涉及到Web服务器对除了ip地址以外的地址信息的解析(nginx,apache,IIS),映射到服务器上面的指定文件

v 服务器发挥一个HTML响应

v 浏览器开始显示HTML

v 浏览器发送获取嵌入在HTML中的对象(图片,CSS,JS),跟以上步骤类似

 

从上面可以看出,域名访问跟ip访问多了两个步骤,一个是通过缓存递归查找出DNS ,还有就是地址重定向的问题,我感觉问题就在这儿。可是又有说不通的地方,如果是DNS出问题了,那么server端根本不能通过域名访问到,也就是 dev_access.log 中不该出现日志。

 

到此已经不知道怎么办了,再次打开域名访问server,出现了如下网页:

 

原因:域名没在阿里云系统备案确用域名访问阿里云服务器~~~~~众里寻他千百度,暮然回首,那货却在灯火阑珊处。

 

总结:

第一:有问题要看日志,而且要很认真很系统的弄懂每一个关键的字段,你认为不重要的地方反而可能是解决问题的关键;

第二:百度上有很多报错可以参考,你需要弄懂的是该报错是什么意思,至于解决报错的方法,百度上面不一定适用;

第三:域名不能访问,可以试试看是否有其他方式可以替代域名访问?如果早点尝试ip访问,问题早就解决了。

<think>嗯,用户问为什么访问IP地址不行,但用域名却可以访问。我需要先分析可能的原因。首先,用户可能遇到了网络连接问题,但具体来说,当直接使用IP无法访问,而域名可以,这说明问题可能不在网络层,而是在应用层或DNS相关的配置上。 常见的可能性有几个:首先,服务器可能配置了基于域名的虚拟主机,也就是同一个IP托管了多个网站,服务器根据域名来决定返回哪个网站的内容。如果直接用IP访问,服务器不知道返回哪个站点,可能返回错误或默认页,甚至拒绝连接。这时候,用户用正确的域名访问,服务器能正确响应,但IP不行。 其次,防火墙或安全组策略可能限制了直接通过IP访问。有些服务提供商为了安全,只允许通过域名访问,防止恶意扫描或未授权的访问。比如,云服务中的安全组规则可能只允许80或443端口通过域名解析的请求,而直接IP访问被拦截。 另外,DNS解析的问题也不能完全排除。虽然用户能用域名访问,但可能本地DNS缓存有问题,或者IP地址变更过,但用户尝试的是旧的IP。不过这种情况可能较少,因为用户明确说IP不行,域名可以,所以更可能的是前面两种情况。 还有可能是端口问题。比如,服务可能运行在非标准端口上,而域名访问时隐式使用了正确的端口(如HTTP的80或HTTPS的443),而直接访问IP时用户没指定端口,导致连接失败。需要确认用户是否在访问IP时加上了正确的端口号。 另外,SSL/TLS证书的问题也可能导致。如果网站使用HTTPS,证书是和域名绑定的,用IP访问会导致证书不匹配,浏览器可能会阻止连接,而用户忽略了警告继续访问,但某些严格的安全设置可能直接拒绝连接。但用户的问题描述中可能没有提到HTTPS,所以需要进一步确认。 最后,应用程序本身的配置可能限制只能通过域名访问,比如某些Web应用框架或中间件设置,拒绝直接IP访问,防止信息泄露或攻击。 现在需要把这些可能性整理清楚,用用户能理解的语言解释,并给出排查步骤,比如检查虚拟主机配置、查看防火墙规则、确认端口是否正确、检查证书配置等。同时,可能需要举例说明,比如Apache或Nginx的虚拟主机设置,或者云服务器的安全组配置,让用户更直观理解。</think>当通过 **IP 地址无法访问** 但通过 **域名可以访问** 时,通常与以下技术原因相关: --- ### **1. 基于域名的虚拟主机配置(常见于 Web 服务器)** - **原理**: 同一台服务器(同一 IP)可能托管多个网站,服务器通过请求头中的 `Host` 字段(域名)区分不同站点。直接访问 IP 时,服务器无法确定应返回哪个网站内容,可能返回默认页、错误页或直接拒绝连接。 - **示例**: 在 Nginx/Apache 中配置多个虚拟主机(`server_name` 或 `<VirtualHost>`)时,未设置默认站点或默认站点未开放 IP 直接访问。 ```nginx # Nginx 配置示例:仅响应特定域名请求 server { listen 80; server_name example.com; # 仅允许通过域名访问 ... } ``` --- ### **2. 防火墙/安全组策略限制** - **原理**: 服务器防火墙或云平台安全组可能配置了规则,仅允许通过 **域名解析后的请求** 访问,直接通过 IP 的流量会被拦截(如屏蔽未备案 IP 或防止恶意扫描)。 - **典型场景**: - 云服务商(如 AWS、阿里云)要求域名备案,未备案的 IP 直接访问会被阻断。 - 企业内网防火墙策略仅放行通过域名访问的流量。 --- ### **3. 端口或协议限制** - **原理**: 服务可能监听在非标准端口(如 8080),而通过域名访问时隐式包含端口(如域名解析到 `IP:8080`),但直接使用 IP 时未指定端口(默认尝试 80/443),导致连接失败。 - **排查方法**: 检查服务实际监听的端口: ```bash netstat -tuln | grep <服务进程名> ``` --- ### **4. DNS 解析与 CDN/代理干扰** - **原理**: - 域名可能解析到 CDN 或反向代理服务器(如 Cloudflare、Nginx 反向代理),而 CDN 仅响应包含正确域名标识的请求。 - 直接访问 CDN 的 IP 会被拒绝,因为 CDN 需要域名匹配才能路由到源站。 --- ### **5. SSL/TLS 证书绑定域名** - **原理**: 若网站使用 HTTPS,SSL 证书通常绑定域名(如 `*.example.com`),直接通过 IP 访问会触发证书域名不匹配错误,浏览器可能直接阻断连接(如 Chrome 显示 `ERR_CERT_INVALID`)。 - **表现**: HTTPS 访问 IP 时报证书错误,HTTP 可能被强制跳转 HTTPS 导致同样问题。 --- ### **6. 应用层访问控制** - **原理**: 应用程序自身可能限制仅允许通过域名访问,例如: - Web 框架(如 Django、Spring Boot)配置了 `ALLOWED_HOSTS` 白名单,仅接受指定域名的请求。 - API 网关或负载均衡器基于域名路由流量。 --- ### **快速排查步骤** 1. **检查服务器响应**: ```bash curl -Iv http://<IP> # 查看 HTTP 响应头和状态码 curl -H "Host: example.com" http://<IP> # 模拟携带域名的请求 ``` 2. **验证端口和防火墙**: ```bash telnet <IP> <端口> # 测试端口连通性 iptables -L -n # 查看服务器防火墙规则 ``` 3. **分析网络路径**: 使用 `traceroute` 或 `mtr` 查看 IP 访问是否被中间节点阻断。 --- ### **解决方案** - **若需直接访问 IP**: 在服务器配置中添加默认站点或允许 IP 直接访问。 ```nginx # Nginx 允许 IP 访问的配置 server { listen 80 default_server; # 设置为默认站点 server_name _; ... } ``` - **若因安全策略限制**: 联系网络管理员或云服务商,调整防火墙/安全组规则。 - **若因证书问题**: 为 IP 申请专用证书(较少见),或改用 HTTP 协议(不推荐)。 --- **总结**:域名IP 访问的差异通常源于服务器配置、安全策略或网络架构的设计。理解具体场景后,可通过日志分析或工具测试快速定位原因。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值