Nginx 目录结构 + 配置规范 + 生产最佳实践完整指南

一、先解决你最大的疑惑:conf.d vs sites-available

1. 核心结论(直接照做)

  • CentOS 习惯:只用 conf.d/

  • Ubuntu 习惯:sites-available + sites-enabled

  • 你的系统两个目录都生效,属于 Ubuntu 标准双加载模式

  • 绝对禁止:同一个站点两份配置(conf.d一份、sites一份)= 冲突、500、启动报错

2. 两个目录本质区别(一句话)

  • conf.d/:全局配置目录,放通用配置、反向代理、公共参数,只要是 *.conf 自动加载

  • sites-available/:站点仓库,存放所有网站配置,本身不生效

  • sites-enabled/:真正生效目录,只放软链接,Nginx 只读取这里的配置

3. 官方标准加载逻辑(Ubuntu 默认)

主配置 nginx.conf 末尾默认包含两行:

# 加载通用配置
include /etc/nginx/conf.d/*.conf;
# 加载已启用站点
include /etc/nginx/sites-enabled/*;

👉 两个目录都会生效,所以必须统一规范,不能混用


二、Nginx 完整目录结构(Ubuntu 标准)

/etc/nginx/
├── nginx.conf              # 主配置(全局参数、超时、连接数、引入子配置)
├── conf.d/                 # 通用配置目录【推荐放:代理、超时、SSL、公共规则】
├── sites-available/        # 所有站点配置仓库【存放所有网站、反向代理原始文件】
├── sites-enabled/          # 生效站点【仅软链接,禁止直接改这里】
├── snippets/               # 通用片段(证书、代理头部、缓存规则)
├── mime.types
└── fastcgi_params

# 日志目录
/var/log/nginx/
├── access.log              # 访问日志
└── error.log               # 错误日志(排查500/504必看)

# 网页根目录
/usr/share/nginx/html/

三、生产环境唯一最佳规范(直接照搬)

场景1:单站点 / 简单反向代理(你的 Gerrit 属于这种)

✅ 推荐使用:conf.d/

优势:不用软链接、简单、不易出错、适合运维少的服务

示例:

/etc/nginx/conf.d/gerrit.conf

❌ 禁止:同时在 sites-available 再建一份 gerrit 配置

场景2:多站点、频繁启停网站、正式业务集群

✅ 推荐使用:sites-available + sites-enabled

规范:

  • 写配置:sites-available/xxx

  • 启用站点:创建软链接到 sites-enabled

  • 停用站点:删除 sites-enabled 软链接(不删配置文件)

优势:切换业务零风险、配置可留存、规范干净


四、统一清理规则(解决你现在双目录混乱问题)

现状:两个目录都有配置 → 极易冲突

最终统一方案(推荐)

  1. 所有业务站点/反向代理统一放 conf.d/

  2. 清空 sites-enabled、sites-available 多余业务配置

  3. 只保留 nginx 默认 default 模板即可

操作命令:

# 进入目录清理冲突配置
rm -f /etc/nginx/sites-enabled/你的业务配置
rm -f /etc/nginx/sites-available/你的业务配置

五、Nginx 改配置 4步标准生产流程(零事故)

所有修改必须遵守,避免 Nginx 挂掉

# 1. 备份(必做)
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

# 2. 修改配置
vim /etc/nginx/conf.d/gerrit.conf

# 3. 校验语法(错了直接提示,不会崩服务)
nginx -t

# 4. 平滑重载(不中断业务)
nginx -s reload
# 或
systemctl reload nginx

六、反向代理通用标准模板(适配 Gerrit / Jenkins / 所有后端)

新建 /etc/nginx/conf.d/gerrit.conf

server {
    listen 80;
    server_name 你的域名或IP;

    location / {
        proxy_pass http://127.0.0.1:8080;

        # 标准代理头部(必备)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 超时参数(解决 500/504 超时报错)
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }
}

七、日常排查命令(必备)

# 查看所有生效配置(终极排查,看是否重复)
nginx -T

# 实时看错误日志
tail -f /var/log/nginx/error.log

# 查看 Nginx 状态
systemctl status nginx

# 重启(尽量少用)
systemctl restart nginx

八、终极避坑总结(记住这4句话)

  1. conf.d = 通用配置、简单反向代理、全局参数

  2. sites 系列 = 多站点管理、启停管理

  3. 绝不双目录存放同一个站点配置

  4. 改配置必先校验、再重载,禁止直接重启

(注:部分内容可能由 AI 生成)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐