Rails网站布署 Capistrano+Nginx + Passenger

作者: wilsoncai 分类: RUBY/RAILS 发布时间: 2019-09-08 13:48

虚拟主机租用

你可以获得一整台的root权限,这些提供服务的厂商又可以概分为 VPS 和云端计算两种,常见的厂商包括:

IaaS 类型(Infrastructure as a Service)

  • VPS (Virtual Private Server) 类型

用 Vultr 的话, 新注册的同学,欢迎用这个 Referrals link: https://www.vultr.com/?ref=8248605

安装网站服务器 (Ubuntu 16.04)

  • 更新和升级已经安装的套件
sudo apt-get update
sudo apt-get upgrade -y
sudo dpkg-reconfigure tzdata
  • 安装新的套件们,这些是 Ruby on Rails 所需要的东西
sudo apt-get install -y build-essential git-core bison openssl libreadline6-dev curl zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3  autoconf libc6-dev libpcre3-dev curl libcurl4-nss-dev libxml2-dev libxslt-dev imagemagick nodejs libffi-dev 
  • 安装 Ruby
sudo apt-get install software-properties-common sudo apt-add-repository ppa:brightbox/ruby-ng sudo apt-get update sudo apt-get install ruby2.5 ruby2.5-dev
  • 安装MySQL数据库
sudo apt-get install mysql-common mysql-client libmysqlclient-dev mysql-server
mysql -u root -p
CREATE DATABASE your_database_name CHARACTER SET utf8mb4;
  • 安装 Nginx + Passenger 快方法
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7 sudo apt-get install -y apt-transport-https ca-certificates # Add our APT repository sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list' sudo apt-get update # Install Passenger + Nginx sudo apt-get install -y nginx-extras passenger

Nginx启动和重开用法:
sudo service nginx start 
sudo service nginx stop 
sudo service nginx restart
  • 新增 deploy 使用者
#vps新增 deploy用户来用来部署
sudo adduser --disabled-password deploy 
sudo su deploy 

#本机
cd ~ 
ssh-keygen -t rsa

接着复制本机的 ~/.ssh/id_rsa.pub 到 VPS的: /home/deploy/.ssh/authorized_keys:

Capistrano 自动化布署

  • 本地端Gemfile中加上:
gem 'capistrano-rails', :group => :development gem 'capistrano-passenger', :group => :development

#bundle install
  • Rails目录下执行
cap install
  • 编辑Capfile在中段加入
require 'capistrano/rails'
require 'capistrano/passenger'
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git
  • config/deploy.rb,请替换以下的application名称、git repo网址和deploy_to路径
`ssh-add` # 注意这是键盘左上角的「 `」不是单引号「 '」
set :application, 'rails-exercise' 
set :repo_url, 'git@github.com:ihower/rails-exercise.git' 
set :deploy_to, '/home/deploy/rails-exercise' set :keep_releases, 5 
append :linked_files, 'config/database.yml', 'config/secrets.yml'
 # 如果有 facebook.yml 或 email.yml 想要连结的话,也要加进来 
append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system' 
set :passenger_restart_with_touch, true
server '139.162.21.176', user: 'deploy', roles: %w{app db web}, my_property: :my_value
  • 编辑config/deploy/production.rbexample.com换成服务器的IP或网域

本机执行cap production deploy:check,就会自动登入远端的服务器,在登入的帐号下新建releasesshared这两个目录,releases是每次布署的档案目录,shared目录则是不同布署目录之间会共享的档案。

有了shared目录之后,我们还需要把设定档放上去,请编辑:

  • (远端) 编辑 shared/config/database.yml
  • (远端) 编辑 shared/config/secrets.yml

#执行下面命令部署

cap production deploy

Nginx配置

编辑 /etc/nginx/nginx.conf,打开以下一行:

include /etc/nginx/passenger.conf;

在 /etc/nginx/nginx.conf最上方新增一行:

env PATH;

少这一行的话,等会 Rails 会找不到 nodejs 的路径,在 nginx error log 中会有 Message from application: There was an error while trying to load the gem ‘uglifier’. Gem Load Error is: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. 的错误。

新增 /etc/nginx/sites-enabled/your_project_name.conf

server {
  listen 80;
  server_name your_domain.com; # 还没 domain 的话,先填 IP 位置

  root /home/deploy/your_project_name/public;
  # 如果是自动化部署,位置在 root /home/deploy/your_project_name/current/public;

  passenger_enabled on;

  passenger_min_instances 1;

  location ~ ^/assets/ {
    expires 1y;
    add_header Cache-Control public;
    add_header ETag "";
    break;
   }
}

以上设定包括设定Assets静态档案成为永不过期(Rails的Assets Pipeline会加上版本号,所以不需要担心)、设定Passenger至少开一个Process。其中server_name your_domain.com请会换成你的domain。如果Domain name还没注册好,可以先用服务器IP地址。但是如果你的服务器上有多个Rails专案或网站,就必须用不同domain来区分。

如果有多个domain连到同一个服务器,可以用空白区隔,例如:

server_name dureading.calvinchu.cc dureading.com www.dureading.com;

这样三个 domain 都会连到同一个 Rails 了。

最后执行sudo service nginx restart便会启用Nginx设定。如果之后你的Rails有任何修改要重新加载,但是并不想把Nginx整个重开,请在你的Rails应用程式目录下执行touch tmp/restart.txt即可,这样Passenger就会知道要重新加载Rails,而不需要重开Nginx

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签云