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

来源:互联网 发布:mysql精确两位小数 编辑:程序博客网 时间:2024/05/16 16:19

自己实践:两台 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::Gitrequire '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 muchset :keep_releases, 5# files we want symlinking to specific entries in sharedset :linked_files, %w{config/database.yml config/secrets.yml}# dirs we want symlinking to sharedset :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 的 tasksset :stage, :production # 部署的环境set :branch, 'master' # 部署的代码分支set :rails_env, :productionserver '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

说明:本文仅用于学习,多处文本复制于参考文献,若涉及原作者版权,通知到本人将立即删除本文。

0 0
原创粉丝点击