【问题标题】:NGinX multiple sub uris to backend rootNGinX 多个子 uri 到后端根目录
【发布时间】:2016-06-24 09:20:23
【问题描述】:

我有一个我无法解决的问题,我希望我能得到一些提示来完成这项工作。我有多个后端,我想允许通过反向代理进行访问。我可以使用 NGinX 中的多个域轻松做到这一点,如下所示:

server {
   listen  80;
   server_name     repo.test.local;

   location / {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass http://172.16.1.32;
                   break;
          }
   }
   server {
   listen  80;
   server_name     maprwebui.test.local;

   location / {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass https://172.16.1.104:8443;
                   break;
          }
   }
   server {
   listen  80;
   server_name     spark.test.local;

   location / {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass http://172.16.1.102:8080;
                   break;
          }
   }
   server {
   listen  80;
   server_name     yarnhistory.test.local;

   location / {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass http://172.16.1.202:19888;
                   break;
      }
   }

但我希望能够像这样使用子 URI 来做到这一点:

server {
    listen  80;     
    server_name     proxy.test.local;

   location /repo {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass http://172.16.1.32;
                    }
   location /maprui {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass https://172.16.1.104:8443;
                    }
   location /spark {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass http://172.16.1.102:8080;
                  }
   location /yarn {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass http://172.16.1.202:19888;
                  }
   }

我已经尝试了所有我能想到的方法来让这个设置正常工作,但我最终在这些 URI 下得到了 404 的 URI,或者 NginX 应用程序认为它没有尝试点击 http://proxy.test.com/yarn/jobhistory 之类的东西,而是重新路由到 @ 987654322@

我已尝试重写规则以查看它们是否有效,但它们也无效,或者我做错了。我已经测试了以下内容,但无法修复:

    rewrite ^/yarn/(.*) /$1 break;
    proxy_pass http://172.16.1.202:19888;

有没有办法让它工作,而不必接触你想要公开的后端服务,或者不用做我正在做的事情,有多个域?

提前感谢您的帮助。

【问题讨论】:

标签: nginx proxy location uri reverse


【解决方案1】:

如果我理解正确,您的解决方案可能非常简单。 Nginx 将您传递给 proxy_pass 的内容视为主机,而不是 URI,也许试试这个:

server {
    listen  80;     
    server_name     proxy.test.local;

   location /repo {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass http://172.16.1.32/;
                    }
   location /maprui {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass https://172.16.1.104:8443/;
                    }
   location /spark {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass http://172.16.1.102:8080/;
                  }
   location /yarn {
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header Host $host;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                   proxy_pass http://172.16.1.202:19888/;
                  }
   }

注意端口后面的/。它应该就这么简单,您尝试做的当然是一个足够常见的用例。如果这不起作用,请告诉我,我们可以尝试其他方法。

更多讨论请见this question

【讨论】:

  • 嗨乔希,感谢您提供的信息。所以我让你的设置部分工作。我所做的不同之处在于还将尾随 / 添加到位置侧,例如 /yarn/。现在的问题是,同一站点内的其他调用或链接会产生 404,例如我得到 302 到 /yarn/jobhistory,但是 jobhistory 调用远程服务器上 /static 上的静态 css 文件,最终在代理端成为 404因为引用的 URL 是 proxy.test.local/static,而不是 proxy.test.local/yarn/static。有没有办法让所有调用都可重写而无需定义它们?
  • 由于 CSS 不受同源规则的约束,您可以返回到基于主机的 CSS 传递。是所有的 CSS 都来自 /yarn 还是其他的也有 CSS?
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 2021-11-24
  • 1970-01-01
  • 2014-04-09
  • 2012-01-26
  • 2016-01-17
相关资源
最近更新 更多