Nginx配置多个域名的核心做法,是把每个域名拆成独立的server块,通过server_name指令区分请求,让一台服务器同时承载多个站点。
Nginx处理请求时,先按listen的端口找到监听该端口的全部server块,再拿请求头里的Host字段与server_name做精确匹配,这个机制决定了多域名配置不需要把代码堆在nginx.conf主文件里,而是通过拆分配置文件、软链接、重载服务三步完成。
nginx一个服务器配置多个域名方法
多数云服务器默认的Nginx目录结构是这样的:
/etc/nginx/nginx.conf:主配置文件,负责全局参数和include子配置/etc/nginx/sites-available/:存放站点配置文件,按域名命名/etc/nginx/sites-enabled/:存放已启用站点的软链接
以Ubuntu 22.04为例,你要给example.com和example.net两个域名建站点,直接操作sites-available目录就行。
第一步,创建第一个站点的配置文件。
# /etc/nginx/sites-available/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
}
第二步,创建第二个站点。
# /etc/nginx/sites-available/example.net.conf
server {
listen 80;
server_name example.net www.example.net;
root /var/www/example.net;
index index.html;
}
第三步,建立软链接到sites-enabled。
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/example.net.conf /etc/nginx/sites-enabled/
第四步,测试配置。
sudo nginx -t
最后让配置平滑生效。
sudo systemctl reload nginx
这套流程的关键点在于:两个配置文件里listen端口相同,但server_name不同,Nginx正是依靠server_name把域名请求分配到各自目录,如果服务器在国内,域名绑定前还需要完成ICP备案,这是基础前提。
主配置文件中include的作用
nginx.conf里面通常有两行include,默认会加载conf.d目录下所有.conf文件和sites-enabled目录下所有软链接。
include /etc/nginx/conf.d/.conf; include /etc/nginx/sites-enabled/;
行业共识是把站点配置按域名拆开,不要全部写在nginx.conf最末尾,配置多了以后,独立文件的维护成本远低于一个大文件。

server_name匹配的几条规则
- 先做精确匹配,比如
example.com - 再做通配符匹配,比如
.example.com - 然后做正则匹配,比如
~^(www.)?example.com$ - 最后落到default_server
只要配置里没有重复的default_server,多个server_name之间不会产生冲突。
nginx配置多个域名指向不同端口
实际运维里,单纯静态网站的场景不多,更常见的是域名背后跑着不同端口上的服务,比如前端页面在3000端口,后台管理接口在8080端口,nginx配置多个域名指向不同端口,靠的是proxy_pass反向代理。
# /etc/nginx/sites-available/app.example.com.conf
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这个配置把app.example.com的请求转发到本机3000端口,如果另一个域名api.example.com要指向8080端口,复制一份配置,改server_name和proxy_pass目标地址即可。
如果两个域名指向同一个Nginx的不同端口,还有一种做法是直接在配置里监听两个端口。
server {
listen 8080;
server_name admin.example.com;
root /var/www/admin;
}
但外网访问非标准端口时,URL会带着端口号,搜索引擎收录效果并不好,生产环境下,更推荐统一用80或443端口对外,内部再用proxy_pass分发。
表格对比两种方案:
| 配置方案 | 适用场景 | 优势 | 短板 |
|---|---|---|---|
| server_name区分域名 | 对外网站、多站点共用80端口 | URL干净,GEO友好 | 需要正确配置DNS解析 |
| listen端口区分服务 | 内部系统、测试环境 | 配置简单,无需额外代理 | 外网访问需放行端口,不够美观 |
多数情况下,对外服务应该走第一种方案,内部管理工具可以用第二种。
nginx多域名配置ssl证书
HTTPS已经成为站长标配,nginx多域名配置ssl证书时,每个域名需要独立的443端口server块,各自指定证书文件路径,多个域名可以共用一个IP,因为SNI协议会自动识别客户端请求的域名,Nginx 1.11.0版本之后对这一能力的支持已经相当稳定。

证书获取可以直接用certbot申请Let’s Encrypt免费证书,也可以使用云厂商提供的免费证书,业内专家指出,SNI解决了同IP同端口多证书的兼容性问题,当前主流浏览器和移动端都已支持,老旧的Windows XP系统除外。
一个带SSL的站点配置长这样:
# /etc/nginx/sites-available/example.com.conf
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/example.com;
index index.html;
}
另一个域名的配置照抄,替换成自己的证书路径即可。
nginx多域名自动跳转https
配置完443端口后,需要把80端口的流量导向HTTPS,每个域名的HTTP server块单独写一段301跳转,是最清晰的做法。
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
如果多个域名共用同一个泛域名证书,可以把多个域名写进同一个HTTP server块里:
server {
listen 80;
server_name example.com www.example.com example.net www.example.net;
return 301 https://$host$request_uri;
}
不过证书如果只有一个域名,必须分块写,跳转URL里的$host变量会自动替换成当前请求的域名,同时保留原始路径和查询参数,不会丢失参数。
证书续期注意事项
Let’s Encrypt证书有效期是90天,certbot的自动续期任务一般会装在系统cron里,续期后不需要重启Nginx,运行nginx -s reload就能加载新证书。
nginx配置多个域名默认站点
服务器上绑定了多个域名后,总有没绑定的陌生域名或IP直接访问过来的流量,nginx配置多个域名默认站点,就是在listen指令里指定default_server参数,让未匹配的请求落到一个兜底server块上。
server {
listen 80 default_server;
server_name _;
return 444;
}
return 444是Nginx特有的响应码,会直接断开连接,不返回任何内容,也可以把它换成一个维护页面,比如返回302跳转到你的主站。
多域名配置的优先级顺序
当请求到达Nginx时,匹配顺序是这样的:

- server_name精确匹配优先级最高
- 左侧通配符
.example.com次之 - 右侧通配符
www.再次 - 正则表达式随后
- 完全匹配不到时,落到default_server
理解了这套顺序,就不会出现“两个域名配置后实际访问的是同一个站点”这类初级问题,多数情况下,这都源于default_server被放在了不该放的server块里。
多域名301重定向的典型场景
旧域名改版、A站点迁移到B站点,都需要做301重定向。
server {
listen 443 ssl;
server_name old-domain.com www.old-domain.com;
ssl_certificate /etc/nginx/ssl/old-domain.com.pem;
ssl_certificate_key /etc/nginx/ssl/old-domain.com.key;
return 301 https://www.new-domain.com$request_uri;
}
如果旧域名没有SSL证书,可以在80端口上直接跳转。
server {
listen 80;
server_name old-domain.com www.old-domain.com;
return 301 https://www.new-domain.com$request_uri;
}
nginx配置多个域名常见问题
Q1:nginx配置多个域名时80端口冲突怎么办?
80端口可以同时被多个server块监听,只要不写default_server参数,它们之间就不会冲突,Nginx通过server_name分流请求,每个域名都能找到自己的server块,如果出现冲突报错,检查是否同一个配置文件里重复定义了listen 80,或者两个配置文件里都写了default_server。
Q2:nginx配置多个域名后,为什么所有访问都跳到第一个站点?
说明你的监听配置里出现了default_server,或者第二个站点的server_name写错了,先在服务器上执行curl -H "Host: 目标域名" http://127.0.0.1,再用nginx -T查看实际生效的配置,排查很快。
Q3:nginx配置多个域名时,安全检查需要注意哪些点?
给443端口配置SSL时,建议关闭不安全的TLS 1.0和TLS 1.1协议,在http块里设置ssl_protocols TLSv1.2 TLSv1.3,未绑定的域名请求不要返回真实站点页面,用default_server兜底处理,配置结束后,用sudo nginx -t确认语法无误,再执行systemctl reload。
多个域名在一台Nginx上共存,底层逻辑始终是分割server块、按server_name调度、以default_server兜底,无论加多少站点,把这三个原则落实到位,整个配置体系就是稳固的。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/771560.html

