【问题标题】:NGINX location directives for the same location同一位置的 NGINX 位置指令
【发布时间】:2016-08-13 04:54:26
【问题描述】:

我有一个 Nexus Repository Manager OSS 3.0 作为私有 Docker 注册表在 NGINX 后面运行。我的 Docker 客户端(不是官方的 docker 客户端)期望从 /v2/ 返回一个 200 OK 和一个空的 JSON 字符串 {}。我遇到的问题是 Nexus 返回 200 OK 但一个空字符串。

我的解决方法是让 NGINX 为 /v2/ 请求返回一个包含空 JSON 字符串的文件,并将 /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 文件?

【问题讨论】:

    标签: nginx nexus nginx-location


    【解决方案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;
    }
    

    【讨论】:

    • 谢谢你,这一切都说得通!我采用了您提出的第一个解决方案,效果很好。
    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多