什么是 HTTP 正向代理?
在开始之前,我们先明确一下“正向代理”的概念。

- 正向代理:位于客户端和互联网之间,客户端需要明确地配置代理服务器,然后将所有网络请求(如 HTTP, HTTPS)发送给这个代理服务器,再由代理服务器转发到目标网站,对于目标网站来说,它看到的是代理服务器的 IP 地址,而不是客户端的真实 IP,常见用途包括:访问内网资源、绕过访问限制、缓存内容以加速访问等。
- 反向代理:位于服务器端,客户端不知道代理的存在,它直接访问一个域名或 IP,请求由反向代理服务器接收,然后转发到后端的多个内部服务器,常见用途包括:负载均衡、SSL 终止、安全防护等。
我们这里要搭建的是正向代理。
基础 HTTP 代理服务器搭建
第 1 步:安装 Nginx
如果你还没有安装 Nginx,可以按照以下方式安装(以 CentOS/RHEL 和 Ubuntu/Debian 为例)。
对于 CentOS/RHEL:
# 安装 EPEL 仓库 sudo yum install epel-release # 安装 Nginx sudo yum install nginx
对于 Ubuntu/Debian:

# 更新包列表 sudo apt update # 安装 Nginx sudo apt install nginx
安装完成后,可以启动 Nginx 并设置为开机自启:
# 启动 Nginx sudo systemctl start nginx # 设置开机自启 sudo systemctl enable nginx
第 2 步:修改 Nginx 配置文件
Nginx 的主配置文件通常位于 /etc/nginx/nginx.conf,但为了管理方便,我们建议在 /etc/nginx/conf.d/ 目录下创建一个新的配置文件,proxy.conf。
sudo vim /etc/nginx/conf.d/proxy.conf
在 proxy.conf 文件中,添加以下最基础的代理配置:
# 定义一个名为 http_proxy 的流,用于处理 HTTP 流量
stream {
# 监听 8080 端口,你可以根据需要修改
listen 8080;
# 允许的客户端 IP 地址,这里设置为 0.0.0.0 允许所有
# 为了安全,建议设置为特定网段,如 192.168.1.0/24
allow all;
# deny all;
# 代理后端服务器的地址和端口
# 这里以一个公共的 HTTP 代理测试服务为例
# 你需要将其替换为你最终要代理的真实目标服务器
# 如果你想代理访问 http://example.com,这里可以不指定,
# 由客户端在请求中指定目标,但 Nginx stream 模块需要指定一个默认后端。
# 更灵活的做法是使用 http 块的 resolver 和 proxy_pass。
# 我们下面会使用 http 块的配置方式,因为它更灵活,支持 DNS 解析。
}
# 使用 http 块来配置代理,这种方式更灵活
http {
# 设置一个 resolver,让 Nginx 能够解析域名
# 你可以使用公共 DNS,如 Google DNS (8.8.8.8) 或 Cloudflare DNS (1.1.1.1)
resolver 8.8.8.8;
# 定义一个名为 my_proxy 的服务器块
server {
# 监听 8080 端口
listen 8080;
# 设置代理头部,隐藏客户端真实 IP
# Via 头部会表明请求经过了代理
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;
# 将所有请求转发到目标地址
# $host 和 $request_uri 是 Nginx 内置变量,会自动替换为客户端请求的主机和完整路径
# 这种方式比 stream 模块更灵活,不需要预先配置后端服务器
location / {
proxy_pass http://$host$request_uri;
}
}
}
配置解释:

resolver 8.8.8.8;:这是关键配置,它告诉 Nginx 如何将域名(如www.google.com)解析成 IP 地址,没有它,proxy_pass http://$host...将无法工作。listen 8080;:代理服务器监听的端口号,客户端需要连接这个端口。proxy_set_header ...;:这些指令用于修改转发给后端服务器的 HTTP 请求头。X-Real-IP和X-Forwarded-For对于后端日志记录和获取真实用户 IP 很重要。location / { ... }:匹配所有请求路径。proxy_pass http://$host$request_uri;:这是代理的核心指令,它会将客户端的请求(GET /path/to/resource?query=1)原封不动地转发到http://<客户端请求的域名>/path/to/resource?query=1。
第 3 步:检查并重启 Nginx
在重启 Nginx 之前,务必检查配置文件是否有语法错误。
# 检查配置文件语法 sudo nginx -t # 如果输出如下,说明配置正确: # nginx: the configuration file /etc/nginx/nginx.conf syntax is ok # nginx: configuration file /etc/nginx/nginx.conf test is successful # 如果没有错误,平滑重启 Nginx 以加载新配置 sudo systemctl reload nginx
第 4 步:配置客户端使用代理
你的 Nginx 代理服务器已经运行起来了,你需要配置你的客户端(如浏览器、命令行工具等)来使用它。
假设你的 Nginx 服务器 IP 是 168.1.100,监听端口是 8080。
-
在浏览器中设置(以 Chrome 为例):
- 打开 Chrome 设置,搜索 "代理"。
- 点击 "打开您计算机的代理设置"。
- 在 Windows 中,选择 "手动设置代理",填写 HTTP 代理为
168.1.100,端口为8080。 - 在 macOS 中,选择 "网页代理(HTTP)" 和 "安全网页代理(HTTPS)",服务器都填
168.1.100,端口都填8080。
-
在命令行工具中设置(如 curl, wget): 你可以设置环境变量
http_proxy和https_proxy。# 设置代理 export http_proxy="http://192.168.1.100:8080" export https_proxy="http://192.168.1.100:8080" # 注意,即使是 HTTPS 请求,也是通过 HTTP 代理隧道传输 # 现在使用 curl 访问任何网站 curl -v http://httpbin.org/ip # 你应该会看到 Nginx 的 IP 地址,而不是你自己的 # 使用完后取消代理设置 unset http_proxy unset https_proxy
进阶配置:认证和缓存
为了安全和管理,你可能需要为代理服务器添加认证功能。
添加基本认证
-
安装
httpd-tools(包含htpasswd命令):# CentOS/RHEL sudo yum install httpd-tools # Ubuntu/Debian sudo apt install apache2-utils
-
创建密码文件: 我们将在
/etc/nginx/目录下创建一个htpasswd文件,并添加一个名为user1的用户。sudo htpasswd -c /etc/nginx/.htpasswd user1
系统会提示你输入并确认该用户的密码。
-c选项表示创建新文件(如果文件已存在,请不要使用-c,否则会覆盖)。 -
修改 Nginx 配置文件: 在
server块中添加auth_basic和auth_basic_user_file指令。http { resolver 8.8.8.8; server { listen 8080; # 添加认证 auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; 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; location / { proxy_pass http://$host$request_uri; } } } -
重新加载 Nginx:
sudo nginx -t && sudo systemctl reload nginx
任何客户端连接代理服务器时,都会弹出用户名和密码的输入框。
添加缓存
Nginx 可以缓存从后端服务器获取的响应,以加速后续对相同资源的请求。
-
定义缓存路径和参数: 在
http块中(在server块之外)添加proxy_cache_path指令。http { # 定义一个名为 my_cache 的缓存 # levels=1:2 表示在缓存目录下创建两级子目录,避免单个目录文件过多 # keys_zone=my_cache:10m 表示缓存空间名为 my_cache,大小为 10MB,用于存储缓存键 # inactive=60m 表示 60 分钟内未被访问的缓存将被自动删除 # max_size=1g 表示缓存总大小上限为 1GB proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g; resolver 8.8.8.8; server { listen 8080; # ... (认证配置等) ... # 启用名为 my_cache 的缓存 proxy_cache my_cache; # 设置不同的缓存时间 # 对于 200 和 302 状态码的响应,缓存 1 小时 proxy_cache_valid 200 302 1h; # 对于 404 状态码的响应,缓存 1 分钟 proxy_cache_valid 404 1m; # 在响应头中添加缓存命中信息,方便调试 add_header X-Proxy-Cache $upstream_cache_status; location / { proxy_pass http://$host$request_uri; } } } -
创建缓存目录并设置权限:
sudo mkdir -p /var/cache/nginx/proxy_cache sudo chown -R nginx:nginx /var/cache/nginx/proxy_cache
-
重新加载 Nginx:
sudo nginx -t && sudo systemctl reload nginx
Nginx 会将访问过的内容缓存到
/var/cache/nginx/proxy_cache目录中。
安全注意事项
-
只允许受信任的客户端:在
listen指令后使用allow和deny指令来限制哪些 IP 地址可以使用你的代理,只允许你所在的内网网段168.1.0/24访问。server { listen 8080; allow 192.168.1.0/24; # 允许内网 allow 10.0.0.0/8; # 允许另一个内网 deny all; # 拒绝所有其他IP # ... } -
防止滥用:一个公开的代理服务器很容易被滥用,导致你的 IP 地址被封禁或产生高额带宽费用。强烈建议不要将代理服务器暴露在公网,或者至少使用严格的 IP 白名单和认证机制。
-
日志记录:确保开启了访问日志,以便追踪谁在使用你的代理以及访问了哪些网站,默认情况下,Nginx 的
access_log会记录所有请求。
通过以上步骤,你已经成功搭建了一个功能丰富、可定制的 HTTP 正向代理服务器,Nginx 的强大之处在于其模块化和高性能,你可以根据需要轻松地添加认证、缓存、访问控制等功能,使其满足各种复杂的网络代理需求。
