从单个IP提供多个Rails应用程序:找不到静态资产(nginx + Passenger)

时间:2013-02-08 17:55:40

标签: ruby-on-rails ruby-on-rails-3 nginx asset-pipeline passenger

我已经在VPS上设置了nginx和Passenger来从两个不同的路径提供两个Rails应用程序。这是我的目标 - 从单独的子URI中为每个Rails应用程序提供服务。

123.123.123.123/app1
123.123.123.123/app2

根据Passenger + nginx文档,我设置了以下nginx.conf

server {
        listen 80;
        server_name 123.123.123.123;

        location /app1 {
            alias /u/apps/app1_project_name;
            passenger_enabled on;
            passenger_base_uri /app1;
        }

        location /app2 {
            alias /u/apps/app2_project_name;
            passenger_enabled on;
            passenger_base_uri /app2;
        }
    }

我在/u/apps/app1_project_name/u/apps/app2_project_name目录中创建了一个名为app1app2的符号链接,分别链接到./current/public

当我访问该网站时,所有页面都正确显示,但没有任何静态资产可以正常工作!如果我查看页面源代码,我会看到指向以下页面的链接:/app1/home/index。如果我点击它,该链接有效。

但是,对于.css和.js资产,还有如下链接:/app1/assets/application-1b13569e9620782f423d4cd3ce931750.css但点击链接时找不到它们!

我的nginx + Passenger配置有什么问题,它没有正确路由这些吗?检查public/assets文件夹显示文件实际上是正确预编译的并且确实出现在那里。

1 个答案:

答案 0 :(得分:1)

在您的情况下,导致错误的资产应该包含在您的application.js清单文件中,如下所示:

//= require hsv_to_rgb
//= require overlays
//= require initialize

并从您的production.rb中删除它:

config.assets.precompile += %w( hsv_to_rgb.js initialize.js overlays.js )

正常情况下,部署后,在服务器上的public/assets(生产环境中)中,您应该只能看到application.jsapplication.css的不同版本。

考虑在视图模板中application.js之前调用外部JavaScript(最佳解释here),如下所示:

<%= javascript_include_tag 'https://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false' %>
<%= javascript_include_tag "application" %>
编辑:实际问题已由@aardvarkk解决,只需更改production.rb中的设置,如下所示:

config.serve_static_assets = true

nginx的配置包括设置的子URI。