最近用宝塔面板搭了两个网站,结果翻车了——直接访问服务器IP时,居然跳转到了第二个站点!本以为是个小问题,结果排查了半天才搞明白。这里记录下问题和解决方案,顺便把例子里的IP/域名换成大家熟悉的,方便理解。
问题复现
我的环境:
站点A:绑定IP 192.168.1.100 的 80 端口(无域名,纯IP访问)
站点B:绑定域名 test.example.com 的 80 端口,同时绑定IP 192.168.1.100 的 8080 端口
预期:
访问 192.168.1.100:80 → 显示站点A
访问 test.example.com:80 → 显示站点B
访问 192.168.1.100:8080 → 显示站点B
实际:
访问 192.168.1.100:80 时,居然打开了站点B的内容!
原因分析
看了站点B的Nginx配置(宝塔面板自动生成的),关键问题出在这两行:listen 80; # 监听所有IP的80端口
listen 8080; # 监听所有IP的8080端口
server_name test.example.com; # 只绑定了域名
这里有个隐藏逻辑:
listen 80; 实际上会监听服务器所有IP的80端口(比如 192.168.1.100:80、127.0.0.1:80 等),而不仅仅是某个特定IP。
站点A虽然绑定了 192.168.1.100:80,但没有设置默认优先级(Nginx默认选第一个匹配的配置)。
所以当访问 192.168.1.100:80 时,Nginx发现站点B也监听了所有IP的80端口,直接匹配到了站点B的配置。
解决方案
方法2:让站点B只监听域名+指定IP的8080端口(推荐)
修改站点B的Nginx配置,把 listen 80; 改成 仅监听域名,同时保留 listen 8080;(绑定IP的端口):
server {
listen 80; # 先别急着删,看下一步
server_name test.example.com; # 只认这个域名
# ...其他配置不变
}
# 新增一个server块,专门处理IP+8080的请求
server {
listen 192.168.1.100:8080; # 仅绑定指定IP的8080端口
server_name test.example.com; # 还是这个域名(其实可以省略,因为IP已限定)
root /www/wwwroot/site_b/public; # 站点B的根目录
index index.html;
# ...其他配置和站点B原配置一致
}
然后删除原来的 listen 80;(避免站点B再监听所有IP的80端口)。
最终效果:
访问 192.168.1.100:80 → 只有站点A能响应(因为站点B不再监听IP的80端口)。
访问 test.example.com:80 → 站点B响应(通过域名)。
访问 192.168.1.100:8080 → 站点B响应(通过IP+指定端口)。
操作步骤(宝塔面板用户)
进入宝塔面板 → 网站 → 找到站点B → 点击“配置文件”。
删掉 listen 80; 这一行(避免监听所有IP的80端口)。
在同一个配置文件里,新增一个server块,专门监听 192.168.1.100:8080(参考上面的代码)。
保存后点击“重启Nginx”。
验证是否成功
浏览器访问 http://192.168.1.100 → 应该看到站点A的页面。
浏览器访问 http://test.example.com → 应该看到站点B的页面。
浏览器访问 http://192.168.1.100:8080 → 应该看到站点B的页面。
总结
坑点:宝塔面板自动生成的 listen 80; 会监听所有IP的80端口,可能导致IP访问冲突。
解决关键:让需要绑定IP的站点明确指定IP+端口(比如 listen 192.168.1.100:8080;),而不是泛听所有IP。
适用场景:多站点共用服务器,且部分站点需要同时支持域名和IP访问时。
以后搭网站记得检查 listen 指令!别像我一样被默认配置坑了半天
版权声明:本站部分内容来源于互联网,主要目的在于分享信息,版权归原作者所有。
如涉及侵权,请联系我们,我们将第一时间处理。