Nginx 正向代理与反向代理详解

Nginx 正向代理与反向代理详解

一、核心理论知识

(一)正向代理(Forward Proxy)

1. 定义与本质
  • 代理对象:客户端(替客户端去 “访问” 服务器)

  • 工作原理

本质理解(类比快递代收点)

正向代理就像是一个 “快递代收点”:

  • 你(客户端):想购买国外网站的商品,但无法直接访问

  • 代收点(正向代理服务器):替你去国外网站下单购买

  • 国外商家(目标服务器):只知道商品要寄到代收点,不知道真正的买家是你

  • 核心特征

  • 客户端明确配置代理服务器地址

  • 目标服务器仅看到代理服务器 IP

  • 用于突破网络限制或缓存资源

2. 典型应用场景
  • 跨境访问:通过海外代理服务器访问被墙网站

  • 企业内网代理:员工通过公司代理服务器访问互联网

  • 缓存加速:代理服务器缓存静态资源减少带宽消耗

3. 核心配置指令
  • proxy_pass:指定目标服务器地址

  • proxy_set_header:传递客户端原始请求头

  • listen:代理服务器监听端口

(二)反向代理(Reverse Proxy)

1. 定义与本质
  • 代理对象:服务器(替服务器去 “接收” 客户端请求)

  • 工作原理

    类比

    反向代理就像是商场里的 “导购台”

  • 你(客户端):走进商场(访问网站)的顾客,想购买某类商品(请求服务),但不知道具体哪家店铺(后端服务器)提供该商品。

  • 导购台(反向代理服务器):位于商场入口处,接收你的需求(请求),根据实时客流(服务器负载)、商品类别(URL 路径)等规则,将你引导到具体的品牌店铺(后端服务器)。

  • 品牌店铺(后端服务器集群):实际提供商品的商家,隐藏在商场内部(内网),只知道导购台引导了顾客过来,不知道顾客的真实身份(但知道顾客的请求信息)。

  • 核心特征

  • 客户端无感知代理存在

  • 后端服务器集群对客户端透明

  • 主要用于负载均衡与安全防护

2. 典型应用场景
  • 高并发系统:通过轮询算法分发请求到多个后端

  • 微服务网关:作为统一入口实现路由转发

  • 静态资源缓存:缓存 HTML/CSS/JS 减轻后端压力

3. 核心配置指令
  • upstream:定义后端服务器集群

  • proxy_pass:转发请求到上游服务器组

  • server:配置代理服务器监听地址

(三)核心对比表

特征正向代理反向代理
代理方向客户端→代理→服务器客户端→代理←服务器
客户端配置需要手动设置代理地址无需配置,直接访问域名
服务器可见性仅见代理 IP可见真实客户端 IP(需配置)
主要用途突破限制 / 缓存 / 隐私保护负载均衡 / 安全 / 性能优化
典型场景跨境访问、内网代理高并发网站、微服务网关

二、实操配置指南

(一)环境准备

  1. 检查服务状态:
[root@a ~]# systemctl status nginx
● nginx.service - 123
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; static)
     Active: active (running) since Tue 2025-05-20 15:18:09 CST; 4min 15s ago
    Process: 1910 ExecStart=/usr/local/sbin/nginx (code=exited, status=0/SUCCESS)
   Main PID: 1911 (nginx)
      Tasks: 2 (limit: 8892)

  1. 配置文件路径:
  • 主配置:/usr/local/nginx/conf/nginx.conf

(二)正向代理配置实操

1. 配置代理服务器
server {
    # 监听 8080 端口,接收 HTTP 请求
    listen       8080;
    # 服务器名称为 localhost,用于虚拟主机匹配
    server_name  localhost;
    # DNS 解析服务器,用于解析代理请求的域名
    resolver 114.114.114.114 8.8.8.8;
    
    # 启用 CONNECT 方法支持(用于 HTTPS 代理)
    proxy_connect;
    # 允许代理连接的端口(这里是 80 和 443)
    proxy_connect_allow 80 443;
    # 代理连接超时时间
    proxy_connect_connect_timeout 10s;

    # 设置响应字符集为 UTF-8
    charset utf-8;

    # 注释掉的访问日志配置
    #access_log  logs/host.access.log  main;

    location / {
        # 不使用本地文件系统,将请求代理到原始请求的目标地址
        # root   html;
        # index  index.html index.htm;
        
        # 关键代理配置:将请求转发到原始请求的目标服务器
        proxy_pass $scheme://$http_host$request_uri;
        # 保留原始请求的 Host 头
        proxy_set_header Host $http_host;
        # 代理缓冲区设置(256 个 4KB 缓冲区)
        proxy_buffers 256 4k;
        # 禁用临时文件(避免大文件缓存)
        proxy_max_temp_file_size 0;
        # 使用 HTTP/1.1 协议
        proxy_http_version 1.1;
        # 禁用 keepalive 连接(适用于 HTTP/1.1)
        proxy_set_header Connection "";
    }
}
2. 生效配置
# 检查配置语法
 nginx -t

# 重启服务
systemctl restart nginx
3. 客户端配置(以 linux 为例)
[root@c ~]# curl -x http://192.168.10.101:8080 www.baidu.com           
# -x使用代理选项    代理服务器地址       目标网站
4.在nginx服务器上查看access日志
[root@a nginx]# tail -4 /usr/local/nginx/logs/access.log 
192.168.10.103 - - [20/May/2025:15:30:59 +0800] "GET http://www.baidu.com/ HTTP/1.1" 200 2381 "-" "curl/8.4.0"
192.168.10.103 - - [20/May/2025:15:32:54 +0800] "GET http://www.baidu.c

(三)反向代理配置实操(负载均衡场景)

1. 定义后端服务器集群
upstream myhttp {
    # 定义名为 myhttp 的上游服务器组
    # 默认负载均衡策略:轮询(Round Robin)
    
    # 第一个后端服务器(权重默认为 1)
    server 192.168.10.102:80;
    
    # 第二个后端服务器(权重默认为 1)
    server 192.168.10.103:80;
}
#upstrem 反向代理要写到http里面server外面 这个可以在后面加上权重比做负载均衡使用
2. 配置反向代理入口
server {
    # 监听 80 端口(HTTP 默认端口)
    listen       80;
    # 服务器名称为 localhost(用于虚拟主机匹配)
    server_name  localhost;
    # 注释掉的访问日志配置
    #access_log  logs/host.access.log  main;

    location / {
        # 不使用本地文件系统(注释掉的 root 和 index 配置)
        # root   html;
        # index  index.html index.htm;

        # 将所有请求代理到名为 myhttp 的 upstream 服务器组
        proxy_pass http://myhttp;
        # 保留原始请求的 Host 头(否则会被替换为 proxy_pass 的目标地址)
        proxy_set_header Host $host;
        # 传递客户端真实 IP 地址(否则后端服务器会认为所有请求都来自 Nginx)
        proxy_set_header X-Real-IP $remote_addr;
        # 注释掉的字符集配置(默认使用 UTF-8)
        #charset koi8-r;
    }
}
3.客户端访问反向代理服务器
[root@localhost ~]# for i in $(seq 10 ); do curl 192.168.10.101 ;done
我是张三
我是李四
我是张三
我是李四
我是张三
我是李四
我是张三
我是李四
我是张三
我是李四

查看nginx服务器访问日志

[root@a conf]# tail -10 /usr/local/nginx/logs/access.log 
192.168.10.104 - - [20/May/2025:16:23:09 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/8.4.0"
192.168.10.104 - - [20/May/2025:16:23:09 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/8.4.0"
4. 高级功能配置(静态资源缓存)
location /static/ {
    proxy_pass http://backend_cluster/static/;
    
    # 启用缓存(缓存30天)
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60d;
    proxy_cache my_cache;
    proxy_cache_valid 200 304 30d;
}

(四)常见问题处理

  1. 配置错误排查
  • 错误日志位置:/var/log/nginx/error.log

  • 语法检查命令:sudo nginx -t

  1. 跨域问题
# 添加跨域头配置
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
  1. HTTPS 代理配置
# 监听443端口并加载证书
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;

三、生产环境最佳实践

  1. 安全加固
  • 限制代理服务器访问来源

  • 启用 WAF 防护(如 Naxsi 模块)

  • 定期更新 Nginx 版本

  1. 性能优化
  • 使用gzip压缩响应内容

  • 配置keepalive保持长连接

  • 启用 HTTP/2 协议(需 HTTPS 支持)

  1. 监控报警
  • 监控后端服务器健康状态(upstream支持health_check模块)

  • 采集 Nginx 指标(请求量、错误率、响应时间)

通过以上理论与实操的结合,能够全面掌握 Nginx 代理的核心原理与配置方法。实际应用中需根据具体业务场景选择合适的代理模式,并通过不断优化配置提升系统性能与稳定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值