凌峰创科服务平台

nginx如何搭建http代理服务器?

什么是 HTTP 正向代理?

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

nginx如何搭建http代理服务器?-图1
(图片来源网络,侵删)
  • 正向代理:位于客户端和互联网之间,客户端需要明确地配置代理服务器,然后将所有网络请求(如 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:

nginx如何搭建http代理服务器?-图2
(图片来源网络,侵删)
# 更新包列表
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;
        }
    }
}

配置解释:

nginx如何搭建http代理服务器?-图3
(图片来源网络,侵删)
  • resolver 8.8.8.8;:这是关键配置,它告诉 Nginx 如何将域名(如 www.google.com)解析成 IP 地址,没有它,proxy_pass http://$host... 将无法工作。
  • listen 8080;:代理服务器监听的端口号,客户端需要连接这个端口。
  • proxy_set_header ...;:这些指令用于修改转发给后端服务器的 HTTP 请求头。X-Real-IPX-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 为例):

    1. 打开 Chrome 设置,搜索 "代理"。
    2. 点击 "打开您计算机的代理设置"。
    3. 在 Windows 中,选择 "手动设置代理",填写 HTTP 代理为 168.1.100,端口为 8080
    4. 在 macOS 中,选择 "网页代理(HTTP)" 和 "安全网页代理(HTTPS)",服务器都填 168.1.100,端口都填 8080
  • 在命令行工具中设置(如 curl, wget): 你可以设置环境变量 http_proxyhttps_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

进阶配置:认证和缓存

为了安全和管理,你可能需要为代理服务器添加认证功能。

添加基本认证

  1. 安装 httpd-tools (包含 htpasswd 命令):

    # CentOS/RHEL
    sudo yum install httpd-tools
    # Ubuntu/Debian
    sudo apt install apache2-utils
  2. 创建密码文件: 我们将在 /etc/nginx/ 目录下创建一个 htpasswd 文件,并添加一个名为 user1 的用户。

    sudo htpasswd -c /etc/nginx/.htpasswd user1

    系统会提示你输入并确认该用户的密码。-c 选项表示创建新文件(如果文件已存在,请不要使用 -c,否则会覆盖)。

  3. 修改 Nginx 配置文件: 在 server 块中添加 auth_basicauth_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;
            }
        }
    }
  4. 重新加载 Nginx:

    sudo nginx -t && sudo systemctl reload nginx

    任何客户端连接代理服务器时,都会弹出用户名和密码的输入框。

添加缓存

Nginx 可以缓存从后端服务器获取的响应,以加速后续对相同资源的请求。

  1. 定义缓存路径和参数: 在 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;
            }
        }
    }
  2. 创建缓存目录并设置权限:

    sudo mkdir -p /var/cache/nginx/proxy_cache
    sudo chown -R nginx:nginx /var/cache/nginx/proxy_cache
  3. 重新加载 Nginx:

    sudo nginx -t && sudo systemctl reload nginx

    Nginx 会将访问过的内容缓存到 /var/cache/nginx/proxy_cache 目录中。


安全注意事项

  1. 只允许受信任的客户端:在 listen 指令后使用 allowdeny 指令来限制哪些 IP 地址可以使用你的代理,只允许你所在的内网网段 168.1.0/24 访问。

    server {
        listen 8080;
        allow 192.168.1.0/24; # 允许内网
        allow 10.0.0.0/8;     # 允许另一个内网
        deny all;             # 拒绝所有其他IP
        # ...
    }
  2. 防止滥用:一个公开的代理服务器很容易被滥用,导致你的 IP 地址被封禁或产生高额带宽费用。强烈建议不要将代理服务器暴露在公网,或者至少使用严格的 IP 白名单和认证机制。

  3. 日志记录:确保开启了访问日志,以便追踪谁在使用你的代理以及访问了哪些网站,默认情况下,Nginx 的 access_log 会记录所有请求。

通过以上步骤,你已经成功搭建了一个功能丰富、可定制的 HTTP 正向代理服务器,Nginx 的强大之处在于其模块化和高性能,你可以根据需要轻松地添加认证、缓存、访问控制等功能,使其满足各种复杂的网络代理需求。

分享:
扫描分享到社交APP
上一篇
下一篇