文章最后更新时间:
Nginx是世界上最流行的Web服务器之一,它不仅可以作为静态文件服务器,还广泛应用于反向代理、负载均衡、API网关等场景。本文详细介绍Nginx反向代理和负载均衡的配置方法。
一、Nginx基础概念
什么是正向代理?
正向代理代表客户端向服务器发起请求。客户端知道目标服务器,但服务器不知道真实客户端是谁(服务器只知道代理服务器的存在)。翻墙软件就是典型的正向代理。
什么是反向代理?
反向代理代表服务器接收客户端请求。客户端不知道真实服务器是谁(只知道代理服务器的地址)。用户访问网站的80端口,实际上可能被代理到内网任意一台服务器。
反向代理的优势:
- 隐藏真实服务器,提高安全性
- 统一入口,方便做HTTPS、SSL证书配置
- 后端服务器可以随时扩容或更换,不影响客户端
- 可以缓存静态内容,减轻后端压力
- 可以做负载均衡分发流量
二、反向代理配置
最简单的反向代理配置,将所有请求转发到另一台服务器:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1: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;
}
}
关键配置项说明:
- proxy_pass:指定后端服务地址
- Host $host:传递原始请求的域名
- X-Real-IP:传递客户端真实IP地址(后端程序可以看到真实IP)
- X-Forwarded-For:传递完整请求链路IP(防止IP伪造)
- X-Forwarded-Proto:传递原始协议(http/https)
三、负载均衡配置
当一台服务器不够用时,可以用Nginx做负载均衡,将请求分发到多台后端服务器。
1. 轮询(Round Robin)——默认策略
upstream backend {
server 192.168.1.10:3000;
server 192.168.1.11:3000;
server 192.168.1.12:3000;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
2. 加权轮询(Weighted Round Robin)
upstream backend {
server 192.168.1.10:3000 weight=3;
server 192.168.1.11:3000 weight=2;
server 192.168.1.12:3000 weight=1;
}
服务器性能不同:性能强的多分配请求。weight值越大,分配到的请求越多。
3. IP哈希(IP Hash)
upstream backend {
ip_hash;
server 192.168.1.10:3000;
server 192.168.1.11:3000;
server 192.168.1.12:3000;
}
同一个IP的请求,始终转发到同一台后端服务器。适用于需要会话保持的场景。
4. 最少连接(Least Connections)
upstream backend {
least_conn;
server 192.168.1.10:3000;
server 192.168.1.11:3000;
}
新请求分配给当前连接数最少的服务器,适用于长连接业务(如WebSocket)。
四、健康检查与故障转移
当某台后端服务器宕机时,Nginx会自动将流量切换到健康的服务器。
upstream backend {
server 192.168.1.10:3000 max_fails=3 fail_timeout=30s;
server 192.168.1.11:3000 max_fails=3 fail_timeout=30s;
server 192.168.1.12:3000 max_fails=3 fail_timeout=30s;
}
- max_fails=3:连续3次连接失败,标记为不可用
- fail_timeout=30s:30秒后重新尝试连接
五、HTTPS反向代理配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
location / {
proxy_pass http://127.0.0.1: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 https;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
外网用HTTPS加密传输,内部转发到后端HTTP服务,安全又高效。
六、常用场景配置示例
场景1:代理多个不同域名的后端服务
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8000;
}
}
server {
listen 80;
server_name web.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
}
}
server {
listen 80;
server_name admin.example.com;
location / {
proxy_pass http://127.0.0.1:9000;
}
}
场景2:代理API接口并设置超时
location /api/ {
proxy_pass http://backend;
proxy_connect_timeout 10s;
proxy_read_timeout 60s;
proxy_send_timeout 30s;
proxy_set_header Host $host;
}
场景3:静态文件本地缓存,反向代理API
location / {
root /var/www/html;
index index.html;
try_files $uri $uri/ @proxy;
}
location @proxy {
proxy_pass http://backend;
}
七、Nginx常用命令
nginx -t # 测试配置文件语法 nginx -s reload # 平滑重载配置(不断开现有连接) nginx -s reopen # 重新打开日志文件 nginx -s stop # 快速停止 nginx -s quit # 优雅停止(等待现有请求处理完) nginx # 启动
八、常见问题
Q:proxy_pass 后面加不加斜杠有什么区别?
A:location /A { proxy_pass http://backend; } 会保留 /A,即请求 /A/B 变成 http://backend/A/B。如果 proxy_pass http://backend/ 则去掉 /A,请求 /A/B 变成 http://backend/B。
Q:后端获取不到真实IP怎么办?
A:确保在 Nginx 配置了 proxy_set_header X-Real-IP $remote_addr; 后端程序通过读取 HTTP 头部的 X-Real-IP 字段获取真实IP。
Q:如何查看 Nginx 正在转发哪些请求?
A:查看 access.log 日志,默认在 /var/log/nginx/access.log。开启详细日志可以看到每次请求的来源和目标。
Q:Nginx 能代理 websocket 吗?
A:可以。需要额外配置:proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection “upgrade”; 否则 websocket 连接会在一段时间后断开。
总结
Nginx反向代理和负载均衡是搭建高可用系统的基础技能。核心配置:proxy_pass 转发请求、upstream 定义后端服务器池、不同策略(轮询/加权/ip_hash/最少连接)适应不同场景、health check 自动故障转移。掌握这些配置,就能搭建起稳定、高效的Web架构。
瀚煜云提供服务器托管及Nginx高可用架构部署技术支持。


















暂无评论内容