【问题标题】:Multiple Rails apps over NGINX (reverse proxy)NGINX 上的多个 Rails 应用程序(反向代理)
【发布时间】:2016-01-28 22:52:14
【问题描述】:

我的服务器上有两个 Rails 应用程序。它们中的每一个都在瘦服务器上运行。我也在使用 NGINX。这是我的 NGINX 配置文件:

server{

location /blog {
   proxy_pass http://127.0.0.1:8082;
    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

}
location /website1 {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
}

"http://HOST/blog" => 我收到 404 错误(空白页)

"http://[HOST]/website1" => 我的 Rails 应用程序出现 404 错误,在我的应用程序日志中我得到:

 INFO -- : Started GET "/website1"
 FATAL -- : ActionController::RoutingError (No route matches [GET] "/website1")

发生了什么???

我尝试将网站 1 的位置设置在“/”上,将博客的位置设置在“/blog”上。在这种情况下,网站 1 运行良好,但我仍然在博客上收到 404(空白页面,而不是 rails 页面)。

有什么想法吗?谢谢你的帮助!

【问题讨论】:

    标签: ruby-on-rails ruby nginx thin proxypass


    【解决方案1】:

    尝试在代理通行证中添加尾部斜杠。喜欢:

    proxy_pass http://127.0.0.1:8082/;
    proxy_pass http://127.0.0.1:3000/;
    

    from(如下向服务器传递一个请求URI):http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

    为了进一步解释为什么会出现 404,rails 会在排除尾部斜杠时看到完整路径(例如,http://HOST/website1 -> /website1 & http://HOST/blog -> /blog)。听起来这两个应用程序的 rails 路由都不需要前缀。通过在代理传递行中包含尾部斜杠,您的 url 将得到转换,使得 http://HOST/website1/ 成为 rails 侧的根路径(/)。如果您遇到 Rails 重定向无法正常工作的问题,您可能还需要 proxy_redirect default;。见:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

    【讨论】:

    • 谢谢!这样效果更好!我永远不会发现缺少斜杠。为了让它工作,我还添加了config.action_controller.relative_url_root = '/blog' 所以当我到达HOST/blog 时,我的根页面就会显示出来。但是,每当我单击链接时,前缀都会被忽略,它会转到 HOST/posts/1。你有什么主意吗?很抱歉问了这么愚蠢的问题,但我真的对生产环境一无所知!
    • 如果您设置config.action_controller.relative_url_root,那么我认为您不需要尾部斜杠。 relative_url_root 也应该处理 url 生成。
    【解决方案2】:

    我不喜欢将多个配置放在一个文件中,而且你最好使用虚拟主机。只需将假域名添加到您的主机文件中即可。以下是你的做法:

    http://articles.slicehost.com/2009/4/17/centos-nginx-rails-and-thin

    我会补充一点,我喜欢将每个服务器配置放在自己的文件中,并将其命名为 domain1.com_server.conf

    更新:

    我试过你的配置,它可以工作。正如其他答案所建议的那样,我唯一更改的部分是在末尾添加 / 。您可能还有其他问题。这就是为什么我将您指向博客文章的原因。你这样做的方式有问题,但如果你解决它们就可以了。例如,您需要告诉 Rails 您不是在根域上运行,而是在 /website1 或 /blog 上运行。您还需要修复任何假定资源路径从根目录开始的 html 链接。这就是虚拟主机提供更清洁解决方案的原因。

    【讨论】:

    • 是的,我同意你的看法,但这“只是”一种最佳做法,对吧?我只是想让它现在工作。我仍然不知道这里有什么问题。
    • 这只是一个最佳实践。就您的特定问题而言,我认为您配置错误。这就是我给你链接的原因。主要是设置一个上游,并设置你的根。
    • 我想您也可以按照您描述的方式进行操作。我假设您的网站 1 工作正常,因为您只是将请求传递给运行在端口 3000 上的瘦服务器。您是否有另一台在端口 8082 上运行的瘦服务器?
    • 好的,更新了我的答案,将我拥有的工作服务器的配置与您的配置混合在一起。如果它有效,你可以用它来清理你不需要的东西。
    • 没关系,我在阅读其他答案后删除了更新。基本上做了同样的事情,但不需要添加任何其他东西。您需要做的就是在 proxy_pass 末尾添加 /。你的配置仍然会被破坏。但是您的网站将启动并运行。您需要设置 root 以便您的静态资源将得到正确服务。我仍然建议您查看该博客文章,以解决您在网站启动并运行后可能会遇到的其他问题。
    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 2022-01-07
    • 2018-05-28
    • 2021-05-22
    • 2020-04-04
    • 2020-04-16
    • 2016-09-04
    • 2016-01-12
    相关资源
    最近更新 更多