Nginx 多项目配置与部署实践

1. 场景说明

当一台服务器需要同时托管多个静态站点或前端应用时,Nginx 的核心任务是把请求稳定地映射到正确的站点目录。

常见场景包括:

  • 单台服务器承载多个独立站点
  • 没有独立域名,只能通过路径区分多个项目
  • 需要统一管理配置文件、软链接、权限与重载流程

本文重点解决以下问题:

  • 多项目部署时目录应如何组织
  • 多站点应通过域名、端口还是路径区分
  • 配置修改后如何验证与发布

2. 推荐目录结构

推荐同时遵循 Nginx 配置目录与站点目录两套结构。

/etc/nginx/
├── nginx.conf
├── sites-available/
│   ├── default
│   ├── project1
│   └── project2
├── sites-enabled/
│   ├── default -> ../sites-available/default
│   └── project1 -> ../sites-available/project1
├── conf.d/
├── snippets/
└── mime.types
 
/var/www/
├── project1/
├── project2/
└── html/

目录约定:

  • sites-available/ 用于存放配置模板,不自动生效
  • sites-enabled/ 只存放软链接,表示当前已启用站点
  • /var/www/项目名/ 用于存放站点产物,便于统一权限管理

3. 配置方式选择

3.1 域名区分

适用于每个项目都有独立域名的场景。

server {
    listen 80;
    server_name project1.example.com www.project1.example.com;
    root /var/www/project1;
    index index.html;
 
    location / {
        try_files $uri $uri/ =404;
    }
}
 
server {
    listen 80;
    server_name project2.example.com www.project2.example.com;
    root /var/www/project2;
    index index.html;
 
    location / {
        try_files $uri $uri/ =404;
    }
}

特点:

  • 配置语义清晰
  • 便于 HTTPS、缓存与日志按站点隔离
  • 适合正式生产环境

3.2 端口区分

适用于测试环境或有明确端口隔离需求的场景。

server {
    listen 80;
    server_name _;
    root /var/www/project1;
}
 
server {
    listen 8080;
    server_name _;
    root /var/www/project2;
}

特点:

  • 实现简单
  • 需要额外开放端口
  • 用户访问体验与防火墙管理成本较高

3.3 路径区分

适用于没有独立域名、需要在同一入口下挂多个项目的场景。

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
 
    location /project1 {
        alias /var/www/project1;
        index index.html;
        try_files $uri $uri/ /project1/index.html;
    }
 
    location /project2 {
        alias /var/www/project2;
        index index.html;
        try_files $uri $uri/ /project2/index.html;
    }
 
    location / {
        root /var/www/html;
        index index.html;
        try_files $uri $uri/ =404;
    }
}

特点:

  • 只需要维护一个统一入口
  • 适合静态资源站点或前端多项目共存
  • 项目构建配置必须同步设置基础路径

4. 推荐部署流程

4.1 单项目发布

mkdir -p /var/www/project
cp -R dist/* /var/www/project/
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/project
ln -s /etc/nginx/sites-available/project /etc/nginx/sites-enabled/project
nginx -t
systemctl reload nginx

4.2 多项目发布

  1. 为每个项目建立独立站点目录。
  2. sites-available/ 中创建对应配置文件。
  3. 根据部署方式配置 server_namelistenlocation
  4. 用软链接把需要启用的配置挂到 sites-enabled/
  5. 执行 nginx -t 后再重载服务。

5. 配置优化建议

5.1 主配置中的通用优化

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;
 
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript;
 
    open_file_cache max=10000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
}

5.2 可复用安全头

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

建议把这类内容抽到 snippets/security-headers.conf,在站点配置中通过 include 复用。

6. 常用运维命令

# 验证配置语法
nginx -t
 
# 输出完整配置
nginx -T
 
# 重载配置
systemctl reload nginx
 
# 重启服务
systemctl restart nginx
 
# 查看运行状态
systemctl status nginx
 
# 查看访问日志
tail -f /var/log/nginx/access.log
 
# 查看错误日志
tail -f /var/log/nginx/error.log

7. 验证清单

  • 项目产物已部署到正确目录
  • 配置文件位于 sites-available/
  • sites-enabled/ 中只保留需要启用的软链接
  • 执行 nginx -t 通过
  • 重载后访问路径与资源路径均正常
  • 错误日志中没有新增语法错误或路径错误

8. 最佳实践

  • 有独立域名时,优先使用域名区分,而不是路径区分
  • 路径区分方案必须与前端项目的基础路径配置同步
  • 不要直接在 sites-enabled/ 中手写配置文件
  • 配置调整前后都保留一份可回滚版本
  • 每次变更后先验证,再执行重载

9. 相关笔记