Rails项目部署

基本配置:
(1)服务器类型:阿里云服务器
(2)镜像系统:Ubuntu 16.04 64位
(3)web服务器: Nginx + Passenger
(4)数据库服务器:MySQl

基本知识:

  • 基本CLI指令。
    date 会显示系统时间
    uname -a 显示系统版本
    uptime 查电脑开机多久了
    which 查询执行档的确切位置
    history 查询刚刚执行过的指令

  • vi 、nano、vim是三种文档编辑器,nano与vim是操作系统内建的。

  • 传档案:SSH 通信协议除了可以让我们登入远端的服务器,也可以作为档案传输使用,又叫做 SFTP。例如:

    1
    scp test.txt root@106.14.190.181:~/

    这个命令的意思是将本机的test.txt文件传到服务器上root账号的 ~/ 文件夹下;

    1
    scp root@106.14.190.181:~/test.txt ./

    这个命令的意思是将服务器上的text.txt 文件传到本机

  • 压缩与打包:如果要向服务器传很多档案,那么使用压缩打包的方式会很快;压缩和打包是可以分开的:gzip 只能压缩一个档案、tar 可以打包整个目录顺便压缩。

    • gzip 压缩档案
    • gzip -d 解压缩档案
    • tar zcvf xxx.tar.gz xxx将 xxx目录打包并压缩成 xxx.tar.gz 档案
    • tar zxcf xxx.tar.gz 将 xxx.tar.gz 解压缩

一、更新并安装Linux套件

apt-get 是Ubuntu内建的套件管理工具。拿到一台服务器,首选应该做的是更新上面的套件。
1- 执行 pt-get update

2- 执行 apt-get upgrade -f

3- 设定时区:dpkg-reconfigure tzdata,进入菜单后选择Shanghai。

4- 安装Ruby on Rails所需 的东西:

1
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 libcurl4-nss-dev libxml2-dev libxslt-dev imagemagick nodejs libffi-dev

二、安装Ruby

使用Brighbox编译好的Ruby套件进行安装。
1- 执行 apt-get install software-properties-common

2- 执行 apt-add-repository ppa:brightbox/ruby-ng

3- 执行 apt-get update

4- 执行 apt-get install ruby2.4 ruby2.4-dev

执行完上面四个命令后,执行 ruby -v检查ruby是否成功安装
5- 安装Bundler,执行gem install bundler --no-ri --no-rdoc --source https://gems.ruby-china.org

三、安装MySQL

1- 执行 sudo apt-get install mysql-common mysql-client libmysqlclient-dev mysql-server,然后根据提示设置登录密码

2- 执行mysql -u root -p 登录数据库,输入CREATE DATABSE your-database-name CHARACTER SET utf8mb4

四、安装Nginx + Passenger

Nginx是目前很流行的一种网站服务器,我们用它来处理静态资源,例如CSS/JS;Passenger 是一个 app server,支持基于 Rack 框架的 Ruby app(包括 Rails)。Passenger 的特点是需要作为模块编译到 Nginx 中,优点是配置简单,不需要自己写启动脚本。以下是安装步骤:

1- 通过apt安装Passenger,这里需要导入Passenger密钥

1
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7

2- 安装apt插件以支持http传输

1
apt-get install -y apt-transport-https ca-certificates

3- 添加apt的源

1
sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list

之后执行 apt-get update

4- 安装Passenger的包

1
apt-get install -y nginx-extras passenger

修改Nginx配置,编辑/etc/nginx/nginx.conf
改为下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  # 让 Nginx 可以读到环境变量 PATH,Rails 需要这一行才能调用到 nodejs 来编译静态档案。
+ env PATH;

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
worker_connections 768;
# multi_accept on;
}

http {

# 关闭 Passenger 和 Nginx 在 HTTP Response Header 的版本资讯,减少资讯洩漏
+ passenger_show_version_in_header off;
+ server_tokens off;

# 设定档案上传可以到100mb,默认只有1Mb超小气的,上传一张图片就爆了
+ client_max_body_size 100m;

gzip on;
gzip_disable "msie6";

# 最佳化 gzip 压缩
+ gzip_comp_level 5;
+ gzip_min_length 256;
+ gzip_proxied any;
+ gzip_vary on;
+ gzip_types application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/xml text/plain text/javascript text/x-component;

# 打开 passenger 模组
- # include /etc/nginx/passenger.conf;
+ include /etc/nginx/passenger.conf;

# 下略

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name 47.92.82.116; # 你的服务器 IP 位置

root /home/deploy/example/current/public; # example改为你自己的项目名称

passenger_enabled on;

passenger_min_instances 1;

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

完成Nginx的设定之后,执行 service nginx restart。 此时使用你的Ip地址打开网页如下图:

五、 安装Capistrano自动化部署

1- 本机安装gem 'capistrano-rails'gem 'capistrano-passenger '

2- capistrano 文件设定

执行 cap install ,新增capistrano 的配置档案,编辑以下文件:
(1)Capfile

1
2
3
4
require "capistrano/scm/git”
install_plugin Capistrano::SCM::Git
+ require 'capistrano/rails’
+ require 'capistrano/passenger’

(2)config/deploy.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
+  sh "ssh-add"

# config valid only for current version of Capistrano
lock "3.8.1"

- set :application, "my_app_name"
+ set :application, "rails_recipes" # 请用你自己的项目名称

- set :repo_url, "git@example.com:me/my_repo.git"
+ set :repo_url, "git@github.com:growthschool/rails-recipes.git" # 请用你自己项目的git位置

# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# Default deploy_to directory is /var/www/my_app_name
# set :deploy_to, "/var/www/my_app_name"
+ set :deploy_to, "/home/deploy/rails-recipes" # 这样服务器上代码的目录位置,放在 deploy 帐号下。请用你自己的项目名称。

# Default value for :format is :airbrussh.
# set :format, :airbrussh

# You can configure the Airbrussh format using :format_options.
# These are the defaults.
# set :format_options, command_output: true, log_file: "log/capistrano.log", color: :auto, truncate: :auto

# Default value for :pty is false
# set :pty, true

# Default value for :linked_files is []
- # append :linked_files, "config/database.yml", "config/secrets.yml"
+ append :linked_files, "config/database.yml", "config/secrets.yml"

# Default value for linked_dirs is []
- # append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"
+ append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"

+ set :passenger_restart_with_touch, true

# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }

# Default value for keep_releases is 5
- # set :keep_releases, 5
+ set :keep_releases, 5

(3) config/deploy/production.rb

1
2
3
+   set :branch, "master"
- # server "example.com", user: "deploy", roles: %w{app db web}, my_property: :my_value
+ server "47.92.82.116", user: "deploy", roles: %w{app db web}, my_property: :my_value, 其中user为你自己设定的用户名称

之后的步骤是根据cap production deploy:check检查缺少哪些文件,按照提示新增缺少的文件即可,一般需新增database.yml与secrets.yml这两个个文件。

最后在本机执行 cap production deploy ,完成部署。