Nginx 没有 sites-available 目录怎么办?
sites-available/sites-enabled 只是 Debian/Ubuntu 的约定不是 Nginx 原生结构;CentOS 用 conf.d,自编译只有 nginx.conf;附三种环境下管理虚拟主机的正确姿势与 FAQ。
别慌——sites-available/sites-enabled 从来不是 Nginx 的原生概念,只是 Debian/Ubuntu 打包时发明的管理约定。 CentOS/RHEL、官方 Docker 镜像、自编译的 Nginx 都没有它,用对应的结构即可。
先弄清你处在哪种环境
Debian/Ubuntu(有 sites-* 约定)
/etc/nginx/
├── nginx.conf # 主配置,http 块里 include 了 sites-enabled/*
├── sites-available/ # 所有站点的配置文件(仓库)
└── sites-enabled/ # 软链到 available,链上的才生效
目录被删了就重建:
sudo mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled
# 确认 nginx.conf 的 http 块里有这行:
# include /etc/nginx/sites-enabled/*;
CentOS/RHEL/Fedora(用 conf.d)
这些发行版的约定是所有站点配置直接放 /etc/nginx/conf.d/*.conf,主配置 include 整个目录:
# /etc/nginx/nginx.conf 的 http 块里
include /etc/nginx/conf.d/*.conf;
新建站点 = 在 conf.d/ 里新建 mysite.conf,不需要"启用"动作。没有 sites-available 是完全正常的。
官方 Docker 镜像 / 自编译
- 官方
nginx镜像:站点配置放/etc/nginx/conf.d/(挂载你自己的 conf 进去)。 - 自编译:默认只有
nginx.conf,自己加一行include /path/to/vhosts/*.conf;就能造出同样的结构。
想自己造一套 sites-enabled 机制
任何环境都可以手工复刻这个约定:
# nginx.conf 的 http 块里加
include /etc/nginx/sites-enabled/*;
sudo mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled
# 新站点:在 available 建配置,再软链启用
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# 下线站点:删软链,配置本体还在
sudo rm /etc/nginx/sites-enabled/mysite
这套"仓库 + 软链启用"的模式对运维很友好,建议团队内部统一采用(或不采用,二选一,别混)。
观测云对照
站点配置分散在多处(conf.d、sites-enabled、手工 include)时,"这个域名到底由哪份配置处理"会随规模增长变得难以回答。nginx -T 导出完整生效配置是终极答案;同时把访问日志按 host 聚合到观测云,域名流量与配置的对应关系用数据说话,比翻文件可靠。
常见问题(FAQ)
Q:sites-enabled 里直接放文件(不软链)可以吗?
A:可以,Nginx 只看 include 到的内容,不在乎是不是软链。软链只是方便"下线不删文件"的管理习惯。
Q:conf.d 和 sites-enabled 同时存在会冲突吗?
A:不会冲突——两个 include 都会加载。但同一域名在两处都有 server 块会触发 conflicting server name 警告。建议团队约定只用一处。
Q:nginx -t 报 include 路径不存在?
A:include /etc/nginx/sites-enabled/*; 的目录不存在或为空时,部分版本会报错。建个空目录或先放一个占位 conf 即可。