复用Nginx 8000端口实现Docker代理的配置问题求助
解决方案
问题根源在于Docker通过HTTPS代理访问ghcr.io时会发送CONNECT请求,而Nginx默认不支持转发这类请求,直接返回400错误。以下是具体的修复步骤:
1. 修改Nginx配置,支持CONNECT请求转发
更新Server A上的Nginx配置,添加对CONNECT方法的处理逻辑,将这类请求转发到Squid的3128端口:
# 在http配置块内添加map规则,提取CONNECT请求的目标地址 map $request_method $connect_target { CONNECT $http_host; default ''; } server { listen 8000; # 保留原有的/db路径转发逻辑 location /db { include uwsgi_params; uwsgi_pass 127.0.0.1:5921; } # 专门处理CONNECT请求(HTTPS代理隧道用) if ($request_method = CONNECT) { proxy_pass http://127.0.0.1:3128/$connect_target; proxy_set_header Host $connect_target; 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; proxy_cache off; proxy_buffering off; proxy_http_version 1.1; proxy_set_header Connection ""; return 200; } # 处理普通HTTP请求转发到Squid location / { proxy_pass http://127.0.0.1:3128; 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; } }
2. 更新Squid配置,允许Nginx的本地请求
因为现在请求是从Nginx转发到Squid的,源IP是Server A的本地IP(127.0.0.1),需要将其加入Squid的允许列表:
http_port 3128 # 保留原Server B的IP,同时添加本地回环IP acl allowed_ips src <server B ip> 127.0.0.1 http_access allow allowed_ips
3. 重启服务并测试
- 验证Nginx配置正确性:
nginx -t,无误后重启Nginx:systemctl restart nginx - 重启Squid服务:
systemctl restart squid - 在Server B上重载Docker配置并重启服务:
systemctl daemon-reload && systemctl restart docker - 测试
docker login ghcr.io和docker pull ghcr.io/xxx/xxx操作
备选优化方案
如果Server A有额外的可用IP,可以让Squid直接监听该IP的8000端口,Nginx监听主IP的8000端口,这样无需转发CONNECT请求,配置更简单。但需要确保Server B能访问该额外IP的8000端口,且符合你的网络限制要求。
内容的提问来源于stack exchange,提问作者Sharath
相关产品推荐
相关产品推荐

