跳到主要内容

Nginx 配置

概述

Nginx 在项目中有两个主要用途:

  1. Docker 容器内:管理后台前端(yudao-admin)容器内置 Nginx,负责静态资源服务和 API 反向代理
  2. 生产环境:作为前端应用(H5/小程序)和后端 API 的反向代理服务器

Docker 容器内 Nginx

管理后台前端 Docker 镜像内置了 Nginx 配置,核心功能:

基础配置

server {
listen 80;
server_name localhost;

# 前端静态资源
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html; # SPA 路由支持
}

# API 反向代理
location /prod-api/ {
proxy_pass http://yudao-server:48080/;
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;
}
}

关键配置说明

配置项说明
try_filesSPA 路由支持,所有未匹配的路径回退到 index.html
/prod-api/将前端请求代理到后端服务,去除 /prod-api 前缀
proxy_set_header传递真实客户端 IP 和协议信息

生产环境 Nginx 配置

H5 前端部署

server {
listen 80;
server_name mall.example.com;

# Gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_min_length 1024;

# H5 前端静态资源
root /var/www/h5-dist;
index index.html;

# SPA 路由
location / {
try_files $uri $uri/ /index.html;
}

# API 反向代理
location /app-api/ {
proxy_pass http://127.0.0.1:48080;
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;

# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

# 超时配置
proxy_connect_timeout 60s;
proxy_read_timeout 120s;
proxy_send_timeout 60s;
}

# 管理后台 API
location /admin-api/ {
proxy_pass http://127.0.0.1:48080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}

HTTPS 配置

server {
listen 443 ssl http2;
server_name mall.example.com;

ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

# ... 其余配置同上
}

# HTTP 重定向到 HTTPS
server {
listen 80;
server_name mall.example.com;
return 301 https://$host$request_uri;
}

微信小程序代理

微信小程序要求所有请求使用 HTTPS,且域名需要在小程序后台配置白名单:

server {
listen 443 ssl;
server_name api.example.com;

ssl_certificate /etc/nginx/ssl/api.example.com.pem;
ssl_certificate_key /etc/nginx/ssl/api.example.com.key;

location /app-api/ {
proxy_pass http://127.0.0.1:48080;
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;
}
}

Gzip 压缩

生产环境建议开启 Gzip 压缩以减少传输体积:

gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml
application/rss+xml
image/svg+xml;

文件上传大小限制

后端配置了 250MB 的文件上传限制,Nginx 需要同步调整:

client_max_body_size 250m;

WebSocket 代理

系统支持 WebSocket 通信(路径 /infra/ws),Nginx 需要额外配置:

location /infra/ws {
proxy_pass http://127.0.0.1:48080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400; # WebSocket 长连接保持 24 小时
}

负载均衡(可选)

当后端需要多实例部署时:

upstream backend {
server 127.0.0.1:48080 weight=3;
server 127.0.0.1:48081 weight=2;
server 127.0.0.1:48082 backup;
}

server {
location /app-api/ {
proxy_pass http://backend;
}
}

安全配置

# 隐藏 Nginx 版本号
server_tokens off;

# 防止点击劫持
add_header X-Frame-Options SAMEORIGIN;

# 防止 MIME 类型嗅探
add_header X-Content-Type-Options nosniff;

# XSS 防护
add_header X-XSS-Protection "1; mode=block";

常见问题

API 请求 502

  • 检查后端服务是否正常运行
  • 检查 proxy_pass 地址和端口是否正确
  • 查看 Nginx 错误日志:/var/log/nginx/error.log

WebSocket 连接失败

  • 确认 Nginx 版本支持 WebSocket(1.3.13+)
  • 检查 UpgradeConnection 头部是否正确配置

文件上传失败

  • 检查 client_max_body_size 是否足够大
  • 确认后端 spring.servlet.multipart.max-file-size 配置一致

Nginx����

���ĵ����ڽ����У������ڴ���