Nginx 配置
概述
Nginx 在项目中有两个主要用途:
- Docker 容器内:管理后台前端(
yudao-admin)容器内置 Nginx,负责静态资源服务和 API 反向代理 - 生产环境:作为前端应用(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_files | SPA 路由支持,所有未匹配的路径回退到 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+)
- 检查
Upgrade和Connection头部是否正确配置
文件上传失败
- 检查
client_max_body_size是否足够大 - 确认后端
spring.servlet.multipart.max-file-size配置一致