一台 nginx 跑多个站:主域+子域名+各自 HTTPS 的配置边界
2026-08-11 · 运维 / nginx我这台机器上跑着主域 firstskill.cn、一个子域名站、还有别的几个项目,全在一台 nginx 后面。配置串过一次,排查半天。这篇把"边界"讲清楚,下次不再犯。
每个站一个独立 server block,一个独立文件
不要把所有 server 塞进一个文件。一个站一个文件放 sites-available,启用就软链到 sites-enabled。改某个站只动它的文件,nginx -t 过了再 reload,影响面最小。
server_name 和 default_server 的分工
- 每个 server block 的
server_name写全:主域写firstskill.cn,子域写ai.firstskill.cn,别用通配偷懒(通配会让请求落到错误的站)。 default_server只给"兜底"的那个 block(我给了主域 443)。没匹配到 server_name 的请求会落到 default_server,所以 default 要是一个"安全的、不泄露其他站内容"的站。
证书路径各自独立
主域证书和子域证书是两套文件,别共用。共用会导致子域续签时动到主域证书路径,互相牵连。我按 /etc/nginx/ssl/<域名>/ 分目录放。
HSTS 的坑
主域开了 HSTS(max-age 一年)之后,浏览器对主域强制 https。但 HSTS 默认不覆盖子域,除非加 includeSubDomains。我没加,所以子域可以单独控制要不要 HSTS——这给了我给子域先跑 http 调试的空间。若你主域加了 includeSubDomains,子域就必须也有有效证书,否则子域直接打不开。
reload 前的三道保险
nginx -t语法检查- 改之前
cp一份当前配置到 .bak-日期 - reload 而不是 restart(reload 不断连接)
多站共存的本质是"隔离":文件隔离、server_name 隔离、证书隔离、default 兜底隔离。四件事做到位,加新站就是加一个文件,不会影响老站。
下一篇写这套配置下怎么给新子域名从零加 HTTPS(含 DNS 没生效时 certbot 会失败这个坑)。
← 返回首页