Nginx 反向代理配置:负载均衡与静态资源

FreeGuideOnline 最新 2026-06-13

什么是 Nginx 反向代理

反向代理是位于客户端与后端服务器之间的中间层。客户端的所有请求首先到达 Nginx,由 Nginx 根据配置规则将请求转发给后端服务器处理,再将响应返回给客户端。对客户端而言,反向代理就像原始服务器一样工作。

与正向代理(代表客户端访问外部资源)不同,反向代理代表服务器接收请求,主要优势包括:

  • 安全隔离:隐藏后端真实服务器信息,客户端只能看到 Nginx。
  • 负载均衡:将流量分配到多台后端服务器,提高可用性与性能。
  • SSL 终端:集中处理 HTTPS 加密,减轻后端压力。
  • 缓存与压缩:加速静态资源响应,降低带宽消耗。
  • 统一入口:多个应用通过同一域名或 IP 的不同路径对外提供服务。

本教程将带领你从零开始配置 Nginx 反向代理,并讲解负载均衡、静态资源处理等核心场景。


环境准备与 Nginx 安装

如果尚未安装 Nginx,可以根据操作系统选择以下命令快速部署。本文以 Ubuntu/Debian 和 CentOS 为例。

Ubuntu / Debian

sudo apt update
sudo apt install nginx -y

CentOS / RHEL

sudo yum install epel-release -y
sudo yum install nginx -y

安装完成后,启动并设置开机自启:

sudo systemctl start nginx
sudo systemctl enable nginx

通过浏览器访问服务器 IP 或域名,看到 Welcome to nginx! 即表示安装成功。

提示:所有配置文件均位于 /etc/nginx/ 下。主配置文件为 nginx.conf,站点配置通常放置在 /etc/nginx/conf.d//etc/nginx/sites-available/(配合 sites-enabled)。推荐使用独立配置文件管理每个站点。


基础反向代理配置

反向代理的核心指令是 proxy_pass。它将请求转发到指定的后端服务器地址。

最小化配置示例

假设我们有一台运行在 http://localhost:3000 的 Node.js 应用,需要让外部通过域名 example.com 访问。

  1. 创建配置文件 /etc/nginx/conf.d/example.conf
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:3000;
        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;
    }
}
  1. 检查配置并重载 Nginx:
sudo nginx -t
sudo systemctl reload nginx

关键指令说明

指令 作用
proxy_pass 定义转发目标地址,支持 HTTP/HTTPS 和 Unix Socket。
proxy_set_header Host 传递原始请求的 Host 头,避免后端收到 localhost
X-Real-IP 记录真实客户端 IP。
X-Forwarded-For 代理链 IP 列表。
X-Forwarded-Proto 原始请求协议 (http/https)。

这些头信息对后端日志记录、安全校验等至关重要。


负载均衡配置

Nginx 可以将请求分发到多台后端服务器,提供横向扩展能力。

定义上游服务器组

使用 upstream 模块定义一组后端服务器:

upstream backend_servers {
    server 192.168.1.10:3000;
    server 192.168.1.11:3000;
    server 192.168.1.12:3000 backup;  # 备用服务器
}

然后在 server 块中引用:

location / {
    proxy_pass http://backend_servers;
}

负载均衡策略

策略 指令 说明
轮询(默认) 无需额外配置 请求按顺序逐一分配。
加权轮询 weight=N 服务器性能越高,权重越大。
IP 哈希 ip_hash; 同一客户端 IP 始终分配到同一后端(需考虑临时 IP 变化)。
最少连接 least_conn; 请求分配给活动连接数最少的服务器。
随机 random; 随机分配。

加权轮询示例

upstream backend_servers {
    server 192.168.1.10:3000 weight=5;
    server 192.168.1.11:3000 weight=2;
}

IP 哈希示例(适合 Session 保持):

upstream backend_servers {
    ip_hash;
    server 192.168.1.10:3000;
    server 192.168.1.11:3000;
}

注意:如果使用 ip_hash,添加或移除服务器可能导致部分客户端分配变化。可考虑使用 sticky cookie 等更灵活的会话保持方式。


静态资源代理与缓存优化

反向代理经常需要处理静态资源(图片、CSS、JS 等)。我们可以让 Nginx 直接提供这些文件,或从后端代理后缓存下来。

方案一:直接由 Nginx 提供静态文件

如果后端应用没有直接提供静态文件的需求,可以让 Nginx 处理来自特定目录的文件。

location /static/ {
    alias /var/www/example/static/;
    expires 30d;
    add_header Cache-Control "public, immutable";
}

方案二:代理后缓存

当静态资源需要经过后端处理(如权限检查)或后端生成时,我们可以让 Nginx 缓存后端响应。

首先定义缓存路径和参数:

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m max_size=1g inactive=60m use_temp_path=off;
}

然后在 location 中启用缓存:

location /images/ {
    proxy_pass http://backend_servers;
    proxy_cache static_cache;
    proxy_cache_valid 200 302 24h;
    proxy_cache_valid 404 1m;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    add_header X-Cache-Status $upstream_cache_status;
}
  • proxy_cache_path:定义缓存存储位置、缓存区名称、大小及过期时间。
  • proxy_cache_valid:对不同响应状态码设置缓存有效期。
  • add_header X-Cache-Status:调试用,可查看命中情况(HIT / MISS / EXPIRED)。

常见场景与高级配置

多站点反向代理(基于域名或路径)

一个 Nginx 实例可以为多个域名或路径代理不同后端。

按域名区分

server {
    listen 80;
    server_name api.example.com;
    location / {
        proxy_pass http://api_backend;
    }
}
server {
    listen 80;
    server_name admin.example.com;
    location / {
        proxy_pass http://admin_backend;
    }
}

按路径区分

server {
    listen 80;
    server_name example.com;

    location /api/ {
        proxy_pass http://api_backend/;
    }
    location /admin/ {
        proxy_pass http://admin_backend/;
    }
}

注意 proxy_pass 末尾的 /:带 / 会将匹配的路径部分替换掉,不带 / 则保留原始 URI。

WebSocket 代理支持

WebSocket 需要升级连接协议,需添加额外头信息:

location /ws/ {
    proxy_pass http://backend_ws;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

限制请求速率与连接数

保护后端不被突发流量压垮:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

server {
    location / {
        limit_req zone=mylimit burst=20 nodelay;
        proxy_pass http://backend_servers;
    }
}

超时设置

合理的超时配置能避免资源占用:

proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 20s;

故障排查与测试

配置完成后,务必验证并观察日志:

检查语法

sudo nginx -t

重载配置

sudo systemctl reload nginx

查看错误日志

tail -f /var/log/nginx/error.log

测试代理是否生效

使用 curl 查看响应头:

curl -I http://yourdomain.com

若返回后端应用的响应头,说明代理成功。


总结

Nginx 反向代理是构建高扩展性、高可用性 Web 架构的基石。通过 proxy_pass 实现请求转发,配合 upstream 与负载均衡策略分发流量,再结合静态资源缓存大幅提升性能。掌握这些内容后,你能够:

  • 将单体应用平滑扩展至多台服务器。
  • 保护后端服务并统一访问入口。
  • 高效地调度静态和动态内容。

建议在生产环境中结合 SSL 证书、防火墙规则以及监控告警,形成完整的服务接入层。下一步可以深入探索 Nginx 的 微服务网关模式、动态健康检查及与容器化平台的集成。