Nginx 反向代理与负载均衡配置详解
Nginx 是最流行的 Web 服务器和反向代理。无论是部署前后端分离项目、做负载均衡,还是配置 HTTPS,都绕不开它。
正向代理 vs 反向代理
- 正向代理:代理客户端(如 VPN),服务端不知道真正的客户端是谁
- 反向代理:代理服务端(如 Nginx),客户端不知道真正的服务端是谁
基础反向代理
最经典的场景:前端部署在 Nginx,API 请求代理到后端。
nginx
server {
listen 80;
server_name example.com;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
location /api/ {
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_pass 的路径规则
最容易搞错的地方——proxy_pass 末尾有没有 /,行为完全不同:
nginx
# 带 / :/api/users -> http://backend/users(去掉 /api 前缀)
location /api/ {
proxy_pass http://backend/;
}
# 不带 / :/api/users -> http://backend/api/users(保留完整路径)
location /api/ {
proxy_pass http://backend;
}负载均衡
加权轮询
nginx
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=5;
}IP 哈希(会话保持)
同一客户端 IP 始终路由到同一台后端:
nginx
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}健康检查
nginx
upstream backend {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}HTTPS 配置
使用 Let's Encrypt 免费证书
bash
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
sudo certbot renew --dry-run # 测试自动续期手动配置 SSL
nginx
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
add_header Strict-Transport-Security "max-age=31536000" always;
add_header X-Frame-Options SAMEORIGIN;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://backend;
}
}缓存配置
静态资源缓存
nginx
location ~* \.(js|css|png|jpg|jpeg|gif|svg|woff2?)$ {
root /usr/share/nginx/html;
expires 30d;
add_header Cache-Control "public, immutable";
}
location ~* \.html$ {
root /usr/share/nginx/html;
add_header Cache-Control "no-cache";
}限流
nginx
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
}
}常用运维命令
bash
sudo nginx -t # 测试配置语法
sudo nginx -s reload # 热重载配置(不中断连接)
sudo nginx -s stop # 停止
sudo nginx -T # 打印完整配置小结
Nginx 反向代理的核心就是 location + proxy_pass。在此基础上加上负载均衡(upstream)、缓存(proxy_cache)、限流(limit_req)和 HTTPS,就能覆盖绝大多数生产环境的运维需求。