第四期 布署Rails到Ubuntu服务器上

由于这一期录的不够详细,给一些朋友造成了障碍,因此我重新录了一个视频,重新写了一份文档,链接在此:Deploy Ruby on Rails App on Ubuntu 18.04

这一期讲的是如何部署到服务器上,如果按照一般的流程,都是要等到代码写完了,才会部署到服务器上,但是,我不想那么做,主要的原因我在第一期中讲了,我怕自己一鼓作气,再而衰,三而竭。所以,直接就先布署了。基本上,做一期视频,就部署一期,有bug的话,再修改。

这次部署我先来讲一下要用到的布署环境和用到的软件。

部署当然要至少用到两部分,第一部分是自己的机器,这个叫开发机;另一部分是购买的机器,这个叫服务器。

开发机呢,自己用,有什么样的机器就用什么样的机器,这个没什么关系,不过,只有一个小建议,因为这个软件是布署在Linux上的,所以,如果你开发的机器和布署的机器用相同版本的操作系统,可能会有意想不到的好处。(因为我要录视频的原因,Ubuntu上没有好用的录视频软件,所以,我才用的mac系统)

另一部分是服务器了,国内提供的主机主要有阿里云,京东云,筋斗云,什么蘑菇云的,挑一家便宜的就可以了。这里要考虑的问题是,这几家云公司不可能任何版本的Linux系统都有,只提供主流的Linux,所以,先Ubuntu这种主流的烂大街的Linux会是一个比较安全的选项。

我个从十分推荐使用Ubuntu。我买主机的时候,Ubuntu最稳定的版本是16.04,现在有18.04了,当时没有,所以,我用16.04。

其它的软件分别有:

Ruby用2.5.1版本,Rails用5.2.0版本,Nginx用1.14.0版本,passenger和capistrano用最新的就好。这里要强调的是,其它的变化可能都不是太大,但是rails版本可能会有很大的变化,只要确认了这个版本,其它的没什么问题。

还有一个问题是数据库,这里有三种选择,一个是SQLite,一个是MySQL,还有一个是PostgreSQL。说实在的,我做的这个小项目,最适合的数据库是SQLite。我以前也曾经觉得SQLite不行,但是,我比较懒,有一次我写代码的时候不想去配置MySQL,就直接用的SQLite,用来存路由表,后来这个数据库存到了12G,查询存储的性能一点问题没有,经过那次以后,我对SQLite才是刮目相看。

但是,我录视频,如果用SQLite,好像显得诚意不足,所以,我采用了更加专业的MySQL,其实对这个项目来说,用MySQL是杀鸡用牛刀。希望大家在做小Demo项目的时候用SQLite,非常好用。虽然它的图标是个鸡毛,但是现在它在我心里已经是个重若泰山的鸡毛了。

第一步,要有自己的主机

要看这张流程图(相关的keynote可以到这里下载)

第二步,要建立一个账户。

有了主机以后,最好是Ubuntu 16.04。

最近在南极发现了一种新物种,一种不怕寒冷的蜜蜂,生物学家说跟非洲的杀人蜂是同一个类型,只是这种蜂有牙齿和舌头,食肉动物。嘴非常大,名字叫树新蜂,所以,我就以树新蜂为用户名作为布署的账户。英文名叫treenewbee。

sudo adduser treenewbee
sudo adduser treenewbee sudo
su treenewbee

因为我们要自动布署,就要让这个teenewbee的账户可以自动登录,在自己的机器上执行这条命令:

ssh-copy-id treenewbee@IPADDRESS

这样的话就可以完成自动登录了。

如果碰到超时的话,可以在自己的电脑端设置一下

Host IP_Address
Hostname IP_Address
User treenewbee
ServerAliveInterval 50
ServerAliveCountMax 60

第三步,安装Ruby,2.5.1

Ruby可以有四种方法来安装

第一种是用rbenv,第二种是使用rvm,第三种是用Ubuntu自带的,还有最狠的就是从源码开始安装。我推荐用rbenv的方法来安装,为什么呢?因为ruby有不少版本,你也许要在现同的软件里用不同的ruby,比如这里用的是2.5.1,但是其它的软件里用的是1.9.2版本,那就需要ruby的版本管理系统。推荐用rbenv这个软件。

$curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
$curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$sudo apt-get update
$sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev software-properties-common libffi-dev
$nodejs yarn

然后使用rbenv

$cd
$git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$echo ‘export PATH=”$HOME/.rbenv/bin:$PATH”‘ >> ~/.bashrc
$echo ‘eval "$(rbenv init -)”‘ >> ~/.bashrc
$exec $SHELL
$git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$echo ‘export PATH=”$HOME/.rbenv/plugins/ruby-build/bin:$PATH”‘ >> ~/.bashrc
$exec $SHELL

$rbenv install 2.5.1
$rbenv global 2.5.1
$ruby -v

最后,还要安装bundler

$gem install bundler

执行完以后,再执行

$rbenv rehash

第四步,安装nginx

$sudo apt-get install -y dirmngr gnupg
$sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv-keys 561F9B9CAC40B2F7
$sudo apt-get install -y apt-transport-https ca-certificates

第五步,安装passenger

$sudo apt-get install -y dirmngr gnupg
$sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv-keys 561F9B9CAC40B2F7
$sudo apt-get install -y apt-transport-https ca-certificates
$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
$sudo apt-get install -y nginx-extras passenger

安装完成以后,要进行配置

编辑 /etc/nginx/nginx.conf,uncomment这一行

include /etc/nginx/passenger.conf (就是把#取消掉)

然后重启Nginx

$sudo service nginx restart

然后再检查一下是否能安装正常

$sudo /usr/bin/passenger-config validate-install

然后检查一下Nginx是否已经启动了Passenger的进程

$sudo /usr/sbin/passenger-memory-stats

检查一下nginx的log信息:

$sudo tail /var/log/nginx/error.log

第六步, 安装mysql

$sudo apt-get install mysql-server mysql-client libmysqlclient-dev

最好是建立一个专门操作数据库的账户,比如treenewbee

CREATE USER ‘treenewbee‘@’localhost’ IDENTIFIED BY ‘GoBelieve‘;

然后再对这个应用创建自己的数据库

CREATE DATABASE lmzdx;
GRANT ALL PRIVILEGES ON  lmzdx.* TO ‘treenewbee’@’localhost’ IDENTIFIED BY "GoBelieve”;

要记住用户名和密码,等一会儿要用到。要在我们的Ruby on Rails的database.yml中设置。

最后,再刷新一下MySQL的系统权限(我当年就问,不刷新可以么?实际上,是可以的

flush privileges;

使用mysql建立一个项目

$rails new lmzdx -d mysql

然后加入git中

git init
git add -A
git commit -m "Initialize repository”

第七步 安装Capistrano

在Gemfile中加上:


group :development do
  gem 'capistrano', '~> 3.11'
  gem 'capistrano-passenger', '~> 0.2.0'
  gem 'capistrano-rbenv', '~> 2.1', '>= 2.1.3'
  gem 'capistrano-bundler', '~> 1.3'
end

然后再执行bundle命令安装。需要注意的是,只用在development这个group里就可以。

然后再执行bundle –binstubs

再执行cap install STAGES=production

再配置生成的Capfile文件


require "capistrano/rbenv"
set :rbenv_type, :user
set :rbenv_ruby, '2.5.1'

require "capistrano/bundler"
require "capistrano/rails"
require "capistrano/passenger" // 重启passenger

第八步 设置config/deploy.rb

修改这几个地方

set :application, "lmzdx"
set :repo_url, "git@github.com:liuyandong/lmzdx.git"
set :deploy_to, "/home/deploy/lmzdx"

有两个地方需要注意一下:

# Default value for :linked_files is []
append :linked_files, "config/database.yml"
# Default value for linked_dirs is []
append :linked_dirs, “public”, “log”, “tmp/pids”, “tmp/cache”, “tmp/sockets”, “public/system”

好吧,这时候可以把配置的Capfile提交一次了
git commit -m “configure capistrano”

第十步 修改config/production.rb

在这个文件里添加
server '172.16.18.164', user: 'deploy', roles: %w{app db web}

第十一步 把config/database.yml修改一下

这时候,还因为少secret_key_base会报错

ArgumentError: Missing `secret_key_base` for ‘production’ environment, set this string with `rails credentials:edit`

这时候,可以使用scp

$scp config/master.key deploy@47.98.114.169:/home/deploy/lmzdx/shared/config

第十二步,配置nginx

server {
listen 80;
listen [::]:80;

server_name lmzdx.com;
passenger_enabled on;
rails_env production;
root /home/deploy/lmzdx/current/public;

# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

在远程机器上执行

《第四期 布署Rails到Ubuntu服务器上》有21个想法

  1. rails new lmzdx520 -d mysql 这里的lmzdx520 必须跟 github 创建的项目lmzdx520名字要一样吗?还有这里 deploy.rb的set :application, “lmzdx520″必须三者合一吗?

  2. 我的理解对不对啊东哥,能不能 不用cap github直接把rails new lmzdx _d mysql 命令以后的东西用ftp传上去日本云呢,就配以下数据库用户名文件。这样行的话,怎么打命令呢?bundle这个有啥作用的东西。

          1. bundle install –deployment –without development test 什么意思?passenger网站这么命令,好像就卡在这里了,

  3. 每次修改万 rails代码 都要执行 依次 : bundle,bundle –binstubs,再执行cap install STAGES=production,git commit “123” ,git push , cap production deploy吗?本地 的lmzdx/app/controllers/welcome_controller.rb这文件不再服务器那里哦呵?讲一讲门道

发表评论

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