我有一个在NGINX后面运行的Nexus Repository Manager OSS 3.0作为私人docker注册表。我的Docker客户端(不是官方docker客户端)期望从200 OK
返回{}
和空JSON字符串/v2/
。我遇到的问题是Nexus返回200 OK
但是返回一个空字符串。
我的解决方法是让NGINX为/v2/
请求返回一个包含空JSON字符串的文件,并向Nexus发送代理/v2/*
请求。
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
文件?
答案 0 :(得分: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
指令。但是您仍然需要指定location
和root
来处理静态文件:
location = /v2/ {
return 405;
error_page 405 =200 /static/empty.json;
}
location / {
root /home/ubuntu/www;
}