Nginx 位置匹配仅在匹配 root 时才起作用

lim*_*gni 7 nginx reverse-proxy

我正在尝试配置 nginx,以便我可以有两个位置。一个用于我的节点 API,另一个用于我的 Jenkins CI。

http://my_ip/api应该指向我的节点服务器并且http://my_ip/jenkins应该指向我的 jenkins CI

我有这个服务器块。

server {
listen 80;

server_name my_ip_address;

location /api {
    proxy_pass http://127.0.0.1:1234;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

location /jenkins {

   proxy_set_header        Host $host;
   proxy_set_header        X-Real-IP $remote_addr;
   proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header        X-Forwarded-Proto $scheme;

   proxy_pass          http://localhost:8080;
   proxy_read_timeout  90;

}
}
Run Code Online (Sandbox Code Playgroud)

该配置不起作用。但是,如果我使用与 root 匹配的任何这些位置,它就可以工作。

这没有问题。如果我只使用我的节点 api 的位置块,/也是如此。

location / {

   proxy_set_header        Host $host;
   proxy_set_header        X-Real-IP $remote_addr;
   proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header        X-Forwarded-Proto $scheme;

   proxy_pass          http://localhost:8080;
   proxy_read_timeout  90;

}
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改//jenkins它不工作了。

我知道我在这里遗漏了一些基本的知识,但我无法弄清楚这一点,因为我所看到的任何地方似乎都表明应该可以正常工作。

lim*_*gni 11

好吧,在对该主题进行了更多研究之后,我注意到该设置的问题在于位置 /api 没有连接到http://127.0.0.1:1234/它正在尝试连接到http://127.0.0.1:1234/apijenkins。

因此,解决方案是在 location 和 proxy_pass 中添加尾部斜杠。

location /api/ {
    proxy_pass http://127.0.0.1:1234/;
....

location /jenkins/ {
   proxy_pass          http://localhost:8080/;
   proxy_read_timeout  90;

....
Run Code Online (Sandbox Code Playgroud)

所以这就是诀窍。

  • 你刚刚救了我的一天! (2认同)