您的位置:首页 > 运维架构 > Nginx

rails 生产环境部署练习(nginx + passenger + capistrano)

2017-04-14 10:23 423 查看
自己实践:两台 ubuntu 系统间的部署 ,从上到下,一步一步去实现

第一步: 安装网站服务器 ( ubuntu 16.04 )

第二步:安装 ruby、rails 环境

$ sudo apt update
$ sudo apt upgrade -y
$ sudo dpkg-reconfigure tzdata


进入选单选你的 Time zone=>Asia=>chongqing | shanghai

接着我们安装新的套件们,这些是 Ruby on Rails 所需要的东西。请输入以下一行指令:

$ sudo apt 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 慢放法:自行编译原始码

$ wget http://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.0.tar.gz $ tar xvfz ruby-2.4.0.tar.gz
$ cd ruby-2.4.0
$ ./configure
$ make
$ sudo make install


请把 2.4.0 换成你项目使用的 ruby 版本号

$ ruby -v
$ gem install bundler
$ bundler -v


安装 postgresql 数据库

$ sudo apt install postgresql libpq-dev postgresql-contrib


修改帐号 postgres 的密码

切换到 postgres 用户

$ sudo su - postgres


使用 psql 命令登录 postgresql 控制台

$ psql


使用 \password 命令,为 postgres 用户设置一个密码

> \password your_password


创建数据库

> CREATE DATABASE your_app_database_name OWNER postgrs;


退出

\q

第三步:安装 Nginx + Passenger 快方法:用套件安装

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

$ sudo apt 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 update

# Install Passenger + Nginx
$ sudo apt install -y nginx-extras passenger


打开你的浏览器,输入 服务器 IP 地址,应该就可以看到默认的 Nginx 网页了:Welcome to nginx on Ubuntu!

Nginx启动和重开用法:

$ sudo service nginx start
$ sudo service nginx stop
$ sudo service nginx restart


第四步:新增 deploy 用户

$ sudo adduser --disabled-password deploy
$ sudo su deploy
$ cd ~
$ ssh-keygen -t rsa


接着复制开发机器的 ~/.ssh/id_rsa.pub 到 服务器的 /home/deploy/.ssh/authorized_keys

在本机电脑 Terminal 输入 cat ~/.ssh/id_rsa.pub,会出现一串文字,复制下来

在 服务器 Terminal 上输入 vi /home/deploy/.ssh/authorized_keys,进入vi去编辑该档,把上一个步骤的视窗内的文字copy贴上到vi内,然后 :wq 离开

$ chmod 644 /home/deploy/.ssh/authorized_keys
$ chown deploy:deploy /home/deploy/.ssh/authorized_keys


这样开发机器就可以直接 ssh deploy@<服务器IP地址>,登入无须密码

备注:还需将服务器的 /home/deploy/.ssh/id_rsa.pub 复制到代码远程仓库 ssh_keys

第五步:设定 Nginx

输入 exit 回到 root 帐号

编辑 /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_app_name/public;
# 如果是自动化部署,位置在 root /home/deploy/apps/your_app_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。

第六步:使用 capistrano 设定自动化布署脚本

在Gemfile中添加Capistrano和其它用到的插件

group :development do
gem 'capistrano'
gem 'capistrano-rails'
gem 'capistrano-bundler'
gem 'capistrano-passenger'
end


在项目中初始化 Capistrano

$ cap install

会生成如下目录文件,Capfile 用来配置 Capistrano,deploy.rb 是一些共用 task 的定义,而 production.rb / staging.rb 用来定义具体的 stage 的 tasks。

├── Capfile

├── config

│ ├── deploy

│ │ ├── production.rb

│ │ └── staging.rb

│ └── deploy.rb

└── lib

└── capistrano

└── tasks

配置 Capistrano

在 Capfile 文件中开启要用到的一些插件

require 'capistrano/setup'
require 'capistrano/deploy'

require 'capistrano/rails'
require 'capistrano/passenger'

require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git

require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }


在 config/deploy.rb 文件中配置共用变量

lock "3.7.2"

set :application, 'your_app_name'
set :deploy_user, 'deploy'

set :repo_url, 'git@bitbucket.org:your_user_id/your_app_name.git' # 项目代码远程仓库地址 github,bitbucket 或者其它代码管理仓库

# how many old releases do we want to keep, not much
set :keep_releases, 5

# files we want symlinking to specific entries in shared
set :linked_files, %w{config/database.yml config/secrets.yml}

# dirs we want symlinking to shared
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}

namespace :deploy do
after :finishing, 'deploy:cleanup'
end

`ssh-add`  # 注意这是键盘左上角的「 `」不是单引号「 '」
set :passenger_restart_with_touch, true

在 config/deploy/production.rb 中配置具体的 stage 的 tasks

set :stage, :production # 部署的环境
set :branch, 'master' # 部署的代码分支
set :rails_env, :production

server 'xxx.xxx.xxx.xxx', user: "#{fetch(:deploy_user)}", roles: %w{app db web}  # server 填域名或者服务器的 IP 地址

set :deploy_to, "/home/#{fetch(:deploy_user)}/apps/#{fetch(:application)}" # 部署到服务器的位置

set :enable_ssl, false


开始部署

在开发机器终端运行

$ cap production deploy --dry-run 或者 $ cap production deploy:check


使用 ssh deploy@your_server_ip 登入服务器,在deploy/home/apps/your_app_name/shared/config目录下新建 database.yml 和 secrets.yml

在服务器终端运行

$ touch ~/apps/your_app_name/shared/config/database.yml
$ touch ~/apps/your_app_name/shared/config/secrets.yml


在开发机器项目目录下执行 rake secret 产生的 key 放到服务器的~/apps/your_app_name/shared/config/secrets.yml,范例如下:

production:
secret_key_base: xxxxxxx........


用 vim 编辑服务器文件 ~/apps/your_app_name/shared/config/database.yml,范例如下:

production:
adapter: postgresql
encoding: unicode
database: your_app_database_name
host: localhost
pool: 25
username: postgres
password: your_password


在开发机器终端执行部署命令

$ cap production deploy


在服务器重启 nginx

$ sudo service nginx restart


第七步:访问页面

在浏览器访问服务器的IP地址 或者 你的域名,没有意外的话就可以看到你项目的主页面了。

恭喜你!

参考网址:

https://ihower.tw/rails/deployment-cn.html

https://ruby-china.org/topics/18616

http://www.ruanyifeng.com/blog/2013/12/getting_started_with_postgresql.html

说明:本文仅用于学习,多处文本复制于参考文献,若涉及原作者版权,通知到本人将立即删除本文。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息