首页 > 解决方案 > 对 nginx 后面的 docker 私有注册表的请求由 HTTPS 虚拟主机处理

问题描述

我有一个 docker 私有注册表容器在 HTTP 中的 Nginx 后面提供服务。

在我添加 HTTPS 服务器配置之前,一切工作正常。docker pull并且docker push请求由这个 HTTPS 虚拟主机而不是 docker 注册表虚拟主机处理(访问日志打印在 HTTPS 域下,docker 注册表域什么也没有)。

所以,很明显,我得到了 404 错误。

删除此 HTTPS 配置使其再次工作。

这是我的 docker 注册表配置/etc/nginx/sites-enabled

server {
    listen 80;
    server_name docker-registry.my-domain.com;
    access_log /data/log/nginx/$server_name.access.log;
    client_max_body_size 0;

    location ~ \.*$ {
        proxy_pass http://localhost:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $http_x_forwarded_for;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass_request_headers on;
    }
}

和下的HTTPS虚拟主机/etc/nginx/sites-enabled

server {
    listen 443 ssl;
    server_name foobar.my-domain.com;
    ssl_certificate /etc/nginx/certs/foobar.my-domain.com/crt;
    ssl_certificate_key /etc/nginx/certs/foobar.my-domain.com/key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    access_log /data/log/nginx/$server_name.access.log;

    location ~ \.*$ {
        proxy_pass http://localhost:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $http_x_forwarded_for;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass_request_headers on;
    }
}

server {
    listen 80;
    server_name foobar.my-domain.com;
    return 301 https://$server_name$request_uri;
}

当我使用<my-ip>:5000asinsecure-registries而不是 docker 注册表的域名时,一切正常。

当我使用 curl 向 发送请求时 http://docker-registry.my-domain.com/v2/<my-image>/manifests/latest,docker 注册表的访问日志会401 Unauthorized按预期打印。

我是否错误配置了 Nginx?

码头工人版本:

Client: Docker Engine - Community
 Version:           18.09.0-ce-beta1
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        78a6bdb
 Built:             Thu Sep  6 22:41:53 2018
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0-ce-beta1
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       78a6bdb
  Built:            Thu Sep  6 22:49:35 2018
  OS/Arch:          linux/amd64
  Experimental:     true

非常感谢!

- - - - - - - - 更新 - - - - - - - - - - - - - -

我发现如果我ssl在侦听 HTTPS 配置后删除协议,它工作正常。

标签: dockernginxhttps

解决方案


最后我发现,如果ssl也启用了docker-registry.my-domain.com,一切正常。我不知道为什么,但它确实有效。


推荐阅读