Nginx 反向代理配置教程:实现负载均衡、缓存与HTTPS部署(2026)

📝 701 字 · ☕ 2 分钟阅读

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_addrproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for。同时,后端应用需要从这些请求头中读取真实 IP。例如 Flask 应用安装 flask-reverse-proxy-fix 中间件,Django 设置 USE_X_FORWARDED_HOST = TrueSECURE_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 库教程

📤 分享这篇文章