随机推荐

Nginx sites-available / sites-enabled 与多站点命名规范

目录

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 直接炸


正确姿势是:

  1. sites-available 里慢慢写
  2. nginx -t 本地检查
  3. 确认没问题
  4. 再建立软链接上线

这样可以避免:

  • 半成品配置被加载
  • 紧急回滚困难
  • 线上服务中断

八、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 = 应用商店里“已下载但未打开”的 App
  • sites-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

这个格式解决了三件事:

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

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

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–99default / 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 永远放最后
  • 配置乱,问题一定迟早来