Rails Rails 项目如何部署在子目录下?

linyunjiang · 2016年02月01日 · 最后由 linyunjiang 回复于 2016年02月20日 · 3296 次阅读

最近团队想把多个 h5 项目部署在同一域名下,这里尝试了两个方法: 1.方法一 config/application.rb添加

config.assets.prefix = '/my_app'

然后在 routes.rb 中添加

scope path: 'my_app'

这样修改完之后,通过测试基本是没问题的,但这样除了 assets 和 routes,其它的都是没有挂载到/my_app 路径下。

2.方法二

(1) 修改 config.ru run Rails.application 修改为

map '/my_app' do
  run Rails.application
end

这样修改完之后,整个项目都挂载到/my_app 路径下,但是此时面临一个问题 如果 layout 中<%= stylesheet_link_tag 'application', :media => 'all' %>引入 css,

#=> <link href="/assets/application-aeb7f08999bd392a10a9a6bef66803533655b777ddcf0d072c3a1b8f65fad9a7.css" media="all" rel="stylesheet" />

这样是加载不到 css 的,此时需要进行步骤 2 的设置

(2) 修改 config/application.rb 添加 config.relative_url_root = '/my_app' 这样<%= stylesheet_link_tag 'application', :media => 'all' %>

#=> <link href="/my_app/assets/application-aeb7f08999bd392a10a9a6bef66803533655b777ddcf0d072c3a1b8f65fad9a7.css" media="all" rel="stylesheet" />

如果上面说的有什么不妥的地方,麻烦指出

我是通过 nginx 里面直接配置的。。

server {
    listen       80;
    server_name  10.71.5.88;

    root /var/rails_apps/home;

    location ~ ^/apc(/.*|$) {
        alias /var/rails_apps/apc/public$1;  # <-- be sure to point to 'public'!
        passenger_base_uri /apc;
        passenger_app_root /var/rails_apps/apc;
        passenger_document_root /var/rails_apps/apc/public;
        rails_env          production; #development/production
        passenger_enabled on;
    }

    location ~ ^/forms(/.*|$) {
        alias /var/rails_apps/pl-form/public$1;  # <-- be sure to point to 'public'!
        passenger_base_uri /forms;
        passenger_app_root /var/rails_apps/pl-form;
        passenger_document_root /var/rails_apps/pl-form/public;
        rails_env          production; #development/production
        passenger_enabled on;
    }
}
2 楼 已删除

之前用 prefix 加 scope 碰到了 session 失效的坑,不知道现在有没有解决 https://www.mobomo.com/2013/03/rails-assets-prefix-may-disable-your-session/

我之前也遇到此类需求,百般折腾下终于搞出来了。分享下供大家参考 http://bastengao.com/blog/2015/12/rails-relative-url.html

因为我用的是 unicorn 来部署,所以搞得比较麻烦,如果使用 passenger,像 2 楼那样就简单的多

#5 楼 @linyunjiang unicorn 也是一样啊,不同的 location proxy 到不同的后端就行了

7 楼 已删除

没有测试过,简单示例一下,后端起 unicorn 在不同的 ip 或者端口均可;

upstream first_app{
   server 10.0.0.1:8888;
}
upstream second_app {
  server 10.0.0.2:8888;
}

server {
  listen 80;
  server_name test.example.com;

  location /first_app {
   # 根据需求,可能需要 rewrite,比如
   rewrite ^/first_app/(.*)$ $1 break;
   proxy_pass http://first_app;
 }
 location /second_app {
  # 根据需求,可能需要 rewrite,比如
  rewrite ^/second_app/(.*)$ $1 break;
  proxy_pass http://second_app;
 }
}
  1. 你遇到的 assets 的问题的解决方案一般是把 assets 挂载到独立的域名下,直接由 web server 来提供资源,比如放到 static.example.com 下面,走不同的子域名;
  2. rails url helper 产生的路由跟 nginx 会不一致,这个需要修改 routes.rb,用你上面的方法就行
需要 登录 后方可回复, 如果你还没有账号请 注册新账号