在linux平台,使用capistrano, rvm, passenger来部署 rails 项目
1)安装capistrano, rvm, passenger
1.rvm的安装:可以参考(http://beginrescueend.com/rvm/install/ )
安装给单个用户:
1. bash < <(curl -s https://raw.github.com/wayneeseg ... ripts/rvm-installer )
如果你遇到无法安装,或者抱怨没有证书,像是下面的错误信息:
1. curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
2. error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
3. More details here: http://curl.haxx.se/docs/sslcerts.html
你需要使用下面的命令:
1. bash < <(curl -sk https://raw.github.com/wayneeseg ... ripts/rvm-installer )
如果还是有相同的问题。你可以在当前用户的根目录下创建 '.curlrc'文件,里面写上 insecure
1. #~/.curlrc
2. insecure
rvm安装好以后安装需要的ruby版本
1. rvm install 1.9.2
这样rvm先搞一段落了。
2.Capistrano,passenger的安装都放在项目的Gemfile文件里面
1. gem 'passenger'
2. group :development do
3. gem 'capistrano'#in production environment, don't need this gem package.
4. end
passenger的gem包安装好以后
运行passenger-install-apache2-module 我们用apache做我们的http服务器。
按提示一步一步做,最后会生成一段文字,叫你加入到apache的配置文件里。
类似:
1. LoadModule passenger_module /rvm_path/gems/rvm_gemset/gems/passenger-3.0.11/ext/apache2/mod_passenger.so
2. PassengerRoot /rvm_path/gems/rvm_gemset/gems/passenger-3.0.11
3. PassengerRuby /rvm_path/wrappers/rvm_gemset/ruby
按提示,把这段加到apache的配置文件中去。
apache的配置文件一般在/etc/httpd/conf/httpd.conf
然后你要配置一下,你这个项目的服务信息,添加一个xxx.conf的文件到/etc/httpd/conf.d
1. Listen port
2.
3. <VirtualHost *:port>
4. ServerName www.example.com
5. DocumentRoot /project_root/public
6. <Directory /project_root/public>
7. AllowOverride all
8. Options Indexes -MultiViews
9. RailsEnv production#or development, the environment name
10. </Directory>
11. </VirtualHost>
这时passenger配置也告一段落。
1,2都是production机器上安装配置
3)Capistrano的安装和配置。
由gem来安装,在开发机器上,到项目的根目录下运行
1. capify .
这个命令会创建2个文件,
Capfile
config/deploy.rb
我们要做的是编辑config/deploy.rb这个文件
1. # RVM bootstrap
2. $:.unshift(File .expand_path( "~/.rvm/lib" ))
3. require 'rvm/capistrano'
4. set :rvm_ruby_string , 'ruby-1.9.2-p290@rails313' #这个值是你要用rvm的gemset。名字要和系统里有的要一样。
5. set :rvm_type , :user # Don't use system-wide RVM
6. #这个不能少,否则部署不了。
7.
8. #下面的部署信息,应该都很清楚吧。
9. #some parameter setting
10. set :host ,server_name #set your server name
11. set :port_number , server_port #set your server port
12. set :rails_env , rails_env
13.
14. # main details
15. set :application , application_name
16. role :app , "#{host}"
17. role :web , "#{host}"
18. role :db , "#{host}" , :primary => true
19.
20. # server details
21. # default_run_options[:pty] = true
22. set :use_sudo , false
23. set :user , user_name
24. if user_pw. nil ?
25. ssh_options[:keys ] = %w(./lib/dsa_ssh_key)
26. else
27. set :password , user_pw
28. end
29. set :deploy_to , "#{deploy}/#{application}" #set your application path
30.
31.
32. # repo details use svn to manage code
33. set :repository , svn_repo
34. set :scm , :subversion
35. set :deploy_via , :export
36. set :scm_username , 'username'
37. set :scm_password , 'password'
38. set :runner , nil
39.
40. # runtime dependencies
41. depend :remote , :command , "monit"
42. depend :local , :command , "svn"
43. depend :remote , :gem , "bundler"
44.
45. # tasks
46. namespace :deploy do
47. task :start , :roles => :app do
48. run "touch #{current_path}/tmp/restart.txt"
49. end
50.
51. task :stop , :roles => :app do
52. # Do nothing.
53. end
54.
55. desc "Restart Application"
56. task :restart , :roles => :app do
57. run "touch #{current_path}/tmp/restart.txt"
58. end
59. end
60.
61. namespace :bundler do
62. desc "Install for production"
63. task :install , :roles => :app do
64. run "cd #{release_path} && bundle install"
65. end
66.
67. end
68. after 'deploy:update_code' , 'bundler:install'
部署文件搞定了。
开始部署。
1. cap deploy :setup
初始化一些目录,在production服务器上。
1. cap deploy
可能出现的问题,如果用mysql做数据库的话,可能你有些跟mysql相关的gem包没有安装,根据提示安装就可以了。
1. cap deploy :migrate
数据迁移,可能出现的问题,你的production数据库并没有创建,所以在服务器上先把数据库创建好了。
Capistrano的配置也搞一段落。
这时候,会有一些问题出现。
1)如果在项目的根目录下存在'.rvmrc'文件
这个文件的作用就是每次进去项目的根目录,自动切换到对应的rvm gemset环境
文件的内容:
1. #!/usr/bin/env bash
2. ruby_string="ruby-1.9.2-p290"
3. gemset_name="rails313"
4. if rvm list strings | grep -q "${ruby_string}" ; then
5. # Load or create the specified environment
6. if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
7. && -s "${rvm_path:-$HOME/.rvm}/environments/${ruby_string}@${gemset_name}" ]] ; then
8. \. "${rvm_path:-$HOME/.rvm}/environments/${ruby_string}@${gemset_name}"
9. else
10. rvm --create "${ruby_string}@${gemset_name}"
11. fi
12. else
13. # Notify the user to install the desired interpreter before proceeding.
14. echo "${ruby_string} was not found, please run 'rvm install ${ruby_string}' and then cd back into the project directory."
15. fi
这个文件,在进入根目录后会自动执行,不过需要添加信任,
所以我们要在用户的根目录下添加 .rvmrc 文件
内容:
1. rvm_trust_rvmrcs_flag=1
如果不添加这个文件,访问服务器的时候passenger会报个错误。说是.rvmrc需要添加信任。
2)因为使用rvm所以要在项目的config目录下添加一个load的配置文件
名字:setup_load_paths.rb
1. if ENV[ 'MY_RUBY_HOME' ] && ENV[ 'MY_RUBY_HOME' ].include?( 'rvm' )
2. begin
3. rvm_path = File .dirname( File .dirname(ENV[ 'MY_RUBY_HOME' ]))
4. rvm_lib_path = File .join(rvm_path, 'lib' )
5. $LOAD_PATH .unshift rvm_lib_path
6. require 'rvm'
7. RVM.use_from_path! File .dirname( File .dirname(__FILE__))
8. rescue LoadError
9. # RVM is unavailable at this point.
10. raise "RVM ruby lib is currently unavailable."
11. end
12. end
13.
14. # Pick the lines for your version of Bundler
15. # If you're not using Bundler at all, remove all of them
16.
17. # Require Bundler 1.0
18. ENV['BUNDLE_GEMFILE' ] = File .expand_path( '../Gemfile' , File .dirname(__FILE__))
19. require 'bundler/setup'
这样基本上所有的配置都全了,可以访问服务器了。如果有错误,应该是一些gem包没有装全,安装一下就好。参考其他人写的一些配置信息,我做了一下总结,和可能出现的错误。
enjoy it!
|