问题描述
我正在将一个简单的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资产?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!