什么是 HTTP 代理?
HTTP 代理服务器作为客户端(比如你的浏览器)和目标服务器之间的中间人,当你通过代理访问网站时,你的请求会先发送到代理服务器,然后由代理服务器转发给目标网站,并将响应返回给你。

主要用途:
- 访问控制: 过滤或屏蔽某些网站。
- 缓存: 缓存频繁访问的网页,加快访问速度并减少带宽消耗。
- 负载均衡: 将请求分发到多个后端服务器。
- 隐藏客户端信息: 目标服务器看到的是代理服务器的 IP 地址。
- 绕过网络限制: 在某些网络环境下,通过代理可以访问被限制的资源。
环境准备
- 操作系统: Linux (推荐 Ubuntu/CentOS)
- Nginx: 已安装,如果未安装,可以参考官方文档进行安装。
- Ubuntu/Debian:
sudo apt update && sudo apt install nginx - CentOS/RHEL:
sudo yum install epel-release && sudo yum install nginx
- Ubuntu/Debian:
- Nginx 配置文件目录: 通常位于
/etc/nginx/ - 编辑器: 如
vim,nano等。
第一步:创建代理服务器配置文件
为了保持 Nginx 主配置文件 nginx.conf 的整洁,我们建议为代理服务器创建一个独立的配置文件。
在 /etc/nginx/conf.d/ 目录下创建一个新文件,proxy.conf:
sudo vim /etc/nginx/conf.d/proxy.conf
第二步:编写基本代理配置
粘贴到 proxy.conf 文件中,这是一个最简单的代理配置,它将所有发往 http://your_server_ip:8080 的请求都转发到 http://example.com。

# 定义一个名为 "my_proxy" 的 upstream 组,用于负载均衡(虽然这里只有一个后端)
# 在简单场景下可以省略,但保留它是一个好习惯
upstream my_proxy_backend {
server example.com; # 这里填写你的目标服务器地址
}
# 监听在 8080 端口,你可以根据需要修改
server {
listen 8080;
server_name _; # 接受所有域名
# 设置代理的超时时间
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
# 核心代理配置
location / {
# 将请求转发到 upstream 中定义的后端服务器
proxy_pass http://my_proxy_backend;
# 设置代理请求的头信息,将客户端的真实IP传递给后端服务器
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;
}
}
配置详解:
server: 定义一个虚拟服务器。listen 8080;:代理服务器监听的端口号。请确保此端口未被占用,并且防火墙已放行。location /: 匹配所有以 开头的请求路径。proxy_pass http://my_proxy_backend;:这是最关键的指令,它告诉 Nginx 将匹配到的请求转发到http://my_proxy_backend这个地址,这里的my_proxy_backend就是上面upstream块中定义的服务器。proxy_set_header ...: 这些指令用于修改转发给后端服务器的 HTTP 请求头。Host $host: 保留原始的Host头,这对于虚拟主机非常重要。X-Real-IP $remote_addr: 将客户端的真实 IP 地址添加到X-Real-IP头中,后端服务器可以通过此头获取真实访客IP。X-Forwarded-For $proxy_add_x_forwarded_for: 记录经过的代理链路。X-Forwarded-Proto $scheme: 记录原始的协议(http 或 https)。
第三步:测试并重新加载 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
第四步:测试代理服务器
你的代理服务器已经准备就绪了,你可以使用以下几种方法来测试它。

使用 curl 命令
在你的客户端机器上(可以是同一台服务器,也可以是任何能访问代理服务器的机器),执行以下命令:
# -x 指定了代理服务器的地址 curl -x http://your_proxy_server_ip:8080 http://httpbin.org/ip
your_proxy_server_ip: 替换为你的 Nginx 代理服务器的 IP 地址。http://httpbin.org/ip: 这是一个可以返回你请求源 IP 地址的测试网站。
如果成功,你会看到类似如下的 JSON 输出,其中的 origin 字段显示的应该是你的 Nginx 代理服务器的 IP 地址,而不是你客户端的真实 IP。
{
"origin": "203.0.113.10" <-- 这里应该是你的Nginx服务器的IP
}
在浏览器中配置
- 打开你的浏览器设置。
- 找到“网络设置”或“代理设置”选项。
- 选择“手动配置代理”。
- 填写代理服务器信息:
- HTTP 代理:
your_proxy_server_ip - 端口:
8080
- HTTP 代理:
- 保存设置。
- 现在访问任何网站,流量都会通过你的 Nginx 代理服务器,你可以在后端服务器(
example.com)的访问日志中看到来自your_proxy_server_ip的请求。
高级配置与安全建议
使用用户名和密码进行基本认证
如果你不希望任何人都能使用你的代理服务器,可以添加认证。
第一步:安装 apache2-utils(用于生成密码文件)
# Ubuntu/Debian sudo apt install apache2-utils # CentOS/RHEL sudo yum install httpd-tools
第二步:创建密码文件和用户
# -c 表示创建新文件,后面会提示你输入密码 sudo htpasswd -c /etc/nginx/.htpasswd your_username
创建后,/etc/nginx/.htpasswd 文件会包含用户名和加密后的密码。
第三步:修改 Nginx 配置文件 (proxy.conf)
在 server 块中添加 auth_basic 和 auth_basic_user_file 指令。
server {
listen 8080;
server_name _;
# ... 其他配置 ...
# 添加认证
auth_basic "Restricted Proxy";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
# ... proxy_pass 等配置 ...
proxy_pass http://my_proxy_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# ...
}
}
第四步:重新加载 Nginx
sudo systemctl reload nginx
再次使用 curl 或浏览器访问代理,就会弹出用户名和密码的输入框。
缓存代理响应
Nginx 可以缓存后端服务器的响应,以加快后续访问速度并减少后端服务器的负载。
第一步:创建缓存目录并设置权限
sudo mkdir -p /var/cache/nginx/proxy_cache sudo chown -R www-data:www-data /var/cache/nginx/proxy_cache
第二步:修改 Nginx 配置文件 (proxy.conf)
在 http 块(通常在 nginx.conf 中)或 server 块中添加缓存参数。
# 在 http 块中定义一个缓存区
proxy_cache_path /var/cache/nginx/proxy_cache
levels=1:2
keys_zone=my_cache:10m
inactive=60m
use_temp_path=off;
# 在 server 块中使用缓存
server {
listen 8080;
server_name _;
# ... 其他配置 ...
location / {
proxy_pass http://my_proxy_backend;
proxy_set_header Host $host;
proxy_cache my_cache; # 使用上面定义的缓存区
proxy_cache 