Nginx反向代理下Nexus Docker代理的同域推拉配置问题
同一域名下Nginx反向代理适配Nexus Docker拉取与推送的配置方案
问题背景
已搭建proxy类型的Nexus Docker Registry,通过Nginx反向代理部署后,拉取镜像正常(本地无镜像时自动从hub.docker.com拉取),但推送镜像时出现如下错误:
5216338b40a7: Layer already exists error parsing HTTP 404 response body: unexpected end of JSON input: ""
问题根源是proxy类型的Docker仓库仅支持拉取,不允许推送操作;需使用hosted类型仓库处理推送,但希望在同一域名下同时支持两种操作,无需额外子域名。
前置准备
在Nexus中创建两个Docker仓库:
- Proxy仓库:用于镜像拉取,配置路径为
/docker-proxy(可自定义),关联hub.docker.com作为上游源 - Hosted仓库:用于镜像推送,配置路径为
/docker-hosted(可自定义),设置为允许推送
修正后的Nginx配置
替换原registry.example.com.conf内容为以下配置:
upstream nexus-proxy { server 127.0.0.1:8080; } upstream nexus-hosted { server 127.0.0.1:8080; } proxy_send_timeout 120; proxy_read_timeout 300; proxy_buffering off; proxy_request_buffering off; server { server_name registry.example.com; client_max_body_size 10G; # 调大以支持大镜像推送 # 处理Docker核心API请求,按方法区分转发目标 location /v2/ { # 推送类请求转发到hosted仓库 if ($request_method ~* "(PUT|POST|PATCH|DELETE)") { proxy_pass http://nexus-hosted/docker-hosted/v2/; } # 拉取类请求转发到proxy仓库 if ($request_method ~* "(GET|HEAD)") { proxy_pass http://nexus-proxy/docker-proxy/v2/; } 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 "https"; } # 处理Nexus控制台及其他非API路径请求 location / { proxy_pass http://nexus-proxy/; 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 "https"; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = registry.example.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name registry.example.com; return 404; # managed by Certbot }
配置说明
- 请求方法区分:通过
$request_method变量判断请求类型,将推送类方法(PUT/POST/PATCH/DELETE)转发到hosted仓库,拉取类方法(GET/HEAD)转发到proxy仓库 - 路径适配:单独配置Docker核心API路径
/v2/的转发规则,其余路径(如Nexus控制台)默认转发到Nexus实例 - 上传大小调整:将
client_max_body_size改为10G,避免大镜像推送时因体积限制失败 - SSL配置:保留原Certbot生成的HTTPS配置,确保访问安全
验证步骤
- 重启Nginx服务:
sudo systemctl restart nginx - 推送镜像测试:
docker push registry.example.com/your-image:tag - 拉取镜像测试:删除本地对应镜像后执行
docker pull registry.example.com/your-image:tag,确认可正常拉取
内容的提问来源于stack exchange,提问作者Emad Helmi
相关产品推荐
相关产品推荐

