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(需配置) |
主要用途 | 突破限制 / 缓存 / 隐私保护 | 负载均衡 / 安全 / 性能优化 |
典型场景 | 跨境访问、内网代理 | 高并发网站、微服务网关 |
二、实操配置指南
(一)环境准备
- 检查服务状态:
[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)
- 配置文件路径:
- 主配置:/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;
}
(四)常见问题处理
- 配置错误排查:
-
错误日志位置:/var/log/nginx/error.log
-
语法检查命令:sudo nginx -t
- 跨域问题:
# 添加跨域头配置
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';
- HTTPS 代理配置:
# 监听443端口并加载证书
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
三、生产环境最佳实践
- 安全加固:
-
限制代理服务器访问来源
-
启用 WAF 防护(如 Naxsi 模块)
-
定期更新 Nginx 版本
- 性能优化:
-
使用gzip压缩响应内容
-
配置keepalive保持长连接
-
启用 HTTP/2 协议(需 HTTPS 支持)
- 监控报警:
-
监控后端服务器健康状态(upstream支持health_check模块)
-
采集 Nginx 指标(请求量、错误率、响应时间)
通过以上理论与实操的结合,能够全面掌握 Nginx 代理的核心原理与配置方法。实际应用中需根据具体业务场景选择合适的代理模式,并通过不断优化配置提升系统性能与稳定性。