核心是让外部通过域名安全访问内网registry,需配置nginx支持https、正确透传host/x-forwarded-*等关键头、关闭缓冲并设置超时,可选集成http basic认证,确保docker客户端能正常login/push。

配置 Nginx 反向代理私有镜像仓库(如 Docker Registry),核心是让外部通过域名安全、可信地访问内网 registry 服务,同时支持 HTTPS 和基础认证。这不是单纯转发请求,而是要解决协议兼容性、客户端信任、身份校验和头信息透传等关键问题。
准备 registry 服务与网络可达性
确保私有 registry 已正常运行,监听在内网地址(如 10.0.1.5:5000),且 Nginx 所在服务器能直接访问该地址(curl -I http://10.0.1.5:5000/v2/ 应返回 200)。Registry 必须配置为 http.host 或 addr 绑定到具体 IP,不能仅用 localhost 或 127.0.0.1,否则 Nginx 无法代理成功。
配置 Nginx 支持 HTTPS + 域名路由
新建配置文件(如 /etc/nginx/conf.d/registry.example.com.conf),包含两个 server 块:
- 80 端口 server:用
return 301 https://$host$request_uri;强制跳转,不写 location - 443 端口 server:启用 SSL,指定证书路径(
ssl_certificate /etc/nginx/cert.d/fullchain.pem;,ssl_certificate_key /etc/nginx/cert.d/privkey.pem;),并设置server_name registry.example.com;
务必开启 ssl_protocols TLSv1.2 TLSv1.3; 和 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;,避免旧协议导致 Docker 客户端拉取失败。
正确转发并透传关键请求头
在 location / 块中,proxy_pass 必须以斜杠结尾(http://10.0.1.5:5000/),否则路径拼接错误;同时必须添加以下头信息:
-
proxy_set_header Host $host;—— 保证 registry 正确识别请求域名 -
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;—— 告知 registry 当前是 HTTPS 请求,影响重定向行为 -
proxy_set_header X-Forwarded-Host $host;和X-Forwarded-Port "443";—— 部分 registry 版本依赖这些头生成正确 URL
还需关闭缓冲:proxy_buffering off;,并设置超时:proxy_read_timeout 900;,避免大镜像上传中断。
集成 HTTP Basic 认证(可选但推荐)
在 location 块内加入:
auth_basic "Registry Restricted";auth_basic_user_file /etc/nginx/.htpasswd;
用 htpasswd -c /etc/nginx/.htpasswd admin 创建用户文件。注意:Docker login 时需使用完整域名(docker login registry.example.com),且 registry 的 auth 配置应设为 none 或完全禁用,由 Nginx 统一鉴权。
配置完成后,运行 nginx -t 检查语法,再 systemctl reload nginx 生效。客户端执行 docker login registry.example.com 并推送镜像,即可验证整条链路是否通畅。











