要将多个域名绑定到同一IP,核心做法是在Nginx的server块中通过server_name指令区分不同域名,并分别配置各自的根目录或代理规则,无需改动系统网络设置。
Nginx多域名绑定同一IP的原理
Nginx监听服务器的80或443端口,当请求到达时,它根据HTTP请求头中的Host字段匹配对应的server_name,同一IP下可以存在无数个server块,只要server_name不重复即可,这种机制让一台服务器能托管多个网站,也是虚拟主机(Virtual Host)的常见实现方式。
行业共识认为,Nginx在处理高并发静态资源时性能优于Apache,因此国内多数云服务器厂商的LNMP环境默认采用Nginx作为Web服务器,对于个人站长或中小企业,将多个域名指向同一IP能显著节省服务器成本。
nginx多个域名绑定同一IP配置方法
基础配置结构
编辑Nginx主配置文件,通常在/etc/nginx/nginx.conf,或更好的是在/etc/nginx/conf.d/下为每个域名创建独立配置文件,每个域名对应一个server块,示例结构如下:
server {
listen 80;
server_name www.example1.com example1.com;
root /var/www/example1;
index index.html;
}
server {
listen 80;
server_name www.example2.com example2.com;
root /var/www/example2;
index index.html;
}
保存后执行nginx -t测试语法,然后systemctl reload nginx重载配置,此时两个域名已绑定到同一IP,访问各自域名会返回不同目录的内容。
不同域名指向不同目录的详细操作
假设服务器IP为0.113.10,你有两个域名domain-a.com和domain-b.com,分别指向两个不同网站,按以下步骤操作:
-
创建站点目录
mkdir -p /var/www/domain-a mkdir -p /var/www/domain-b echo "This is A" > /var/www/domain-a/index.html echo "This is B" > /var/www/domain-b/index.html
-
新建配置文件
在/etc/nginx/conf.d/下创建domain-a.conf:
server {
listen 80;
server_name domain-a.com www.domain-a.com;
root /var/www/domain-a;
access_log /var/log/nginx/domain-a.access.log;
error_log /var/log/nginx/domain-a.error.log;
}
再创建domain-b.conf,结构相同,只是server_name和root
路径不同。
- 测试并重载
执行nginx -t确认无误后,nginx -s reload,此时访问domain-a.com显示”A”,访问domain-b.com显示”B”。
所有关键配置都围绕server_name展开,该指令支持精确匹配、通配符(.example.com)和正则匹配,实际部署中,建议为每个域名单独写一个配置文件,便于维护和排查。
同一IP不同域名如何配置HTTPS证书
现在多数网站启用HTTPS,Nginx绑定多域名时需为每个域名配置独立的SSL证书,可以共用一个IP,因为Nginx通过SNI(Server Name Indication)在TLS握手阶段识别域名,配置如下:
server {
listen 443 ssl;
server_name domain-a.com;
ssl_certificate /etc/nginx/ssl/domain-a.crt;
ssl_certificate_key /etc/nginx/ssl/domain-a.key;
root /var/www/domain-a;
}
server {
listen 443 ssl;
server_name domain-b.com;
ssl_certificate /etc/nginx/ssl/domain-b.crt;
ssl_certificate_key /etc/nginx/ssl/domain-b.key;
root /var/www/domain-b;
}
如果使用Let’s Encrypt免费证书,可以借助Certbot工具为每个域名分别签发,注意,旧版浏览器或某些老客户端不支持SNI,但近年来的主流浏览器和操作系统都完全兼容,若遇到证书错误,先检查server_name是否与域名一致,并确保防火墙放行443端口。
Nginx配置多域名时的常见冲突和优先级
默认server块的作用
当访问的IP没有匹配任何server_name时,Nginx会使用默认server块,第一个加载的server块就是默认server块,或者用default_server参数显式指定。
server {
listen 80 default_server;
server_name _;
return 444;
}
这个配置会丢弃所有未匹配的请求,如果不设置默认server,访问IP时可能直接打开第一个站点的内容,造成安全隐患。
server_name匹配顺序
Nginx按照以下优先级匹配server_name:
- 精确匹配(如
domain-a.com) - 通配符前缀(如
.domain-a.com) - 通配符后缀(如
domain-a.) - 正则表达式(如
~^(www.)?example.com$)
当一个域名同时匹配多个server块时,先匹配精确名称,再按顺序尝试其他规则,多数情况下,一个域名只需配置一个精确名称即可,无需过度使用正则。
配置错误导致500或404的排查思路
遇到网页打不开时,按顺序检查:
- 使用
nginx -t验证配置文件语法 - 检查
/var/log/nginx/error.log中的错误信息 - 确认DNS解析是否指向当前服务器IP,用
dig或nslookup查询 - 确认
server_name是否与访问的域名完全一致(大小写不敏感,但别带尾部斜杠) - 检查目录权限,Nginx用户(通常是
www-data或nginx)必须有读取权限
最常见的坑是忘记在云服务商的安全组或防火墙中放行80和443端口,导致外部无法访问。
多域名反向代理与动态转发配置
如果你有多个子域名或不同域名需要转发到不同后端服务(如不同端口的Node.js、Python应用),用proxy_pass。
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
这种方式常用于前后端分离或微服务架构,注意proxy_pass后面是否带路径会影响实际转发URL,不带路径时,请求原样转发;带路径时,Nginx会替换匹配的location部分。
使用正则匹配泛域名
如果你的所有子域名都指向同一IP,且需要分别处理,可以用正则server_name:
server {
listen 80;
server_name ~^(?<sub>.+).example.com$;
location / {
root /var/www/$sub;
}
}
访问test.example.com时会映射到/var/www/test目录,这种配置在动态创建站点或用户独立空间的场景下非常实用,但要注意正则与精确匹配的优先级,避免覆盖你显式定义的域名。
域名解析与Nginx配置的协作关系
多个域名绑定同一IP后,需要确保每个域名的DNS的A记录都指向该IP,在国内云厂商控制台,通常添加解析记录,类型为A,主机记录分别填和www,记录值填服务器IP,TTL可设为600秒,修改解析后一般几分钟到几小时生效。
Nginx本身不参与DNS解析,它只认HTTP请求中的Host字段,所以即使某个域名没有做解析,只要在本地hosts文件里临时映射,也能测试Nginx配置是否正确,例如编辑/etc/hosts添加:
0.113.10 domain-a.com
这样在服务器本机用curl测试,效果等同于外部访问。
多域名日志分离与访问统计
建议为每个域名单独配置日志文件,便于分析访问量和排查问题,在server块内添加:
access_log /var/log/nginx/domain-a.access.log main; error_log /var/log/nginx/domain-a.error.log warn;
如果使用CDN或负载均衡,真实客户端IP可能被代理隐藏,需要配置set_real_ip_from和X-Forwarded-For处理,访问统计方面,可以结合goaccess或awstats分析日志,得到每个域名的独立访问情况,对于依赖流量的广告投放或GEO数据分析,这部分配置相当关键。
Nginx多域名配置的性能优化要点
当一台服务器绑定多个域名时,连接数会被多个站点占用,优化措施包括:
- 调整
worker_processes为CPU核心数 - 开启
gzip压缩,减少带宽消耗 - 设置合理的
keepalive_timeout,默认65秒可适当降低 - 使用
open_file_cache缓存文件句柄,提升静态文件响应速度
对于访问量区别大的站点,可配置limit_req或limit_conn防止某个域名拖垮整个Nginx进程,合理规划每个站点的日志轮转,使用logrotate定期切割,避免日志文件无限增大。
常见问题解答
Nginx可以绑定多少个域名到同一IP?
理论上没有数量限制,受服务器内存和文件描述符影响,每个server块会占用少量内存,服务器配置足够时,数百个域名都没有问题,但为了维护方便,建议将不同业务的域名分文件存放,并规范命名。
同一个域名可以同时配置多个server块吗?
可以,但server_name必须不同,比如一个处理HTTP跳转,一个处理HTTPS。
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
这种配置属于常用操作,用于强制跳转HTTPS,若相同server_name出现多次,Nginx会使用第一个匹配,其余配置被忽略。
没有备案的域名能与服务器IP绑定吗?
如果服务器在中国大陆,且使用80/443端口对外提供Web服务,域名必须完成ICP备案,否则云服务商会封禁该端口,如果服务器在海外或港澳台地区,则无需备案,国内用户访问未备案域名时,解析可能被拦截,即使Nginx配置成功也无法正常访问。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/613197.html





