NGINX位置指令适用于同一位置

时间:2016-08-12 20:10:46

标签: nginx nexus nginx-location

我有一个在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文件?

1 个答案:

答案 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指令。但是您仍然需要指定locationroot来处理静态文件:

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