Nginx 多站点命名规范与排序技巧

写给“站点一多就乱”的人

当 Nginx 从 1 个站点变成 5 个、10 个甚至更多 时, 真正拉开差距的,已经不是会不会写 server {},而是:

你能不能让自己和后来的人“一眼看懂”配置结构

这篇文章专门解决这个问题。


一、为什么“命名 + 排序”很重要?

Nginx 在加载站点时:

  • 按 include 顺序读取文件
  • 按 server_name / listen / default_server 决定匹配

如果你的文件名是这样:

a.conf
test.conf
new.conf
final.conf
final2.conf

那么:

  • 你自己三个月后都看不懂
  • 排查冲突非常痛苦
  • 新加站点时容易“误命中”

:backhand_index_pointing_right: 多站点不是难,乱才是难


二、推荐的总体命名规则(核心原则)

推荐格式

序号-用途-域名.conf

例如:

10-root-noth.me.conf
20-docker.noth.me.conf
30-app.noth.me.conf
99-default-deny.conf

这个格式解决了三件事:

  1. 顺序可控
  2. 用途清晰
  3. 域名一眼可见

三、为什么一定要加“数字前缀”?

Nginx 的 include 顺序是:

include /etc/nginx/sites-enabled/*;

* 的顺序,本质上是 文件名排序顺序

也就是说:

10-xxx.conf
20-yyy.conf

一定会先加载 10-,再加载 20-


不加数字会发生什么?

app.conf
default.conf
docker.conf

加载顺序不可控:

  • 跟字母
  • 跟命名习惯
  • 跟运气 :sweat_smile:

数字前缀的实际意义

范围 含义
00–09 全局 / redirect / 保留
10–49 正常业务站点
50–89 特殊用途
90–99 default / deny / 兜底

四、推荐的站点类型排序

:one: HTTP → HTTPS 跳转(最前)

00-redirect-http.conf

通常只做一件事:

return 301 https://$host$request_uri;

:two: 核心业务站点

10-root-noth.me.conf
20-docker.noth.me.conf
30-app.noth.me.conf

一个站点 = 一个文件 绝不混写


:three: 后台 / 管理类站点

40-admin.example.com.conf

通常会加:

  • IP 白名单
  • Basic Auth
  • 更严格策略

:four: default / deny 兜底(最后)

99-default-deny.conf

防止:

  • IP 直连
  • 野生 Host 头
  • 被扫命中

五、文件名里应该包含什么?

推荐包含

  • 用途(root / docker / app / admin)
  • 域名(避免点开才知道)

例如:

20-docker-noth.me.conf

不推荐这样命名

prod.conf
new.conf
v2.conf
final.conf

这些名字:

  • 没信息量
  • 三个月后必后悔

六、server_name 与文件名的关系

强烈建议:

文件名 = server_name

例如:

server_name docker.noth.me;

文件名:

20-docker.noth.me.conf

好处:

  • grep / 查找极快
  • 新人秒懂
  • 不易误删

七、default_server 的排序技巧(重要)

兜底站点建议:

server {
    listen 80 default_server;
    server_name _;
    return 444;
}

并放在:

99-default-deny.conf

这样可以确保:

  • 所有未命中域名都被挡掉
  • 不会抢正常站点

八、软链接命名是否也要一致?

是的,强烈建议一致。

推荐:

ln -sf \
  /etc/nginx/sites-available/20-docker.noth.me.conf \
  /etc/nginx/sites-enabled/20-docker.noth.me.conf

不要写成:

sites-enabled/docker.conf

九、一个“理想的”多站点目录示例

/etc/nginx/
├── sites-available/
│   ├── 00-redirect-http.conf
│   ├── 10-root-noth.me.conf
│   ├── 20-docker.noth.me.conf
│   ├── 30-app.noth.me.conf
│   └── 99-default-deny.conf
├── sites-enabled/
│   ├── 10-root-noth.me.conf -> ../sites-available/10-root-noth.me.conf
│   ├── 20-docker.noth.me.conf -> ../sites-available/20-docker.noth.me.conf
│   └── 99-default-deny.conf -> ../sites-available/99-default-deny.conf

十、经验总结(踩坑换来的)

  • 数字前缀不是装饰,是控制顺序
  • 文件名是给“未来的自己”看的
  • 一个站点一个文件
  • default 永远放最后
  • 配置乱,问题一定迟早来