我使用nginx为两个Rails网站提供服务。 Rails1不使用资产管道,但Rails2使用。 Rails2还使用前缀将其与Rails1区分开来。例如:
http://myhost -> Rails1 http://myhost/abc -> Rails2
两个网站都在运行,但是对Rails2网站上的资产的任何引用都找不到。
这是我的伪nginx.conf的样子:
http { upstream rails1 { server 127.0.0.1:3000; } upstream rails2 { server 127.0.0.1:3030; } server { location ~ ^/assets/ { expires max; add_header Cache-Control public; access_log off; } location /abc { proxy_pass http://rails2; } location / { proxy_pass http://rails1; } } }
此外,我的Rails 2应用程序中的routes.rb:
Rails2App::Application.routes.draw do
scope '/abc' do
resources :projects
root :to => 'home#index'
end
end
浏览http://myhost/abc/
Rails2应用,打开没有css的页面,并出现以下错误:
GET http://myhost/assets/application-asdasd.css 404 (Not Found)
我尝试在production.rb文件中使用config.assets.prefix = '/abc'
,但它无效。我也尝试过在ngnix.conf文件中使用不同的变体也无济于事。
任何人都知道我做错了什么,或者错过了什么?
更新
我不太清楚为什么,但我能够使用@location而不是上游来(错误地)工作。但我不得不将资源文件夹从Rails2应用程序移动到Rails1应用程序。不完全理想。
对服务器部分的更改:
location ~ ^/(assets)/ { expires max; add_header Cache-Control public; access_log off; } location ~ ^/(abc)/ { root /rails2/public; try_files $uri/index.html $uri.html $uri @rails2; error_page 404 /404.html; error_page 422 /422.html; error_page 500 502 503 504 /500.html; error_page 403 /403.html; } location / { root /rails1/public; try_files $uri/index.html $uri.html $uri @rails1; error_page 404 /404.html; error_page 422 /422.html; error_page 500 502 503 504 /500.html; error_page 403 /403.html; } location @rails1 { proxy_pass http://127.0.0.1:3000; } location @rails2 { proxy_pass http://127.0.0.1:3030; }
答案 0 :(得分:1)
来自类似的问题:https://stackoverflow.com/a/3355589/417872
你试过这个吗?
config.action_controller.relative_url_root = '/rails_app'
我建议googleing如何从子目录正确地提供rails应用程序。这是你正在处理的真正问题,快速搜索返回了几页有用的链接。
答案 1 :(得分:0)
我在生产环境中在Nginx上运行Rails 4时遇到了类似的问题。我找到的解决方案是在root
中指定资产位置的nginx.conf
路径:
location ^~ /assets/ {
root /home/rails/myapp/public;
gzip_static on;
expires max;
add_header Cache-Control public;
}
希望这有帮助