【问题标题】:nginx: use different server for different pathnginx:为不同的路径使用不同的服务器
【发布时间】:2016-12-09 12:06:49
【问题描述】:

我有两个 Rails 应用程序位于同一台机器上的两个不同 URI 后面。 nginx 配置是针对每个应用程序在自己的配置文件中进行的。

现在必须将其中一个应用程序慢慢合并到第二个应用程序中。在 URI 路径 application-one.com/register 下有一个可访问的端点。我只希望这个 application-one.com/register 路径能够访问第二个应用程序,而所有其他路径 (application-one.com/* except /register) 仍然访问第一个应用程序。

有没有办法在不使用 301 重定向的情况下做到这一点,因为我无法在我的情况下使用它们?

一个示例配置文件如下所示:

upstream unicorn_application_one {
    server unix:/tmp/unicorn_application_one.sock fail_timeout=0;
}

server {
    client_max_body_size ....
    ...
    server_name application-one.com

    root /home/deployer/application_one/current/public;
    try_files $uri/index.html $uri @unicorn_application_one;

    location @unicorn_application_one {
        proxy_set_header ...
        ....
    }

    location ^~ /assets/ {
        ...
    }

    ....
}

编辑:

我尝试了@joaumg 方法,但我不得不改变它:

每当我将上游提取到外部文件时,我都会收到 duplicate upstream 错误。

所以我只是将位置从@joaumg 的代码更改为:

location /register {
    proxy_pass http://unix:/tmp/unicorn_application_two.sock;
}

有没有办法按照@joaumg 所说的方式做到这一点而不会出现重复的上游错误?

【问题讨论】:

  • 您可以根据服务器块中的路径使用内部重定向。
  • 感谢@joaumg。你能发布一个例子吗?

标签: ruby-on-rails nginx server


【解决方案1】:

一个可能的例子(未经测试):

cat upstreams.conf

upstream unicorn_application_one {
    server unix:/tmp/unicorn_application_one.sock fail_timeout=0;
}

upstream unicorn_application_two {
    server unix:/tmp/unicorn_application_two.sock fail_timeout=0;
}

cat server_one.conf

include upstreams.conf;

server {
    client_max_body_size ....
    ...
    server_name application-one.com

    root /home/deployer/application_one/current/public;

    location /register {
        proxy_pass @unicorn_application_two;
    }

    try_files $uri/index.html $uri @unicorn_application_one;

    location @unicorn_application_one {
        proxy_set_header ...
        ....
    }

    location ^~ /assets/ {
        ...
    }


    ....
}

【讨论】:

  • 两个文件都有上游可以吗?
  • 你的意思是同一个文件中有两个上游?当然,如果您担心更改一个文件中的 url 而忘记在另一个文件中更改它,您可以include 他们,这样您就会有一个upstream.nginx.conf 或类似的东西。
  • 我的意思是在application-one.conf (which would be the one you postedapplication-two.conf (where it was already before)这样的两个文件中声明upstream unicorn_application_two
  • 既然您确实提到了它,很确定它会引发错误,但是,您可以使用include 将它们统一在一个外部文件中,就像我之前提到的那样。 (编辑答案以更好地反映这一点;D)
  • 非常感谢@joaumg。我编辑了我的答案。也许你知道我为什么会出现这个错误?
猜你喜欢
  • 2014-05-05
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
相关资源
最近更新 更多