Nginx反向代理基础

Nginx 作为高性能 HTTP 服务器与反向代理,在生产环境被广泛使用。本文记录反向代理的基本概念、proxy_pass 配置方法以及负载均衡与健康检查的入门实践。

一、正向代理与反向代理

两者容易混淆,核心区别在于代理对象不同:

对用户而言,正向代理"代理的是我",反向代理"代理的是它"。

二、最简反向代理

通过 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;
    }
}

四、负载均衡

使用 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;
    }
}

调度算法:

五、健康检查

Nginx 开源版支持被动健康检查,通过 max_failsfail_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;
}

主动健康检查需要 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 需求选择合适的调度算法;生产环境务必配置健康检查避免请求转发到故障节点。