Nginx 的工作方式–彻底理解 sites-available / sites-enabled 两级结构
在 Debian / Ubuntu 系列系统中,Nginx 的配置结构不是随意设计的,而是一套经过长期验证、非常适合生产环境的模型。
如果你真正理解了这套结构:
- 多站点管理会非常清晰
- 上线 / 下线站点不再紧张
- 不会再遇到“配置明明写了却不生效”的问题
本文会把这件事一次讲透。
一、Nginx 在 Debian / Ubuntu 下的默认设计
在这些系统中,Nginx 默认采用 两级站点配置结构:
/etc/nginx/
├── sites-available/
└── sites-enabled/
这不是多余设计,而是有明确分工的。
二、sites-available:站点配置的“仓库”
路径:
/etc/nginx/sites-available/
它的职责只有一个:
存放所有“可能会用到”的站点配置文件
特点:
- 可以放很多
.conf - 可以是草稿、未完成配置
- 可以暂时不用
- 放在这里 ≠ 生效
你可以理解为:
sites-available = 配置仓库 / 草稿箱
三、sites-enabled:真正被加载的配置
路径:
/etc/nginx/sites-enabled/
Nginx 能读到这个目录,是因为在主配置文件 nginx.conf 中,通常有这样一句:
include /etc/nginx/sites-enabled/*;
这句话的含义非常关键:
只有在
sites-enabled里的配置,Nginx 才会真正加载
也就是说:
sites-available:不加载sites-enabled:一定加载
你可以理解为:
sites-enabled = 已上线 / 已启用的站点
四、那为什么不直接把配置写在 sites-enabled?
这是很多新手都会问的问题。
答案是:可以,但不推荐。 原因主要有三点,而且都非常现实。
五、原因一:启用 / 禁用站点极其方便
使用软链接,你只需要两个命令:
启用站点
ln -s /etc/nginx/sites-available/a.conf /etc/nginx/sites-enabled/a.conf
禁用站点
rm /etc/nginx/sites-enabled/a.conf
特点:
- 不改配置文件内容
- 不改
nginx.conf - 不会误删原始配置
- 可随时恢复
这在生产环境里非常重要
六、原因二:这是 Debian 官方推荐模型
不仅 Nginx,Apache 也是同样的设计:
- sites-available
- sites-enabled
系统包、运维工具、自动化脚本,都默认你这么用。
如果你偏离这个结构:
- 后续维护成本会上升
- 别人接手时会很痛苦
- 某些工具会“假设错误”
遵循约定,比自定义更稳
七、原因三:避免“误加载半成品配置”
这是一个非常容易踩的坑。
如果你直接在 sites-enabled 里写配置:
- 写到一半
- 有语法问题
- 有未完成的 server 块
只要你一 reload:
nginx -t
systemctl reload nginx
Nginx 直接炸
正确姿势是:
- 在
sites-available里慢慢写 nginx -t本地检查- 确认没问题
- 再建立软链接上线
这样可以避免:
- 半成品配置被加载
- 紧急回滚困难
- 线上服务中断
八、ln -sf 到底做了什么?
你经常会看到这样的命令:
ln -sf /etc/nginx/sites-available/discourse-root.conf
/etc/nginx/sites-enabled/discourse-root.conf
我们把它拆开来看。
ln 是什么?
ln = 创建链接
-s:symbolic link(软链接)
-s = 不复制文件,只创建“指向关系”
效果是:
sites-enabled/discourse-root.conf
└──→ sites-available/discourse-root.conf
修改任意一边,另一边自动生效。
-f:force(强制)
-f = 如果目标已存在,强制覆盖
好处:
- 不用先 rm
- 不怕重复执行
- 自动化脚本更安全
九、本质理解(非常重要)
你真正做的事情是:
用一个“开关文件”控制某个站点是否被加载
- 开关在:sites-enabled
- 实体文件在:sites-available
这是一种非常成熟的配置管理思想。
十、一个非常形象的比喻
sites-available= 应用商店里“已下载但未打开”的 Appsites-enabled= 手机桌面上“正在运行”的 App
你下载了 ≠ 你在用 你写了配置 ≠ Nginx 会加载
软链接 = 点了“打开”
十一、实战建议(经验总结)
- 永远在
sites-available写配置 - 永远用软链接控制启用
- 不直接编辑
sites-enabled里的文件 - 所有上线动作都可以回滚
这是长期维护 Nginx 的最佳实践。
十二、小结
如果你只记住一句话:
写配置 ≠ 启用配置 软链接 = 上线
理解这一点,你就已经超过了很多“会用但不懂”的 Nginx 用户。
Nginx 多站点命名规范与排序技巧
写给“站点一多就乱”的人
当 Nginx 从 1 个站点变成 5 个、10 个甚至更多 时,
真正拉开差距的,已经不是会不会写 server {},而是:
你能不能让自己和后来的人“一眼看懂”配置结构
这篇文章专门解决这个问题。
一、为什么“命名 + 排序”很重要?
Nginx 在加载站点时:
- 会 按 include 顺序读取文件
- 再 按 server_name / listen / default_server 决定匹配
如果你的文件名是这样:
a.conf
test.conf
new.conf
final.conf
final2.conf
那么:
- 你自己三个月后都看不懂
- 排查冲突非常痛苦
- 新加站点时容易“误命中”
多站点不是难,乱才是难
二、推荐的总体命名规则(核心原则)
推荐格式
序号-用途-域名.conf
例如:
10-root-noth.me.conf
20-docker.noth.me.conf
30-app.noth.me.conf
99-default-deny.conf
这个格式解决了三件事:
- 顺序可控
- 用途清晰
- 域名一眼可见
三、为什么一定要加“数字前缀”?
Nginx 的 include 顺序是:
include /etc/nginx/sites-enabled/*;
而 * 的顺序,本质上是 文件名排序顺序。
也就是说:
10-xxx.conf
20-yyy.conf
一定会先加载 10-,再加载 20-。
不加数字会发生什么?
app.conf
default.conf
docker.conf
加载顺序不可控:
- 跟字母
- 跟命名习惯
- 跟运气
数字前缀的实际意义
| 范围 | 含义 |
|---|---|
| 00–09 | 全局 / redirect / 保留 |
| 10–49 | 正常业务站点 |
| 50–89 | 特殊用途 |
| 90–99 | default / deny / 兜底 |
四、推荐的站点类型排序
HTTP → HTTPS 跳转(最前)
00-redirect-http.conf
通常只做一件事:
return 301 https://$host$request_uri;
核心业务站点
10-root-noth.me.conf
20-docker.noth.me.conf
30-app.noth.me.conf
一个站点 = 一个文件 绝不混写
后台 / 管理类站点
40-admin.example.com.conf
通常会加:
- IP 白名单
- Basic Auth
- 更严格策略
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 永远放最后
- 配置乱,问题一定迟早来