Skip to content

反向代理原理

反向代理是Nginx最重要的功能之一,理解其原理对于正确配置和使用至关重要。

什么是反向代理

正向代理 vs 反向代理

正向代理:

  • 客户端使用代理访问互联网
  • 服务器不知道真实客户端IP
  • 典型应用:VPN、科学上网

反向代理:

  • 客户端通过代理访问后端服务器
  • 客户端不知道真实后端服务器
  • 典型应用:负载均衡、缓存、安全

反向代理架构

客户端

Nginx (反向代理)

后端服务器集群

反向代理的作用

1. 负载均衡

将请求分发到多个后端服务器,提高并发处理能力。

2. 缓存加速

缓存后端服务器的响应,减轻后端压力,提高响应速度。

3. 安全防护

隐藏后端服务器真实IP,提供安全防护。

4. SSL终端

处理SSL/TLS加密,减轻后端服务器负担。

5. 统一入口

为多个后端服务提供统一的访问入口。

工作原理

请求流程

1. 客户端发起请求

2. Nginx接收请求

3. Nginx根据配置转发到后端服务器

4. 后端服务器处理请求

5. 后端服务器返回响应

6. Nginx接收响应

7. Nginx返回响应给客户端

关键组件

Proxy模块:

  • ngx_http_proxy_module
  • ngx_http_upstream_module
  • ngx_stream_proxy_module

配置指令

proxy_pass指令

设置后端服务器地址。

nginx
location / {
    proxy_pass http://backend;
}

proxy_set_header指令

设置请求头。

nginx
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;
}

proxy_connect_timeout指令

设置连接超时时间。

nginx
proxy_connect_timeout 60s;

proxy_send_timeout指令

设置发送超时时间。

nginx
proxy_send_timeout 60s;

proxy_read_timeout指令

设置读取超时时间。

nginx
proxy_read_timeout 60s;

常用变量

请求相关变量

nginx
$host              # 请求主机名
$remote_addr       # 客户端IP
$request_uri       # 完整请求URI
$scheme            # 协议(http/https)
$request_method    # 请求方法

代理相关变量

nginx
$proxy_host        # 代理主机名
$proxy_port        # 代理端口
$proxy_add_x_forwarded_for  # X-Forwarded-For头

性能优化

缓冲设置

nginx
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;

连接复用

nginx
upstream backend {
    server 192.168.1.10:8080;
    keepalive 32;
}

location / {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
}

安全配置

隐藏后端服务器信息

nginx
proxy_hide_header X-Powered-By;
proxy_hide_header Server;

限制请求大小

nginx
client_max_body_size 10m;

IP访问控制

nginx
location /admin/ {
    allow 192.168.1.0/24;
    deny all;
}

总结

反向代理的关键点:

  • 作用:负载均衡、缓存、安全、SSL终端
  • 原理:客户端→Nginx→后端服务器
  • 配置:proxy_pass、proxy_set_header、超时设置
  • 优化:缓冲、连接复用
  • 安全:隐藏信息、限制访问

掌握反向代理原理,是配置Nginx反向代理的基础。