云计算百科
云计算领域专业知识百科平台

Nginx如何让多个网站绑定不同IP:listen配置、验证与常见故障

一台Linux服务器配置多个IPv4后,常见需求是让不同网站分别监听不同IP,而不是让所有站点共同监听 0.0.0.0:80。Nginx可以通过 listen IP:端口 实现IP级监听,再使用 server_name 匹配域名。

本文使用文档示例地址 192.0.2.10 和 198.51.100.20。它们不能用于生产网络,请替换成服务器实际分配的IP。

一、先理解 listen 和 server_name 的分工

  • listen 决定Nginx在哪个本地地址和端口接收连接;
  • server_name 根据HTTP请求中的主机名选择虚拟主机;
  • root、proxy_pass 等指令决定请求最终读取文件还是转发到后端。

只写下面这种配置时,Nginx会监听本机所有IPv4地址的80端口:

listen 80;

如果希望某个站点只监听指定IP,应写出完整地址:

listen 192.0.2.10:80;

二、配置前确认IP已经绑定到系统

Nginx只能监听操作系统已经拥有的地址。先检查网卡:

ip -4 addr show
ip route

应当能看到计划使用的全部公网IP,以及正确的前缀、网关和路由。如果IP尚未配置,直接执行 nginx -t 可能通过,但启动或重载时可能出现:

bind() to 192.0.2.10:80 failed (99: Cannot assign requested address)

这种情况要先修正系统网络配置,而不是反复修改Nginx。

三、让两个站点分别绑定两个IP

假设:

网站监听IP站点目录
site-a.example 192.0.2.10 /var/www/site-a
site-b.example 198.51.100.20 /var/www/site-b

站点A配置:

server {
listen 192.0.2.10:80;
server_name site-a.example www.site-a.example;

root /var/www/site-a;
index index.html index.htm;

access_log /var/log/nginx/site-a.access.log;
error_log /var/log/nginx/site-a.error.log warn;

location / {
try_files $uri $uri/ =404;
}
}

站点B配置:

server {
listen 198.51.100.20:80;
server_name site-b.example www.site-b.example;

root /var/www/site-b;
index index.html index.htm;

access_log /var/log/nginx/site-b.access.log;
error_log /var/log/nginx/site-b.error.log warn;

location / {
try_files $uri $uri/ =404;
}
}

Debian或Ubuntu通常把文件放在 /etc/nginx/sites-available/,再链接到 /etc/nginx/sites-enabled/;其他发行版也可能使用 /etc/nginx/conf.d/。实际位置可通过下面的命令查看:

nginx -T

nginx -T 会输出完整配置,公开粘贴前应删除域名、内部路径、证书位置和真实IP等敏感信息。

四、HTTPS如何绑定不同IP

每个站点分别指定监听IP、证书和私钥:

server {
listen 192.0.2.10:443 ssl;
server_name site-a.example;

ssl_certificate /etc/letsencrypt/live/site-a.example/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site-a.example/privkey.pem;

root /var/www/site-a;
}

另一个站点使用 198.51.100.20:443 和自己的证书。不要把不同站点的私钥混用,也不要把私钥内容上传到工单、代码仓库或公开文章。

HTTP/2的配置语法与Nginx版本有关。修改前先执行 nginx -v,并以当前版本的官方文档为准。

五、重载前后怎样验证

每次修改都应先检查语法:

nginx -t

确认通过后再平滑重载:

systemctl reload nginx

检查监听状态:

ss -lntp | grep nginx

在DNS尚未生效时,可以用 curl –resolve 指定域名与IP:

curl -I –resolve site-a.example:80:192.0.2.10 http://site-a.example/
curl -I –resolve site-b.example:80:198.51.100.20 http://site-b.example/

HTTPS测试时把端口改为443并使用 https://。不建议用 -k 长期忽略证书错误;证书校验失败时应检查域名、证书链和有效期。

六、四类常见故障

1. 请求总是进入错误站点

检查是否仍有其他配置使用 listen 80 default_server; 或 listen 0.0.0.0:80;。同一 地址:端口 上,如果域名没有匹配成功,请求会进入该地址的默认虚拟主机。

可以使用以下命令检查最终配置中所有监听项:

nginx -T 2>/dev/null | grep -nE 'listen|server_name'

2. 端口已经被占用

ss -lntp | grep -E ':80|:443'

如果Apache、另一套Nginx或面板服务已占用相同地址和端口,需要先明确由哪个服务负责监听,不能直接结束未知进程。

3. 本机正常,外网无法访问

依次检查:

  • 云平台或机房防火墙是否放行80和443;
  • 系统防火墙规则;
  • IP、掩码、网关和策略路由;
  • 域名A记录是否指向正确IP;
  • 上游是否存在端口限制。

4. 多IP配置后回包走错出口

服务器拥有多个网段时,入站地址和回程路由可能不一致。先用 ip route get 目标地址 from 本地IP 检查路由选择;复杂场景可能需要策略路由。不要在不清楚现有网络结构时批量修改路由表,以免导致远程连接中断。

七、批量管理时的实践建议

  • 为每个站点单独保存配置文件、日志和证书路径;
  • 建立“域名—监听IP—站点目录—证书—负责人”的资产表;
  • 使用模板或配置管理工具生成文件,但每次部署仍执行 nginx -t;
  • 不要把完整IP清单、SSH账号、面板口令和证书私钥写入公开仓库;
  • 多个IP解决的是监听、隔离和管理问题,不能作为搜索排名承诺。
  • 如果需要先统计一批IPv4涉及多少个 /24、是否连续,可以使用浏览器本地运行的IP网段检测工具:

    https://www.shijihulian.com/ip-distribution-check.html

    参考资料

    • Nginx listen 指令:https://nginx.org/en/docs/http/ngx_http_core_module.html#listen
    • Nginx Server Names:https://nginx.org/en/docs/http/server_names.html
    • Nginx请求处理流程:https://nginx.org/en/docs/http/request_processing.html
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Nginx如何让多个网站绑定不同IP:listen配置、验证与常见故障
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!