一台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
假设:
| 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 检查路由选择;复杂场景可能需要策略路由。不要在不清楚现有网络结构时批量修改路由表,以免导致远程连接中断。
七、批量管理时的实践建议
如果需要先统计一批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
网硕互联帮助中心




评论前必须登录!
注册