Nginx反向代理基础
Nginx 作为高性能 HTTP 服务器与反向代理,在生产环境被广泛使用。本文记录反向代理的基本概念、proxy_pass 配置方法以及负载均衡与健康检查的入门实践。
一、正向代理与反向代理
两者容易混淆,核心区别在于代理对象不同:
- 正向代理:代理客户端。客户端明确知道目标服务器,但通过代理服务器发起请求,目标服务器不知道真实客户端是谁。典型场景:VPN、翻墙。
- 反向代理:代理服务端。客户端以为访问的就是目标服务器,实际请求被反向代理转发到后端真实服务器。典型场景:负载均衡、CDN、API 网关。
对用户而言,正向代理"代理的是我",反向代理"代理的是它"。
二、最简反向代理
通过 proxy_pass 将请求转发到后端服务:
# /etc/nginx/conf.d/proxy.conf
server {
listen 80;
server_name p2pblaze.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
该配置将所有访问 p2pblaze.com 的请求转发到本机 8080 端口的后端服务。
三、传递客户端信息
默认情况下,后端服务看到的客户端 IP 是 Nginx 服务器的 IP。需要通过请求头传递真实客户端信息:
server {
listen 80;
server_name p2pblaze.com;
location / {
proxy_pass http://127.0.0.1:8080;
# 传递真实客户端 IP 与 Host
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;
}
}
Host:原始请求的域名X-Real-IP:客户端真实 IPX-Forwarded-For:代理链路 IP 列表,后端据此识别真实客户端X-Forwarded-Proto:原始协议(http/https)
四、负载均衡
使用 upstream 定义后端服务器组,实现负载均衡:
upstream backend {
server 192.168.1.101:8080 weight=3;
server 192.168.1.102:8080 weight=2;
server 192.168.1.103:8080 weight=1;
}
server {
listen 80;
server_name p2pblaze.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
调度算法:
- 轮询(默认):按顺序逐一分配
- weight:按权重分配,权重越高分配越多
- ip_hash:按客户端 IP 哈希固定分配到同一后端,解决 Session 问题
- least_conn:分配给当前连接数最少的服务器
五、健康检查
Nginx 开源版支持被动健康检查,通过 max_fails 与 fail_timeout 实现:
upstream backend {
server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 max_fails=3 fail_timeout=30s;
}
max_fails=3:30 秒内失败 3 次则标记为不可用fail_timeout=30s:标记不可用后,30 秒内不再向该服务器转发请求
主动健康检查需要 Nginx Plus 或第三方模块(如 nginx_upstream_check_module)。
六、验证与重载
# 验证配置语法
sudo nginx -t
# 平滑重载(不中断现有连接)
sudo nginx -s reload
# 查看连接状态
ss -tlnp | grep nginx
# 查看访问日志
tail -f /var/log/nginx/access.log
小结
反向代理是 Nginx 最常见的用法之一。配置时务必传递 X-Forwarded-For 等请求头,否则后端无法获取真实客户端信息;负载均衡注意根据 Session 需求选择合适的调度算法;生产环境务必配置健康检查避免请求转发到故障节点。