部署 assets 线上调试的问题

yakjuly · 2012年01月04日 · 最后由 yakjuly 回复于 2012年02月04日 · 4203 次阅读

有时候在线上出现一些问题的时候,需要在线上进行调试。 服务器是使用 passenger 我以前的做法是 直接在 服务器上的代码加上一个 debug 然后用 rails s --debugger 启动一个新的进程调试,原来的 passenger 进程 没有重启,所以不会受到影响。剩下的就是找到问题,本地修改完上传代码重新部署。

但是 自从 rails3.1 有了 assets 后,用了静态文件 hash 吗,我用 nginx 来处理静态文件,那么按照上面方式调试的时候 打开页面 静态资源就出问题了 全部报错 404.js 没法执行,特麻烦,你们有遇到这样的情况吗?会怎么进行调试?

rake assets:precompile RAILS_ENV=production

这个有的。但是 nginx 配置 只支持 80 端口的 静态文件请求。我又不想修改 nginx 的配置。

* executing `deploy:assets:precompile'
  * executing "cd /home/app/apps/cms/releases/20120104063349 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile"
    servers: ["xxxxxx"]
    [app@xxxxxx] executing command
*** [err :: app@xxxxxx] /opt/ree/bin/ruby /home/app/apps/cms/shared/bundle/ruby/1.8/bin/rake assets:precompile:nondigest RAILS_ENV=production RAILS_GROUPS=assets

config/environments/production.rb 修改

config.serve_static_assets = false

嗯 这个可以有,就是每次要改一遍。我想到一个好方法 rails s --no_serve_static 这样的命令 启动的服务器进程 serve_static_assets 自动是 false 的 就好了。

#4 楼 @yakjuly 添加一个 production_debug 环境就可以了啊 数据库还用 production 的 修改 config/environments/production_debug.rb -> config.serve_static_assets = false 当然还可以改其他配置 然后 rails c production_debug 或 rails s -eproduction_debug

@hooopo 这个不需要配数据库和其他的么?

#6 楼 @yakjuly 需要一个数据库配置,用 production 的就行了。 不过如果代码里有这样的 hard code 也会出问题:

Rails.env == "production"

还要注意不要运行 migration 把 production 数据库给弄没了...

我觉得最通常的办法是建一个 staging 环境, 数据库从线上环境 dump 其他部署环境和配置与 production 环境一致

@hooopo 我们以前是这么做的,不过觉得目前还不需要这么大的改动

我想了想,觉得还是改成这样比较好

production.rb

  if ENV["SERVE_ASSETS"] == "false"
    config.serve_static_assets = true
  else
    config.serve_static_assets = false
  end


SERVE_ASSETS=false rails s --debugger
需要 登录 后方可回复, 如果你还没有账号请 注册新账号