nginx配置多域名的本质是让一台服务器通过server_name指令区分不同域名的请求,并为每个域名分配独立的server块,从而实现一个IP承载多个网站。
nginx多域名配置的核心思路与server_name规则
nginx处理多域名请求时,核心机制是HTTP请求头中的Host字段,浏览器访问example.com时,请求头会携带Host: example.com,nginx读取这个字段后,与配置文件中的server_name逐一比对,匹配成功的server块负责处理该请求。
nginx server_name的匹配优先级
nginx的server_name匹配遵循精确匹配优先于通配符,通配符优先于正则的规则,按配置文件顺序从上到下查找。
- 精确匹配:
server_name example.com;完全一致的域名 - 通配符匹配:
server_name .example.com;匹配任意子域名 - 正则匹配:
server_name ~^wwwd+.example.com$;用正则表达式匹配
多域名配置时建议将精确匹配写在前面,通配符写在后面,避免正则匹配干扰正常域名解析。
默认服务器的兜底作用
当请求的Host字段匹配不到任何server_name时,nginx会交给default_server处理,可以在listen指令中指定:
listen 80 default_server;
未指定default_server时,nginx默认使用第一个server块作为默认服务器,多域名配置中设置一个明确的默认服务器,可以防止未知域名访问时跳转到错误页面。
nginx一个服务器配置多个域名的完整示例
假设你有一台云服务器,公网IP为0.113.10,需要同时承载a.com和b.com两个网站,各自拥有独立的站点目录和PHP运行环境。
第一步:创建各自的站点目录
mkdir -p /var/www/a.com mkdir -p /var/www/b.com
两个目录分别放入各自的index.html或PHP入口文件,确保权限为www-data或nginx运行用户可读。
第二步:编写两个server块
nginx配置多域名的标准写法是每个域名一个server块,推荐将不同站点的配置拆分为独立文件,放在/etc/nginx/conf.d/下,便于后期维护。
a.com的配置文件:
server { listen 80; server_name a.com www.a.com; root /var/www/a.com; index index.html index.php; location / { try_files $uri $uri/ =404; } location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; } }
b.com的配置文件:
server {
listen 80;
server_name b.com www.b.com;
root /var/www/b.com;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
}
第三步:检查配置并重载
nginx -t systemctl reload nginx
如果配置语法无误,nginx会输出test is successful,此时访问a.com和b.com,两个域名各自返回对应目录的内容,互不干扰,nginx多域名配置怎么做?核心就三步:建目录、写server块、重载nginx。
nginx多域名同一端口的HTTPS方案
现代网站普遍启用HTTPS,nginx多域名配置需要同时处理443端口的SSL证书,一台服务器配置多个SSL证书依赖SNI(Server Name Indication)机制,nginx自1.11.5版本起默认支持SNI,无需额外模块。
为每个域名申请并配置独立证书
使用Let’s Encrypt免费证书是最常见的方案,以Certbot为例:
certbot --nginx -d a.com -d www.a.com certbot --nginx -d b.com -d www.b.com
Certbot会自动修改nginx配置,在server块中添加证书路径和443监听,执行完成后,两个域名分别拥有独立的SSL证书。
统一跳转与HTTP自动转HTTPS
行业共识认为,多域名场景下应保持行为一致性,避免部分域名走HTTP、部分走HTTPS,可以在每个server块中添加强制跳转:
server {
listen 80;
server_name a.com www.a.com;
return 301 https://$host$request_uri;
}
这样所有HTTP请求自动跳转到HTTPS,用户访问http://a.com时会自动跳转至https://a.com,不影响其他域名的正常访问。
多域名共用443端口注意事项
nginx多域名同一端口的配置中,443端口可以同时监听多个域名,但每个域名必须绑定自己的证书,证书配置错误时,浏览器会提示证书不匹配,检查配置时可以用:

nginx -T | grep ssl_certificate
确认每个server块引用的证书路径是否正确。
nginx不同域名访问不同目录的配置细节
除了独立站点,还存在另一种常见场景:多个域名共用一个站点目录,但通过不同路径区分内容,比如a.com和b.com都指向同一个WordPress目录,但展示不同语言版本。
使用location区分域名对应的目录
server {
listen 80;
server_name a.com;
location / {
root /var/www/site/cn;
index index.html;
}
}
server {
listen 80;
server_name b.com;
location / {
root /var/www/site/en;
index index.html;
}
}
这种nginx不同域名访问不同目录的写法适合静态站点,两个域名访问同一台服务器,但看到的内容完全不同。
通过变量动态设置根目录
nginx支持在server块内使用if判断或变量赋值:
server {
listen 80;
server_name a.com b.com;
if ($host = a.com) {
set $site_dir /var/www/a.com;
}
if ($host = b.com) {
set $site_dir /var/www/b.com;
}
root $site_dir;
index index.html;
}
这种写法将两个域名的配置合并到一个server块中,减少重复代码,但可读性略差,业内专家指出,配置复杂时拆分配置文件比使用if更利于排查问题。
反向代理场景下的多域名配置
如果nginx作为反向代理,多域名配置时只需修改proxy_pass的转发目标:
server {
listen 80;
server_name api.a.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
nginx多域名配置的常见问题排查
nginx多域名配置后访问不到预期站点,多数情况下是配置细节出了问题,按以下顺序排查,能快速定位原因。
配置未重载导致旧配置生效
修改配置文件后忘记执行systemctl reload nginx,nginx仍在运行旧配置,排查时先执行:
nginx -T | grep server_name
查看当前生效的配置中server_name是否包含新域名。
server_name与域名解析不一致

服务器配置了a.com,但域名的DNS记录未解析到服务器IP,本地测试时可以用curl指定Host头:
curl -H "Host: a.com" http://203.0.113.10
返回200说明nginx配置正确,问题出在DNS解析或域名注册商的解析设置上。
默认服务器覆盖了域名匹配
nginx多域名配置时如果忘记为每个域名设置独立的server_name,且开启了default_server,请求会全部落入默认服务器,检查每个server块是否都有明确的server_name指令,且没有重复定义相同域名。
证书错误导致HTTPS访问失败
多域名配置HTTPS证书时,常见的报错是ssl_certificate路径写错或证书文件权限不足,执行nginx -t会提示具体的证书错误,根据提示修正路径即可。
nginx多域名配置需要花钱吗?nginx本身是开源免费的,服务器和域名的费用由云服务商和域名注册商收取,SSL证书可以免费申请Let’s Encrypt证书,成本可以控制在服务器费用以内。
Q&A:nginx多域名配置常见疑问
nginx一个服务器能配置多少个域名?
理论上nginx配置的域名数量没有硬性上限,取决于服务器性能和配置文件复杂度,每个server块占用少量内存,数百个域名在同一台服务器上运行是可行的,多域名配置时建议将每个域名的server块拆分为独立文件,方便单独禁用或修改某个站点。
nginx多域名配置后访问不了对应网站怎么办?
先执行nginx -t检查配置语法,再执行systemctl reload nginx重载配置,确认域名的DNS解析记录指向服务器IP,且服务器安全组或防火墙开放了80和443端口,用curl -H "Host: 你的域名" http://服务器IP测试nginx是否返回预期内容,如果返回403则检查站点目录权限,返回404则检查root路径是否写错。
同一个IP可以同时配置多个域名的HTTPS证书吗?
可以,nginx通过SNI机制在TLS握手阶段识别域名,为不同域名返回对应的证书,配置时确保每个server块的ssl_certificate指向该域名自己的证书文件,使用nginx -T可以查看所有server块的证书配置,Let’s Encrypt等免费证书签发服务支持多域名申请,Certbot可以自动完成证书安装和续期,整个过程不需要额外付费。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/770884.html

