Nginx 反向代理配置教程:实现负载均衡、缓存与HTTPS部署(2026)
前言:为什么需要 Nginx 反向代理?
在实际生产环境中,我们通常不会让应用服务器(如 Node.js、Python Flask、Java Tomcat)直接暴露在公网。原因很简单:应用服务器往往不擅长处理静态资源、并发连接管理、SSL/TLS 终止和安全防护。这时就需要 Nginx 反向代理 出场。
反向代理(Reverse Proxy)位于客户端与后端服务器之间,接收客户端的请求,再转发给后端服务器,最后将后端服务器的响应返回给客户端。Nginx 作为反向代理,能帮你实现:
- 负载均衡:将请求分发到多台后端服务器
- SSL 终结:统一处理 HTTPS,后端服务只需 HTTP
- 缓存加速:缓存静态内容或 API 响应
- 安全防护:隐藏后端真实 IP,抵御 DDoS
- 动静分离:静态文件由 Nginx 直接响应
本文将从零开始,带你掌握 Nginx 反向代理的完整配置。
环境准备
- Ubuntu 22.04 / 24.04 LTS 服务器
- Nginx >= 1.18(最新稳定版 1.26.x)
- 已安装的后端服务(如 Python Flask 运行在 127.0.0.1:5000)
- 域名已解析到服务器 IP(可选,HTTPS 需要)
- sudo / root 权限
步骤一:安装 Nginx
首先确保 Nginx 已安装。Ubuntu 默认源中的版本较老,建议使用官方源安装最新稳定版:
# 安装依赖
sudo apt update
sudo apt install -y curl gnupg2 ca-certificates lsb-release
# 添加 Nginx 官方源
echo "deb http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
# 安装 Nginx
sudo apt update
sudo apt install -y nginx
# 验证安装
nginx -v
# 输出示例:nginx version: nginx/1.26.2
启动并设置为开机自启:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
# 输出示例:
# ● nginx.service - nginx
# Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: enabled)
# Active: active (running) since Mon 2026-05-15 09:00:00 CST
测试:在浏览器访问服务器 IP,看到 Welcome to nginx! 即安装成功。
步骤二:基础反向代理配置
假设后端有一个 Python Flask 应用运行在 http://127.0.0.1:5000,我们希望用户访问 http://yourdomain.com/api/ 时,Nginx 将请求转发给 Flask 应用。
在 Nginx 配置目录中创建一个新的配置文件:
sudo vim /etc/nginx/conf.d/reverse-proxy.conf
写入以下配置:
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://127.0.0.1:5000;
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;
}
location /static/ {
alias /var/www/myapp/static/;
expires 7d;
add_header Cache-Control "public, immutable";
}
}
配置说明:
proxy_pass:将请求转发到后端地址proxy_set_header:保留客户端的真实 IP、协议等信息location /static/:静态资源由 Nginx 直接响应,不走后端
测试配置并重载 Nginx:
# 检查配置语法
sudo nginx -t
# 输出示例:nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# 输出示例:nginx: configuration file /etc/nginx/nginx.conf test is successful
# 重载 Nginx(不中断现有连接)
sudo nginx -s reload
步骤三:配置负载均衡
当单台后端服务器扛不住流量时,需要负载均衡。Nginx 支持多种负载均衡算法:
- round-robin(默认):轮流分发
- least_conn:优先分给连接数最少的服务器
- ip_hash:同一 IP 始终分配到同一台服务器(会话保持)
- weight:按权重分配,权重越高流量越多
以下配置将请求分发到 3 台后端服务器:
upstream backend_servers {
# 默认 round-robin
server 10.0.0.1:5000 weight=3;
server 10.0.0.2:5000 weight=2;
server 10.0.0.3:5000 weight=1;
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://backend_servers;
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;
# 健康检查:超时3秒,失败3次后标记为不可用
proxy_connect_timeout 3s;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
}
}
健康检查小技巧:如果你的后端有 /health 端点,可以单独配置 Nginx 做主动健康检查(Nginx Plus 支持原生,开源版可用 nginx_upstream_check_module 或通过 proxy_next_upstream 实现被动检测)。
步骤四:配置 HTTPS(SSL/TLS)
现代网站必须启用 HTTPS。推荐使用 Let’s Encrypt 免费证书,自动续期。
安装 Certbot
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot 会自动修改 Nginx 配置,添加 SSL 相关指令。最终生成的 HTTPS 配置类似:
server {
listen 443 ssl http2;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
# SSL 安全加固
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
location / {
proxy_pass http://127.0.0.1:5000;
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;
}
# HTTP 自动跳转 HTTPS
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
}
证书自动续期:
# 测试续期流程
sudo certbot renew --dry-run
# certbot 会自动创建 systemd timer,每天检查续期
sudo systemctl status certbot.timer
步骤五:配置缓存加速
Nginx 可以缓存后端响应,大幅降低后端压力。适用于 API 响应、静态页面等。
# 在 http 块或 server 块中定义缓存路径
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m use_temp_path=off;
server {
listen 80;
server_name yourdomain.com;
location /api/ {
proxy_pass http://127.0.0.1:5000;
proxy_cache mycache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503;
# 添加缓存状态标识(方便调试)
add_header X-Cache-Status $upstream_cache_status;
}
}
缓存策略选择:
- 动态 API:不缓存或短缓存(1-5分钟)
- 静态资源:长缓存(7-30天),配合版本号更新
- 全页缓存:适合 WordPress 等 CMS,大幅提升 TTFB
步骤六:常见进阶配置
WebSocket 反向代理
location /ws/ {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400s;
}
限制请求速率(防爬虫)
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://127.0.0.1:5000;
}
大文件上传配置
client_max_body_size 100m;
proxy_request_buffering off;
location /upload/ {
proxy_pass http://127.0.0.1:5000;
proxy_buffering off;
}
常见问题(FAQ)
Q1: 配置后访问出现 502 Bad Gateway,怎么办?
502 通常表示 Nginx 无法连接到后端服务器。排查步骤:① 确认后端服务是否启动 sudo systemctl status your-app;② 检查后端监听地址是否正确 ss -tlnp | grep 5000;③ 确认防火墙放行 sudo ufw status;④ 查看 Nginx 错误日志 sudo tail -f /var/log/nginx/error.log。最常见原因是后端绑定了 127.0.0.1 但 Nginx 用了 localhost —— 确保后端监听 0.0.0.0:5000 或两者都用 127.0.0.1。
Q2: 反向代理后后端获取不到客户端真实 IP?
这是最常见的配置遗漏。确保在 Nginx 的 location 中正确设置了 proxy_set_header X-Real-IP $remote_addr 和 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for。同时,后端应用需要从这些请求头中读取真实 IP。例如 Flask 应用安装 flask-reverse-proxy-fix 中间件,Django 设置 USE_X_FORWARDED_HOST = True 和 SECURE_PROXY_SSL_HEADER。
Q3: Nginx 负载均衡中,某台后端挂了会影响整个服务吗?
不会。Nginx 的 proxy_next_upstream 指令会自动将失败的请求转发到下一台可用服务器。建议配置 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503。配合 max_fails=3 fail_timeout=30s 参数,Nginx 会在 30 秒内标记连续失败 3 次的后端为不可用,不再向其转发请求,30 秒后自动恢复尝试。
总结
本文从零开始,完成了 Nginx 反向代理的完整配置:从基础安装、单点代理到负载均衡、HTTPS 部署和缓存加速。核心要点:
- 反向代理是生产环境部署的标配,Nginx 是最流行的选择
- 正确传递客户端 IP 需要
proxy_set_header系列指令 - 负载均衡建议配合健康检查和
proxy_next_upstream - HTTPS 推荐 Let’s Encrypt 自动续期,别忘了禁用不安全的 TLS 版本
- 缓存配置需要根据业务场景选择策略
如果你在寻找后端应用搭建教程,可以参考 Python 实战:用 FastAPI 和 Pandas 搭建实时 A 股行情看板 来构建自己的后端服务。同时,VS Code + GitHub Copilot 能帮你提升编码效率。更多 Linux 运维技巧请查看 Python requests 库教程。