Nginx配置二级域名的核心答案:通过server_name指令匹配域名,将不同二级域名转发到对应站点目录或端口,只需修改nginx.conf或conf.d下的配置文件,重载即可生效。
为什么你的二级域名总是跳到主站
很多人在配置二级域名时遇到一个典型现象:明明写了新配置,访问blog.example.com却打开了www.example.com,这背后是Nginx的虚拟主机匹配机制在起作用。
Nginx接收到请求后,会按照配置文件的加载顺序,逐一比对server_name字段,如果请求头中的Host字段与某个server块的server_name匹配,就执行该块内的location规则,当所有配置都不匹配时,Nginx会使用默认server块,通常是第一个加载的配置或default_server标记的配置。
实操中最常见的错误是:把二级域名配置写在了主配置文件的server块内部,而不是新建一个独立的server块,这会导致Nginx把blog.example.com当作主域名的location路径来处理,自然无法独立解析。
还有一种情况是DNS解析问题,Nginx配置只负责接收流量,但如果域名没有在DNS服务商处添加A记录解析到服务器IP,任何配置都无济于事,据行业共识,超过80%的二级域名配置问题出在DNS解析环节,而不是Nginx本身。
二级域名配置的标准姿势
理解了匹配原理,配置就变得清晰明了,下面是一套通用、可复用的配置模板,适配绝大多数场景。
使用conf.d目录隔离配置
专业的Nginx部署环境通常启用了/etc/nginx/conf.d/目录,所有以.conf结尾的文件都会被自动加载,在这个目录下按域名命名配置文件,能极大降低维护成本。
# /etc/nginx/conf.d/blog.example.com.conf
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
index index.html index.htm;
access_log /var/log/nginx/blog.access.log;
error_log /var/log/nginx/blog.error.log;
}
核心只有三行:listen 80监听HTTP端口,server_name blog.example.com绑定域名,root指定该域名对应的站点目录,修改完配置执行nginx -t检查语法,再执行systemctl reload nginx重载,不需要重启服务。
反向代理场景的配置
如果你的二级域名需要代理到本机或其他服务器的特定端口,比如将api.example.com转发给后端服务,配置调整如下:
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;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

注意proxy_set_header Host $host这一行,如果不设置,后端应用收到的是0.0.1:3000而不是api.example.com,某些依赖域名做跳转的应用会因此出现异常。
HTTPS证书分离配置
二级域名占据一个独立IP和SSL证书的场景很常见,这时需要用443端口配合ssl_certificate指令:
server {
listen 443 ssl;
server_name shop.example.com;
ssl_certificate /etc/nginx/ssl/shop.example.com.pem;
ssl_certificate_key /etc/nginx/ssl/shop.example.com.key;
root /var/www/shop;
# 其余配置
}
HTTP请求强制跳转HTTPS是必做项,在80端口的server块中配置return 301 https://$host$request_uri;,确保所有流量走加密通道。
实操案例:LNMP环境下的二级域名部署
LNMP(Linux + Nginx + MySQL + PHP)是当前使用范围较广的服务器环境组合,以WordPress多站点为例,你会看到配置需要额外处理PHP解析。
在LNMP环境中,Nginx配合PHP-FPM运行WordPress的配置,静态文件和PHP脚本的处理逻辑是分离的:
server {
listen 80;
server_name news.example.com;
root /var/www/news;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 7d;
access_log off;
}
}
关键点在try_files指令,它让Nginx先查找真实文件,找不到则把请求交给index.php处理,这是WordPress伪静态的基础,静态资源单独设置浏览器缓存,能明显减少PHP-FPM的处理压力。
宝塔面板操作路径
如果你使用宝塔面板,操作流程会有所不同,登录面板后进入“网站”菜单,点击“添加站点”,域名一栏填写forum.example.com,数据库和PHP版本按需选择,创建完成后,宝塔会自动生成对应的Nginx配置,你只需要在“配置文件”中微调根目录或反向代理参数。
需要重点检查的地方:站点根目录是否存在、伪静态规则是否选择正确、PHP版本是否匹配程序要求,宝塔生成的配置默认会在/www/server/panel/vhost/nginx/目录下存放独立配置文件,手改时注意不要直接用文本编辑器覆盖,最好通过面板的“配置文件”功能修改,避免权限和格式问题。

泛解析与多级域名的应用
泛解析是二级域名配置中一个进阶且凌厉的手法,在DNS设置中,将.example.com解析到服务器IP,同时Nginx配置一个支持泛匹配的server_name块,即可实现任意子域名的动态映射。
server {
listen 80;
server_name ~^(?<subdomain>.+).example.com$;
root /var/www/$subdomain;
# 动态站点目录映射
}
这种配置常见于SaaS平台或开发者工具,用户注册后自动获得user1.example.com这样的独立子域名,但泛解析带来的问题是所有未匹配的域名都会命中该配置,需要在应用层做好域名白名单校验。
多级域名配置嵌套同样依赖正则捕获,比如blog.cn.example.com,可以写成~^(?<third>.+).cn.example.com$,然后在root中引用$third变量,实际环境中,尽量避免超过三级的域名嵌套,否则证书管理和配置可读性都会出现成本。
不同客户端场景下的差异
近年来移动端流量占比较快增长,不少站长的二级域名天然对应移动端或API接口,比如m.example.com专门服务手机浏览器,api.example.com服务小程序和App客户端,这两类场景对响应速度和跨域策略的要求不同。
移动端站点通常需要额外配置viewportmeta标签,这属于前端工作,但Nginx层面可以将静态资源独立域名化,比如img.example.com,实现浏览器并发连接数的增加,从而提升移动端加载速度,API服务则要注意跨域头配置:
location / {
add_header Access-Control-Allow-Origin ;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass http://127.0.0.1:8080;
}
这段配置允许任意来源跨域请求,适合开放API,生产环境如果API涉及用户敏感数据,应把Access-Control-Allow-Origin限定为具体域名,避免恶意站点窃取数据。
二级域名配置后的六个排错步骤
配置完成但无法访问时,按以下顺序排查,基本上能找到九成问题。
- 检查DNS解析:在服务器上执行
dig blog.example.com或nslookup blog.example.com
,看返回的IP是否与服务器实际IP一致,DNS生效有延迟,最长可能需要24小时。
- 检查端口监听:执行
ss -lnt | grep -E '80|443',确认Nginx在监听对应端口,如果用的是云服务器,确认安全组是否放行了80和443端口。 - 检查配置文件语法:
nginx -t是必做步骤,它会提示配置文件和语法错误的具体位置。 - 检查重载是否成功:
systemctl status nginx查看运行状态,nginx -s reload或systemctl reload nginx让新配置生效。 - 检查日志:Nginx错误日志通常位于
/var/log/nginx/error.log,访问日志在access.log,通过tail -f实时跟踪请求,能看到请求命中了哪个server块。 - 排除本地缓存干扰:浏览器或本地hosts文件可能导致你访问的仍是旧地址,用
curl -H "Host: blog.example.com" http://服务器IP直接测试,绕过DNS和浏览器缓存。
常见问题解答
nginx二级域名配置无效或指向主站时,最可能的原因是什么?
主要原因是请求未匹配到对应的server_name,请检查新配置的server块是否处于加载状态,nginx -T可以查看所有生效的配置,如果新配置内容没被加载,检查.conf文件是否放在了conf.d目录,或主配置文件中是否用include引用了该文件,确认新配置的server_name前没有默认server块抢先接收请求。
nginx二级域名如何配置泛解析?
DNS管理后台添加A记录,主机记录写,解析到服务器IP,Nginx配置中server_name使用正则表达式~^(?<sub>.+).example.com$,或者直接写.example.com,泛解析适合需要自动化分配子域名的场景,但注意充作默认站点的风险。
二级域名的SSL证书如何选择与部署?
单域名证书价格相对友好,每个二级域名一张证书,如果二级域名数量较多,通配符证书(.example.com)更划算,部署时把证书文件和私钥文件路径填入对应的ssl_certificate和ssl_certificate_key指令即可,Nginx支持多个server块各自加载独立的证书文件,互不干扰。
配置二级域名这件事,本质是让Nginx学会区分不同Host请求并路由到正确的位置,掌握server_name和工作原理,配合DNS正确解析,绝大多数问题都能独立解决,最后留一句实在话:每次修改配置文件前先备份,每一条配置指令弄懂之后再去填,你的Nginx会越用越顺手。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/782637.html

