Ngnix 正向代理配置

2025/08/20 更新 1 次 更新于 2026/08/08 Ngnix 共 3734 字,约 11 分钟

Ngnix 正向代理配置

1、正向代理与反向代理

正向代理:一种位于客户端和服务器之间的代理服务器。客户端将请求发送给正向代理,然后由代理服务器将请求转发给目标服务器。服务器将响应返回给代理服务器,再由代理服务器将响应转发给客户端。正向代理对客户端是透明的,客户端无需知道实际服务器的地址。

使用场景:

  1. 突破网络限制: 在某些地区或网络环境下,用户可能无法直接访问某些网站或服务。此时,可以通过设置正向代理来突破这些限制,实现访问。
  2. 网络安全:通过正向代理,企业可以监控和管理员工的网络访问行为,隐藏客户端真实 IP,防止敏感数据泄露。
  3. 内容过滤:学校、图书馆等公共场所可以通过正向代理过滤不良内容,保护用户免受不良信息的侵害。
  4. 提高访问速度:代理服务器设置硬盘缓冲区,可以将部分高频请求的响应数据保存到缓冲区中,以提高访问速度。

image

反向代理:一种位于服务器和客户端之间的代理服务器。客户端将请求发送给反向代理,然后由代理服务器根据一定的规则将请求转发给后端服务器。后端服务器将响应返回给代理服务器,再由代理服务器将响应转发给客户端。反向代理对客户端是透明的,客户端无需知道实际服务器的地址,只需将反向代理当作目标服务器一样发送请求就可以了。

使用场景:

  1. Web 应用: 在 Web 应用中,反向代理常用于实现负载均衡、安全访问控制以及缓存优化等功能。
  2. API 网关: API 网关通常采用反向代理的方式,对外部请求进行统一管理和调度,实现 API 的安全、高效访问。
  3. CDN 加速: 内容分发网络(CDN)通过在全球范围内部署反向代理服务器,实现内容的就近访问和加速传输。

image

相同点:

  • 正向代理和反向代理都位于客户端和真实服务器之间,它们的主要功能都是将客户端的请求转发给服务器,然后再将服务器的响应转发给客户端。
  • 两者都能通过缓存机制提高访问速度。当客户端请求某个资源时,如果代理服务器已经缓存了该资源,就可以直接从缓存中提供,而无需再次从原始服务器获取,从而节省了时间和带宽。

不同点:

  • 正向代理是为客户端提供代理服务,即服务器不知道真正的客户端是谁。而反向代理则是为服务器提供代理服务,即客户端不知道真正的服务器是谁。
  • 正向代理通常是由客户端架设的,而反向代理则是由服务器架设的。
  • 正向代理的主要用途是为在防火墙内的局域网客户端提供访问 Internet 的途径,侧重于解决访问限制问题。而反向代理的主要用途是将防火墙后面的服务器提供给 Internet 用户访问,其目的在于实现负载均衡、安全防护等。
  • 在正向代理中,服务器不知道真正的用户是谁;而在反向代理中,用户不知道真正的服务器是谁。
2、配置正向代理

nginx 官方并不支持直接转发 https 请求,默认只支持 http,nginx.conf 配置 http 正向代理测试如下:

server {
        listen       18090;
        resolver 114.114.114.114; 						# 指定 DNS 服务器 IP 地址

        location / {
                proxy_pass http://$host$request_uri; 	# 设定代理服务器的协议和地址
        }
}
# 测试百度访问,可以看到 https 访问失败
curl -I http://www.baidu.com -x 192.168.216.128:18090
curl -I https://www.baidu.com -x 192.168.216.128:18090

image-20250820104755939

需要使用 ngx_http_proxy_connect_module 模块来完成 https 正向代理

按自身 Nginx 版本选择相应版本补丁:patch 版本说明

# 安装工具包
yum install -y patch wget

# 下载 nginx
wget http://nginx.org/download/nginx-1.24.0.tar.gz

# 解压
tar -zxvf nginx-1.24.0.tar.gz && cd nginx-1.24.0

# 下载 ngx_http_proxy_connect_module 模块源码
git clone https://github.com/chobits/ngx_http_proxy_connect_module.git

# 使用 patch 命令导入补丁
patch -p1 < ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_102101.patch

# 安装编译 nginx 所需依赖
yum -y install gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel

# 配置 Nginx 编译选项, 使其在编译时包含 ngx_http_proxy_connect_module 模块
./configure --prefix=/data/nginx \
	--with-stream \
	--with-stream_ssl_module \
	--with-stream_realip_module \
	--with-http_sub_module \
	--with-http_ssl_module \
	--with-http_realip_module \
	--with-http_stub_status_module \
	--with-http_gzip_static_module \
	--with-http_v2_module \
	--add-module=ngx_http_proxy_connect_module

# 编译和安装 nginx,已安装 nginx 的服务器仅需 make,通过替换 sbin 下的执行文件更新 nginx
make -j2 && make -j2 install

# 启动 Nginx
/data/nginx/sbin/nginx -c /data/nginx/conf/nginx.conf

导入补丁时可能遇到的报错:patch: ** Only garbage was found in the patch input.

patch 成功时:

image-20250825162218728

server {
    listen                         19000;
    # 指定 DNS 服务器
    resolver                       223.5.5.5;

    # 开启 HTTP CONNECT 方法支持,用于建立与后端服务器的 TCP 连接
    proxy_connect;
    # 允许通过代理的端口
    proxy_connect_allow            443;
    # 建立连接的超时时间为 10 秒
    proxy_connect_connect_timeout  10s;
    # 读取数据的超时时间为 10 秒
    proxy_connect_data_timeout     10s;

    location / {
        # 将请求转发到代理目标
        proxy_pass http://$host;
        proxy_set_header Host $host;
    }
}
server {
    listen 19000;
    server_name localhost;

    # 指定 DNS 服务器
    resolver 114.114.114.114 223.5.5.5 119.29.29.29 180.76.76.76 valid=60s;
    # 设置解析 DNS 的超时时间为 3 秒
    resolver_timeout 3s;
    # 开启 HTTP CONNECT 方法支持,用于建立与后端服务器的 TCP 连接
    proxy_connect;
    # 允许通过代理的端口,只影响 CONNECT 请求(HTTPS代理)
    proxy_connect_allow              443 80;
    # 建立连接的超时时间为10秒
    proxy_connect_connect_timeout    10s;
    # 读取数据的超时时间为10秒
    proxy_connect_read_timeout       10s;

    location / {
        # 请求动态转发
        proxy_pass $scheme://$http_host$request_uri;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
http {
    resolver 223.5.5.5;

    # 定义 HTTP 允许的端口,0 为禁止,1 为允许
    map $server_port $allowed_http_port {
        default 0;
        80 1;     # HTTP
        3000 1;
    }

    server {
        listen 19000;

        location / {
            # 检查 HTTP 端口是否允许
            if ($allowed_http_port = 0) {
                return 403 "HTTP port $server_port is not allowed.\n";
            }

        	proxy_pass $scheme://$http_host$request_uri;
        }
    }
}
3、代理使用设置

Linux 服务器代理设置,将所有流量通过 192.168.216.128 出口访问

vim /etc/profile

export http_proxy=192.168.216.128:18090
export https_proxy=192.168.216.128:18090
export ftp_proxy=192.168.216.128:18090

source /etc/profile

Windows 服务器代理设置

image-20250826110721584

Search

    Table of Contents