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

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
}

配置说明

  1. 请求方法区分:通过$request_method变量判断请求类型,将推送类方法(PUT/POST/PATCH/DELETE)转发到hosted仓库,拉取类方法(GET/HEAD)转发到proxy仓库
  2. 路径适配:单独配置Docker核心API路径/v2/的转发规则,其余路径(如Nexus控制台)默认转发到Nexus实例
  3. 上传大小调整:将client_max_body_size改为10G,避免大镜像推送时因体积限制失败
  4. SSL配置:保留原Certbot生成的HTTPS配置,确保访问安全

验证步骤

  1. 重启Nginx服务:sudo systemctl restart nginx
  2. 推送镜像测试:docker push registry.example.com/your-image:tag
  3. 拉取镜像测试:删除本地对应镜像后执行docker pull registry.example.com/your-image:tag,确认可正常拉取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:28:00