2016-08-12 81 views
1

我有一个Nexus Repository Manager OSS 3.0作为私人码头注册表运行在NGINX后面。我的Docker客户端(不是官方的Docker客户端)期待200 OK和一个空的JSON字符串{}/v2/返回。我遇到的问题是,Nexus返回200 OK但是一个空字符串。NGINX位置指令相同的位置

我的解决方法是让NGINX返回一个文件,其中包含一个空的JSON字符串/v2/请求和代理/v2/*请求到Nexus。

server { 
    listen    443 ssl; 
    server_name   nexus.example.com; 
    ssl_certificate  ssl/server.crt; 
    ssl_certificate_key ssl/server.key; 

    location = /v2/ { 
    root /home/ubuntu/www; 
    index empty.json; 
    } 

    location /v2/ { 
    proxy_pass       http://localhost:5000; 
    proxy_set_header Host    $http_host; # required for docker client's sake 
    proxy_set_header X-Real-IP   $remote_addr; # pass on real client's IP 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_read_timeout     900; 
    } 
} 

我希望它可以工作,但它会将所有的流量(/v2/, /v2/_catalog, /v2/myimage/manifests/latest等)的proxy_pass。我怎样才能让/v2/请求转到位置来切断empty.json文件?

回答

1

因此,您已将文件放置在/home/ubuntu/www/v2/empty.json

问题是index指令会将URI重写为/v2/empty.json,然后由location /v2/块处理。

一个解决办法是创建另一个位置以匹配重写的URI并将其用作静态文件:

root /home/ubuntu/www; 

location = /v2/ { 
    index empty.json; 
} 
location = /v2/empty.json { 
} 

另一种解决方案是使用error_page指令。但你仍然需要指定一个locationroot处理静态文件(S):

location = /v2/ { 
    return 405; 
    error_page 405 =200 /static/empty.json; 
} 
location/{ 
    root /home/ubuntu/www; 
} 
+0

谢谢你,这就是所有的意义世界!我提出了你提出的第一个解决方案,它效果很好。 –