nginx代理

时间:2015-07-23 23:16:51

标签: ssl nginx docker proxypass

我已根据其官方文档在CentOS 7上设置了Docker私有注册表(v2):https://docs.docker.com/registry/deploying/

我在Fedora 21盒子上运行docker 1.6.0。

注册表在端口5000上运行,并且正在使用由受信任CA签名的SSL密钥。我为' docker-registry.example.com'设置了DNS记录。是服务器的内部IP。运行' docker pull docker-registry.example.com:5000/tag/image' ;,它按预期工作。

我设置了一个nginx服务器,运行nginx版本:nginx / 1.8.0,并为' nginx-proxy.example.com'设置dns记录。指向nginx服务器,并设置一个站点。这是配置:

server {
   listen 443 ssl;
   server_name nginx-proxy.example.com;

   add_header Docker-Distribution-Api-Version: registry/2.0 always;

   ssl on;
   ssl_certificate /etc/ssl/certs/cert.crt;
   ssl_certificate_key /etc/ssl/certs/key.key;

   proxy_set_header Host $host;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-Original-URI $request_uri;
   proxy_set_header Docker-Distribution-Api-Version registry/2.0;

   location / {
     proxy_pass http://docker-registry.example.com:5000;
   }
}

当我尝试运行' docker pull nginx-proxy.example.com/tag/image'我收到以下错误:

FATA[0001] Error response from daemon: v1 ping attempt failed with error: Get https://nginx-proxy.example.com/v1/_ping: malformed HTTP response "\x15\x03\x01\x00\x02\x02"

我的问题是双重的。

  1. 为什么docker客户端正在寻找/ v1_ / ping?
  2. 为什么我会看到“#response格式错误的反应”
  3. 如果我运行' curl -v nginx-proxy.example.com/v2'我明白了:

    [root@alex amerenda] $ curl -v https://nginx-proxy.example.com/v2/
    * Hostname was NOT found in DNS cache
    *   Trying 10.1.43.165...
    * Connected to nginx-proxy.example.com (10.1.43.165) port 443 (#0)
    * Initializing NSS with certpath: sql:/etc/pki/nssdb
    *   CAfile: /etc/pki/tls/certs/ca-bundle.crt
      CApath: none
    * SSL connection using TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
    * Server certificate:
    *   subject: CN=*.example.com,O="example, Inc.",L=New York,ST=New York,C=US
    *   start date: Sep 15 00:00:00 2014 GMT
    *   expire date: Sep 15 23:59:59 2015 GMT
    *   common name: *.example.com
    *   issuer: CN=GeoTrust SSL CA - G2,O=GeoTrust Inc.,C=US
    > GET /v2/ HTTP/1.1
    > User-Agent: curl/7.37.0
    > Host: nginx-proxy.example.com
    > Accept: */*
    > \x15\x03\x01\x00\x02\x02
    

    如果我做了' curl -v docker-registry.example.com'我得到200 OK响应。所以nginx必须对此负责。有谁知道为什么会这样?这让我疯了!

1 个答案:

答案 0 :(得分:16)

 proxy_pass http://docker-registry.example.com:5000;

您使用普通HTTP传递请求(即没有https)

  

\ X15 \ X03 \ X01 \ X00 \ X02 \ X02

您正在收到SSL响应。所以看起来你必须使用https://而不是http://来访问端口5000.你甚至知道你使用的是SSL:

  

注册表正在端口5000上运行,并且正在使用由受信任的CA签名的SSL密钥...

除此之外:请使用例如example.com保留的名称,不要在您的示例中使用不属于您的域名。