nginx 和代理传递中的多个位置块

multiple location blocks in nginx and proxy pass

我正在尝试 运行 NGINX 服务器后面的 2 个应用程序。

一个在3000(grafana)上监听,一个在9090(prometheus)上监听

我当前的服务器块 nginx.conf 如下所示:

server {
  listen 80;
  root /usr/share/nginx/html;
  index index.html index.htm;

  location / {
   proxy_pass http://localhost:3000/;
  }

location /prometheus{
   proxy_pass http://localhost:9090/;
  }

}

现在对于 Grafana,这非常有效,并且一切都在仪表板中正常工作。 但是当输入 Domain/prometheus 时,它仍然会将我重定向到 grafana 而不是 Prometheus。

我是否需要做一些特定的事情才能让它在这个设置中工作,除了 /prometheus 之外的所有内容都被重定向到 grafana?

默认情况下,http://localhost:9090 将被重定向到 http://localhost:9090/graph,因此请求被重定向如下:

# the origin request
http://Domain/prometheus

# the request redirect by nginx
http://localhost:9090/

# the request redirect by prometheus
http://Domain/graph

# the request redirect by nginx again
http://localhost:3000/graph

您可以在 Chrome 中使用 F12 进行检查。

要解决此问题,我建议您将域分为两个域:

server {
  listen 80;
  server_name Domain-Grafana; # Domain for Grafana
  root /usr/share/nginx/html;
  index index.html index.htm;

  location / {
   proxy_pass http://localhost:3000/;
  }
}

server {
  listen 80;
  server_name Domain-Prometheus; # Domain for Prometheus
  root /usr/share/nginx/html;
  index index.html index.htm;

  location / {
   proxy_pass http://localhost:9090/;
  }
}

所以我现在通过这样做解决了它:

server {
  listen 80;
  root /usr/share/nginx/html;
  index index.html index.htm;
    
location /prometheus {
   proxy_pass http://localhost:9090/prometheus;
  }

   
location / {
   proxy_pass http://localhost:3000/;
  }


}