ruby-on-rails – 为什么我需要在应用服务器而不是Web服务器上预
发布时间:2020-12-17 03:05:18 所属栏目:百科 来源:网络整理
导读:我正在为这个小型的ubuntu precision64服务器设置部署一个简单的Rails应用程序: * 1运行nginx的Web服务器 * 2个运行独角兽的应用服务器 * 1 db服务器运行 postgresql 我的服务器配置了Puppet,我正在用capistrano推送应用程序. 我的Capfile load 'deploy'# U
我正在为这个小型的ubuntu precision64服务器设置部署一个简单的Rails应用程序:
* 1运行nginx的Web服务器 * 2个运行独角兽的应用服务器 * 1 db服务器运行 postgresql 我的服务器配置了Puppet,我正在用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文件非常简单 # 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,:except => { :no_release => true } do run "service unicorn_#{application} stop" end task :restart,: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" 如果我不在应用服务器上预编译资产,则应用程序将失败. $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中的注释行,一切都很好. 但为什么 ?? 请帮我理解为什么:) 谢谢,最好的问候 若弗鲁瓦 解决方法
因为,除其他外,Rails会生成预编译资产的清单,包括文件名中文件的哈希值,然后在页面中包含资源时使用这些名称.当你说image_url(‘foo.jpg’)时,Rails最终会在源代码中生成foo-b48cf0140bea12734db05ebcdb012f1d265bed84.jpg.
Rails需要知道要为这些资产使用的编译名称,因此它必须具有清单,因此预编译需要在应用服务器上完成. 看一下public / assets / manifest.yml – 这是Rails需要的文件,以便正确地提供预编译资产. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |