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 nginx4.2 多项目发布
- 为每个项目建立独立站点目录。
- 在
sites-available/中创建对应配置文件。 - 根据部署方式配置
server_name、listen或location。 - 用软链接把需要启用的配置挂到
sites-enabled/。 - 执行
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.log7. 验证清单
- 项目产物已部署到正确目录
- 配置文件位于
sites-available/ -
sites-enabled/中只保留需要启用的软链接 - 执行
nginx -t通过 - 重载后访问路径与资源路径均正常
- 错误日志中没有新增语法错误或路径错误
8. 最佳实践
- 有独立域名时,优先使用域名区分,而不是路径区分
- 路径区分方案必须与前端项目的基础路径配置同步
- 不要直接在
sites-enabled/中手写配置文件 - 配置调整前后都保留一份可回滚版本
- 每次变更后先验证,再执行重载