Rails Production Server @ Nginx + Postgresql + Ubuntu 使用git远程部署 配置

转自linux公社

貌似Heroku在国内访问既慢又不稳定,所以不得已需要自己搭建一台production服务器。我们的目标是和Heroku类似,直接能够从开发环境部署并运行。虽然貌似文档很多,但是还是有很多问题。

------------------------------------------------------

警告:似乎如果目录权限配置不正确一下设置会导致rails 一直报404

安装RVM

  1. #我是在root下装的全局rvm,使用基于账户的rvm请自行修改对应设置   
  2. curl -L get.rvm.io | bash -s stable  
  3. #add user to rvm group   
  4. vi /etc/group   
  5.   
  6. source /etc/profile.d/rvm.sh  
 
  1. #成功的话跑这个会说rvm是function  
 
  1. type rvm |head n1  

安装ruby

  1. apt-get install build-essential bison openssl curl git-core zlib1g zlib1g-dev libssl-dev  
  2. rvm install 1.9.2  
  3. rvm use 1.9.2 --default  

安装passenger

  1. rvm 1.9.2 --passenger  
  2. gem install passenger  
  3. rvmsudo passenger-install-nginx-module  
会提示你下载安装nginx,按照配置来即可
装好以后需要做2件事,1,搞到nginx启动脚本
  1. git clone git://github.com/jnstq/rails-nginx-passenger-Ubuntu.git  
  2. sudo mv rails-nginx-passenger-Ubuntu/nginx/nginx /etc/init.d/nginx  
  3. sudo chown root:root /etc/init.d/nginx  
2,修改nginx配置
  1. server {  
  2.   
  3.       listen 80; #the server will be running on this port  
  4.   
  5.       server_name www.yourhost.com;  
  6.   
  7.       root /home/deployer/your_rails_project/public;   # <--- be sure to point to 'public'!  
  8.       passenger_enabled on;  
  9.    }  

Postgresql 安装配置

安装
  1. sudo apt-get install postgresql postgresql-client libpq-dev  
  2. # libpq-dev is required for gem 'pq'  
确定运行
  1. netstat -atn | grep -v tcp6 | grep 5432  
创建用户 并修改密码
  1. sudo -u postgres createuser --superuser <username>  
  2. sudo -u postgres psql postgres  
  3. \password <username>  
建数据库
  1. create database <database_name>;  
  2. grant all privileges on database <database_name> to <user_name>;  
修改配置文件使得本地连接ok
  1. vi /etc/postgresql/9.1/main/postgresql.conf  
  2. #uncomment listen_addresses = 'localhost'  

确保如下信息,否则rails会出错

  1. /etc/postgresql/9.1/main/pg_hba.conf:  
  2. # "local" is for Unix domain socket connections only   
  3. local   all         all                               md5  

配置好数据库以后记得在config/database.yml里修改对应配置

给rails添加Capistrano

在服务器上找个用来签入的库的地方
  1. mkdir -p ~/gitrepo/projectname.git  
  2. cd ~/gitrepo/projectname.git  
  3. git --bare init  
配置一个本地的ssh key
  1. # 检测是否有文件,如果没有的话创建一个dsa的key  
  2. $test -e ~/.ssh/id_dsa.pub || ssh-keygen -t dsa  
  3. # 设置本服务器接收使用id_dsa的公钥连接  
  4. $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys2  
  5. #这一句其实很重要,因为后面实际上是本地连接这个库拖到部署目录上,所以其实有一个本地ssh本地的过程  
tips,记得修改一下nginx的目录,因为Capistrano会添加一个current作为本项目的当前部署版本的根目录,所以应该指向类似于
  1. /webhome/project/current/public  
去掉Gemfile的
  1. gem 'capistrano'  
的注释

到开发机
把程序添加到git
  1. cd rails_app_dir  
  2. git init  
  3. git add .  
 
  1. git commit -m 'init commit'  
 
  1. bundle install  
 
  1. bundle pack  
  2. git add Gemfile.lock vendor/cache  
  3. git commit -m 'bundle gems'  
 
  1. git remote add <repo_name> ssh://user@host/dir_to_repo_in_the_server  
  2. #这个例子里就是  
  3. #ssh://user@host/~/gitrepo/projectname.git  
 
  1. git push <repo_name> master  
  2. #这里出错大多是因为前面key没配好,或者你忘了把你的公钥传到服务器上去变成authorized_keys2  

远程部署

  1. capify .  
编辑./config/deploy.rb
配置如下:
  1. set :user, '<username>'  
  2. set :domain, '<host_name>'   
  3.   
  4. set :application, "<app_name>"  
  5. set :repository,  "#{user}@#{domain}:/opt/webapp/project_depo/depo.git"  
  6.   
  7. set :deploy_to, "<dir_setted_in_the_nginx>" #in this example /webhome/project  
  8.   
  9. set :scm, "git"  
  10. # Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`  
  11.   
  12. role :web, domain                          # Your HTTP server, Apache/etc  
  13. role :app, domain                          # This may be the same as your `Web` server  
  14. role :db,  domain, :primary => true # This is where Rails migrations will run  
  15. # role :db,  "your slave db-server here"  
  16.   
  17.   
  18. set :deploy_via, :remote_cache    # this let the server clone from the git repo in the server  
  19. set :branch, 'master'  
  20. set :scm_verbose, true  
  21. set :use_sudo, false  
  22.   
  23.   
  24. require 'rvm/capistrano'         # this is useful when you use rvm  
  25. set :rvm_ruby_string, "1.9.2"  
  26. set :rvm_type, :system           # if you are not use system wide rvm then change it to :user  
  27. # if you're still using the script/reaper helper you will need  
  28. # these http://github.com/rails/irs_process_scripts  
  29.   
  30. # If you are using Passenger mod_rails uncomment this:  
  31. namespace :deploy do  
  32.   task :start do ; end  
  33.   task :stop do ; end  
  34.   task :restart, :roles => :app, :except => { :no_release => true } do  
  35.     run "touch #{File.join(current_path,'tmp','restart.txt')}"  
  36.   end  
  37.   task :seed do  
  38.     run "cd #{current_path}; rake db:seed RAILS_ENV=production"  
  39.   end  
  40. end  
  41.   
  42. after "deploy:update_code", :bundle_install  
  43. desc 'install prerequisites'  
  44. task :bundle_install, :roles => :app do  
  45.    run "cd #{release_path} && bundle install"  
  46. end  
准备部署
  1. cap deploy:setup  
  2. cap deploy:check  
  3. cap deploy:migrations  
  4. #如果最后一步有错试试   
  5. #cap deploy:cold  
以后部署只需要
  1. git add .  
  2. git commit -m 'comments'  
  3. git push <repo_name>  
  4. cap deploy  
  5.   
  6. # 如果需要取消部署  
  7. # cap deploy:rollback  
注意这一步如果出现 .../public/image 文件没找到等错误需要在deploy.rb里设置
  1. set :normalize_asset_timestamps, false  
另外需要
  1. bundle exec rake assets:precompile RAILS_ENV=production  

你可能感兴趣的:(nginx,server,ubuntu,git,PostgreSQL,Rails)