为什么我需要在应用服务器上而不是仅在Web服务器上预编译Rail

为什么我需要在应用服务器上而不是仅在Web服务器上预编译Rail

本文介绍了为什么我需要在应用服务器上而不是仅在Web服务器上预编译Rails资产?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将一个简单的Rails应用程序部署到此小型ubuntu precision64服务器设置中:
* 1个运行nginx的Web服务器
* 2个运行独角兽的应用服务器
* 1个运行postgresql的数据库服务器

I'm deploying a simple Rails app to this small ubuntu precise64 server setup :
* 1 web server running nginx
* 2 app servers running unicorn
* 1 db server running postgresql

我的服务器已配置了Puppet,我正在用capistrano推送该应用程序.

My servers are provisionned with Puppet and I'm pushing the app with capistrano.

我的 Capfile

load 'deploy'
# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'
load 'config/deploy' # remove this line to skip loading any of the default tasks

deploy.rb文件非常简单

The deploy.rb file is super simple

# Execute "bundle install" after deploy, but only when really needed
require "bundler/capistrano"

# Name of the application in scm (GIT)
set :application, "devops-test-app"
set :repository, "https://github.com/geoffroymontel/devops-test-app.git"
set :scm, :git

set :deploy_to, "/var/www/#{application}"

# server there the web server is running (nginx)
role :web, "172.16.0.2"

# server there the db is running
# This is where Rails migrations will run
role :db, "172.16.0.3", :primary => true

# servers there the app servers are running (unicorn)
role :app, "172.16.0.4", "172.16.0.5"

set :rails_env, :production

# user on the server
set :user, "deployer"
set :use_sudo, false

namespace :deploy do
  task :start, :roles => :app, :except => { :no_release => true } do
    run "service unicorn_#{application} start"
  end

  task :stop, :roles => :app, :except => { :no_release => true } do
    run "service unicorn_#{application} stop"
  end

  task :restart, :roles => :app, :except => { :no_release => true } do
    run "service unicorn_#{application} restart"
  end

  task :copy_in_database_yml do
    run "cp #{shared_path}/config/database.yml #{latest_release}/config/"
  end

  # Precompile assets
  # I have to precompile the assets on the app servers too, and I don't really know why...
  # namespace :assets do
  #   task :precompile, :roles => [:web, :app], :except => { :no_release => true } do
  #     run %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile}
  #   end
  # end
end

before "deploy:assets:precompile", "deploy:copy_in_database_yml"

如果我没有在应用服务器上预编译资产,则该应用将失败.

If I don't precompile assets on the app servers, the application fails.

$ cap ROLES="app" COMMAND="cat /var/www/devops-test-app/current/log/production.log" invoke
  * 2013-05-01 21:43:10 executing `invoke'
  * executing "cat /var/www/devops-test-app/current/log/production.log"
    servers: ["172.16.0.4", "172.16.0.5"]
    [172.16.0.5] executing command
 ** [out :: 172.16.0.5] Connecting to database specified by database.yml
 ** [out :: 172.16.0.5] Connecting to database specified by database.yml
 ** [out :: 172.16.0.5] Started GET "/posts" for 172.16.0.2 at 2013-05-01 19:42:10 +0000
 ** [out :: 172.16.0.5] Processing by PostsController#index as HTML
 ** [out :: 172.16.0.5] Rendered posts/index.html.erb within layouts/application (25.7ms)
 ** [out :: 172.16.0.5] Completed 500 Internal Server Error in 122ms
 ** [out :: 172.16.0.5]
 ** [out :: 172.16.0.5] ActionView::Template::Error (application.css isn't precompiled):
 ** [out :: 172.16.0.5] 2: <html>
 ** [out :: 172.16.0.5] 3: <head>
 ** [out :: 172.16.0.5] 4:   <title>DevopsTestApp</title>
 ** [out :: 172.16.0.5] 5:   <%= stylesheet_link_tag    "application", :media => "all" %>
 ** [out :: 172.16.0.5] 6:   <%= javascript_include_tag "application" %>
 ** [out :: 172.16.0.5] 7:   <%= csrf_meta_tags %>
 ** [out :: 172.16.0.5] 8: </head>
 ** [out :: 172.16.0.5] app/views/layouts/application.html.erb:5:in `_app_views_layouts_application_html_erb__677166568443748084_17536100'
 ** [out :: 172.16.0.5] app/controllers/posts_controller.rb:7:in `index'

如果我取消注释 deploy.rb 中的注释行,一切都很好.

If I uncomment the commented lines in deploy.rb, everything is fine.

但是为什么?我以为您只需要在Web服务器上编译资产,而无需在应用程序服务器上编译资产.

But why ??I thought you would need to compile the assets only on the web server, not on the app server.

请帮助我理解原因:)

谢谢,问候

Geoffroy

推荐答案

这是已知错误在Capistrano中.

This is a known bug in Capistrano.

1)评论

加载部署/资产"

您的 Capfile 上.

2)在 deploy.rb 文件的顶部添加以下几行:

2) Add the following lines at the top of your deploy.rb file :

设置:assets_role,[:web,:app]
加载部署/资产"

就是这样!

这篇关于为什么我需要在应用服务器上而不是仅在Web服务器上预编译Rails资产?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-31 17:37