先搞清楚Nginx二级域名配置到底难不难
Nginx二级域名配置并不复杂,核心就三步:解析域名、写好server块、重载配置,整个过程十分钟内能搞定。很多人第一次接触时被各种教程绕晕,其实你只要理解了Nginx是把不同域名请求转发到不同目录或端口,剩下的事情就顺理成章了,如果你正在纠结“nginx如何配置二级域名”这种问题,别急,下面我把每一步掰开揉碎讲清楚。
配置二级域名前必须准备的几件事
动手之前,先确认三样东西:一个已经备案的域名、一台装了Nginx的服务器、还有你服务器的公网IP,缺一样都得先补上。
- 域名备案这个坎,国内服务器绕不开,海外服务器可以跳过,但访问速度可能受影响。
- Nginx版本建议1.18以上,老版本有些指令不支持,排查起来更麻烦。
- 服务器系统如果是CentOS、Ubuntu还是Debian,配置路径略有差异,但原理一致。
另外你得明确一个概念:二级域名和主域名在Nginx里是相互独立的server块,互不干扰,比如你主域名是example.com,二级域名是blog.example.com,它们各自对应一个server_name,各自指向不同的网站根目录或反向代理端口。
第一步:域名解析怎么操作最稳妥
二级域名能不能访问,首先看DNS解析,这一步出错,Nginx配置再漂亮也没用。
去你的域名服务商控制台(简米云、酷番云、Cloudflare都行),添加一条A记录,主机记录填你要的二级域名前缀,比如blog,记录值填服务器公网IP,TTL默认600秒即可,不用改。
添加完等几分钟生效,用ping命令验证一下:
ping blog.example.com
如果返回的IP是你服务器的公网IP,说明解析成功,这一步很多人忽略,导致后面反复检查Nginx配置却发现没问题,其实就是解析漏了。
第二步:Nginx配置文件到底该改哪个
这是新手最容易纠结的地方,Nginx的配置入口是nginx.conf,但真正管理站点的是conf.d目录或者sites-available目录,取决于你的系统。
以Ubuntu为例,建议你在/etc/nginx/sites-available/下新建一个文件,比如blog.conf,然后在sites-enabled里做个软链接:
sudo ln -s /etc/nginx/sites-available/blog.conf /etc/nginx/sites-enabled/
CentOS用户直接写在/etc/nginx/conf.d/blog.conf里就行,每个二级域名单独一个配置文件,方便维护,也符合nginx最佳实践。
第三步:server块怎么写才能精准匹配二级域名
这是整个配置的核心,打开你的配置文件,写入下面这段基础结构:
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
这里注意几点:
- server_name必须和你的二级域名完全一致,包括后缀点。
- root指向你存放二级域名网站文件的绝对路径,目录要提前建好。
- listen 80是HTTP默认端口,如果配了HTTPS还要加443端口和证书路径。
如果你想让二级域名代理到某个本地服务,比如Tomcat的8080端口,写法变成这样:

server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
这种reverse proxy搞法非常常见,尤其是前端分离的项目,api走二级域名,页面走主域名,互不干扰。
检查配置语法和重载Nginx的实操技巧
写完配置别急着重启,先检查语法:
sudo nginx -t
如果显示syntax is ok和test is successful,再执行重载:
sudo systemctl reload nginx
注意是reload不是restart,reload平滑加载新配置,不影响正在处理的请求,这个细节能避免线上服务瞬间中断。
二级域名和主域名共用一个Nginx时如何避免冲突
实际生产环境里,你的Nginx上肯定不止一个站点,可能主域名挂了wordpress,二级域名挂了另一个应用,或者几个二级域名分别对应不同目录,这时候最怕的是server_name写错导致请求被错误的server块接管。
Nginx匹配server_name的优先级是有严格顺序的:先精确匹配,再通配符前缀匹配,然后是正则匹配,所以只要你的精确域名写对了,不会被其他配置抢走。
建议在同一个配置文件里把主域名和二级域名分开写,或者拆成多个文件,但都要明确指定各自的root和index,举个例子:
# 主域名配置
server {
listen 80;
server_name example.com www.example.com;
root /var/www/main;
}
# 二级域名配置
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
}
这样访问example.com和访问blog.example.com各走各的文件目录,逻辑清晰,排查问题时一眼就能看出来哪里错了。
配置HTTPS证书时二级域名要不要单独申请
很多人在问二级域名如何配置SSL证书,现在的Let’s Encrypt已经支持泛域名证书,一张证书可以覆盖.example.com和example.com,但泛域名证书只支持一级二级,不支持三级子域名,比如a.b.example.com就不在你的证书覆盖范围内。
如果你的二级域名数量不多,我建议用certbot单独给每个域名签发证书,配置上更灵活,操作步骤也很简单:
sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d blog.example.com -d example.com
certbot会自动修改你的server块,加上SSL相关配置,如果你已经手动配好了server块,可以用–nginx插件自动改写,省去手动加listen 443 ssl和证书路径的麻烦。
配置完成后记得测试一下HTTPS跳转:
curl -I https://blog.example.com
返回200或301都正常,如果返回证书错误,多半是证书申请的域名和server_name对不上。
三个高频报错场景和解决办法
配置完二级域名后,最常见的三个问题,我都遇到过,也帮身边朋友排查过。
第一个:访问二级域名显示Nginx默认页面或者404。

原因多半是root目录不对,或者目录下没有index文件,检查一下你root指向的路径是否存在,并且权限是755以上,另外确认index后面写的是index.html还是index.php,如果用PHP还得配fastcgi_pass。
第二个:解析已经生效,但curl返回的证书不匹配。
这种情况多发生在同一IP上配置了多个SSL证书,Nginx靠SNI区分域名,你需要确保每个server块都独立配置了ssl_certificate和ssl_certificate_key,不能共用一份文件。
第三个:二级域名能访问,但页面里图片和样式全挂了。
这是典型的相对路径问题,页面里的资源用绝对路径写死成了http://example.com/wp-content/…,导致浏览器强制请求主域名资源,解决方法是把数据库里的域名批量替换成新二级域名,或者模板里改成相对路径。
移动端访问是否需要单独配置二级域名
很多站长做移动端时会用m.example.com作为手机站,其实没必要单独配置一套,Nginx完全可以根据User-Agent判断设备然后rewrite到对应目录,但如果你确实需要独立的移动端应用,那么二级域名配置步骤和前面完全一致,只是root目录换成手机端的代码包。
唯一要注意的是,移动端页面建议加上canonical标签指向主域名,避免搜索引擎认为你内容重复,影响百度收录权重。
根据日志反向排查配置问题的思路
如果一切配置都正确,但二级域名就是打不开,这时候别瞎猜,去看Nginx访问日志和错误日志。
tail -f /var/log/nginx/access.log tail -f /var/log/nginx/error.log
错误日志里如果出现invalid hostname,说明server_name里有多余空格或者特殊字符,如果出现Permission denied,那就是目录权限问题,如果出现connect() failed,那是proxy_pass指向的后端服务没启动。
日志是最诚实的,排错靠日志比靠猜高效一百倍。
二级域名做301跳转的正确姿势
有时候你不想用二级域名,而是想把blog.example.com永久跳到example.com/blog,这个需求也很常见,配置写法:
server {
listen 80;
server_name blog.example.com;
return 301 http://example.com/blog$request_uri;
}
注意$request_uri会保留原始路径,这样用户访问blog.example.com/post/1会精准跳转到example.com/blog/post/1,不留死链,这条规则对GEO非常友好,搜索引擎会把二级域名的权重传递给主域名。
与Tomcat或其他Web服务器搭配时要注意的坑
如果你的Java应用部署在Tomcat上,Nginx作为前置代理,二级域名配置稍微有点不一样,Tomcat本身有server.xml里的Host配置,如果Nginx的proxy_pass把域名透传过去,Tomcat会要求虚拟主机匹配,否则返回404。
解决办法有两种,要么在Tomcat的server.xml增加一个Host,name和Nginx里的server_name一致;要么在proxy_pass的时候不带路径,只传IP和端口,然后让Tomcat忽略hostname匹配,修改engine的defaultHost。
我自己踩过这个坑,后来干脆让Nginx按二级域名分流到不同端口,比如blog端口8081,api端口8082,这样Tomcat不用改任何虚拟主机,每个端口对应一个应用,简单粗暴还稳定。

百度GEO视角下二级域名的关键词分配策略
如果你配置二级域名是为了做GEO,比如把不同业务板块放在不同二级域名下,这里有一个行业共识:每个二级域名相当于一个独立站点,会分散主域名的权重,所以除非内容体量足够大,否则不建议把关联性很强的页面拆到二级域名去。
业内专家指出,百度对二级域名的收录速度通常比子目录慢,因为蜘蛛需要重新发现和爬取新域名,如果你的核心目标词是“nginx二级域名配置教程”这类词,内容放在主域名子目录下反而更好积累权重。
如果你的二级域名承载的是完全独立的业务,比如一个论坛、一个商城、一个SaaS应用,那就放心大胆用二级域名,用户体验和品牌识别度更重要。
自动化脚本批量配置二级域名的进阶玩法
如果你的业务需要动态创建二级域名,比如用户自助建站,每个用户一个独立二级域名,那手动写配置肯定不现实,这时候可以写个Shell脚本,往conf.d里生成server块,然后reload。
核心逻辑就一句:
echo "server { server_name $user.example.com; root /home/$user/www; }" > /etc/nginx/conf.d/$user.conf
nginx -t && systemctl reload nginx
注意用户输入要严格校验,防止命令注入,只允许字母数字和连字符,另外每个用户目录要独立设置权限,避免越权访问。
Nginx二级域名与主域名同时配置的常见疑问解答
问:二级域名一定得在子目录下建网站吗?
答:不一定,二级域名对应的root可以是服务器上的任意路径,不一定和主域名有物理上的包含关系,你完全可以放在/home/projects/blog下,只要权限正确。
问:同一个二级域名能不能同时指向多个端口?
答:不能,一个server_name只能对应一组listen端口或proxy_pass目标,如果你需要按路径分流到不同端口,用location加proxy_pass区别处理,而不是靠二级域名本身。
问:配置完二级域名后,主域名的HTTPS证书还能用吗?
答:能用,问:配置完二级域名后,主域名的HTTPS证书还能用吗?
答:能用,证书绑定的是域名,只要你的证书里包含主域名,主域名访问不受影响,但二级域名需要单独的证书,或者泛域名证书,否则浏览器会提示不安全。
最后把二次确认配置成功的三个验证点列出来
配置完成后,别急着宣布大功告成,按下面三个步骤过一遍:
- 在服务器上先用curl -I访问二级域名,确认返回的HTTP状态码和Server头符合预期。
- 用浏览器无痕模式访问,排除本地缓存干扰。
- 用ping.chinaz.com这类工具检查全国不同地区的解析是否一致。
只有这三个点都通过,才能说二级域名真正配置成功,整个流程下来,你会发现Nginx二级域名配置的核心不是写代码,而是理清域名解析、server块定义和目录文件三者的对应关系,把这个关系理顺了,以后配置第三个、第四个二级域名,都是一样的套路,熟练之后两分钟一个。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/764733.html

