You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器中Nginx反向代理多代理节点连接失败问题求助

问题根源

你碰到的问题其实很典型:当前Nginx配置是反向代理模式,但你需要把它当成正向代理来用。当你用requests通过Nginx访问HTTPS站点时,客户端会发送CONNECT请求来建立加密隧道,但默认的反向代理配置完全不处理这个请求,直接返回400错误,这就是隧道建立失败的核心原因。

两种可行解决方案

方案1:调整Nginx配置并使用支持CONNECT模块的镜像

官方Nginx镜像默认不支持处理CONNECT请求,所以得换个带ngx_http_proxy_connect_module的镜像,再修改配置:

步骤1:修改default.conf

server {
    listen 80;
    server_name localhost;

    # 处理普通HTTP代理请求
    location / {
        resolver 8.8.8.8 valid=300s; # 用公共DNS解析目标域名
        proxy_pass http://$host$request_uri;
        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_connect_timeout 10s;
        proxy_send_timeout 10s;
        proxy_read_timeout 10s;
    }

    # 处理HTTPS的CONNECT隧道请求
    location @connect {
        resolver 8.8.8.8 valid=300s;
        proxy_pass https://$host:$server_port;
        proxy_connect;
        proxy_connect_allow 443 80; # 允许代理的端口
        proxy_connect_connect_timeout 10s;
        proxy_connect_read_timeout 10s;
        proxy_connect_send_timeout 10s;
    }

    # 匹配CONNECT请求并转发到上面的location
    if ($request_method = CONNECT) {
        return 405;
    }
}

步骤2:更新docker-compose中的Nginx镜像

把官方镜像换成支持该模块的,比如kalaksi/nginx:latest:

nginx:
    image: kalaksi/nginx:latest
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8080:80"

方案2:改用HAProxy(更简单省心)

如果不想折腾Nginx的模块依赖,HAProxy是更好的选择——它原生支持正向代理,还能轻松实现代理节点的负载均衡:

步骤1:修改docker-compose.yml

version: "2.4"
services:
  proxy:
    image: qmcgaw/private-internet-access
    cap_add:
      - NET_ADMIN
    restart: always
    environment:
      - VPNSP=Surfshark
      - OPENVPN_USER=${user}
      - PASSWORD=${pass}
      - HTTPPROXY=ON
    scale: 2
  haproxy:
    image: haproxy:latest
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
    ports:
      - "8080:8080"

步骤2:创建haproxy.cfg配置文件

global
    log stdout format raw local0 info

defaults
    log global
    mode http
    timeout connect 5s
    timeout client 30s
    timeout server 30s

frontend proxy_front
    bind *:8080
    default_backend proxy_backends

backend proxy_backends
    balance roundrobin # 轮询两个代理节点,实现负载均衡
    server proxy1 proxy:8888 check
    server proxy2 proxy:8888 check

配置完成后重启容器,再用你的测试代码访问,应该就能正常获取IP了。

额外提醒

  • 确保所有容器在同一个Docker网络里(docker-compose默认会创建专属网络,这点不用额外设置)
  • 测试时可以临时关闭本地防火墙,避免端口被拦截
  • 如果用方案1,记得确认镜像确实包含ngx_http_proxy_connect_module,不然还是会报错

内容的提问来源于stack exchange,提问作者Kev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 06:07:42