我正在使用nginx为两个Rails网站提供服务。Rails1 不使用资产管线,但 Rails2 使用。Rails2 还使用前缀来区分它与 Rails1。 例如:
http://myhost ->导轨1http://myhost/abc ->导轨2
两个站点都在运行,但是找不到对 Rails2 站点上资产的任何引用。
这是我的伪nginx.conf的样子:
http { 上游导轨1 { 服务器 127.0.0.1:3000; } 上游导轨2 { 服务器 127.0.0.1:3030; } 服务器 { 位置 ~ ^/资产/{ 最大过期时间; add_header缓存控制公共; access_log关; } 位置/ABC { proxy_pass http://rails2; } 位置/{ proxy_pass http://rails1; } }}
另外,我的 Rails 2 应用程序中的 routes.rb:
Rails2App::Application.routes.draw do
scope '/abc' do
resources :projects
root :to => 'home#index'
end
end
浏览到 Rails2 应用程序的http://myhost/abc/
,显示没有 css 的页面,并出现以下错误:
获取 http://myhost/assets/application-asdasd.css 404(未找到)
我尝试在 production.rb 文件中使用 config.assets.prefix = '/abc'
,但它不起作用。 我也在ngnix.conf文件中尝试了不同的变体,但也无济于事。
有人知道我做错了什么,或者错过了什么吗?
更新
我不太确定为什么,但我能够使用@location而不是上游(错误地)让它工作。 但是我不得不将资产文件夹从 Rails2 应用程序移动到 Rails1 应用程序。 不太理想。
对服务器部分的更改:
位置 ~ ^/(资产)/{ 最大过期时间; add_header缓存控制公共; access_log关;}位置 ~ ^/(ABC)/{ 根/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;}位置/{ 根/轨1/公共; 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;}位置 @rails1 { proxy_pass http://127.0.0.1:3000;}位置 @rails2 { proxy_pass http://127.0.0.1:3030;}
来自一个类似的问题:https://stackoverflow.com/a/3355589/417872
你试过这个吗?
config.action_controller.relative_url_root = '/rails_app'
我建议谷歌搜索如何从子目录正确提供 rails 应用程序。这是您正在处理的真正问题,快速搜索返回了几页有用的链接。
我在生产环境中在Nginx上运行Rails 4时遇到了类似的问题。我找到的解决方案是在nginx.conf
中指定资产位置的root
路径:
location ^~ /assets/ {
root /home/rails/myapp/public;
gzip_static on;
expires max;
add_header Cache-Control public;
}
希望这有帮助