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
说明:本文仅用于学习,多处文本复制于参考文献,若涉及原作者版权,通知到本人将立即删除本文。
- rails 生产环境部署练习(nginx + passenger + capistrano)
- Rails环境搭建与部署(Nginx+Passenger)
- Passenger + Nginx 部署Rails
- Passenger + Nginx 部署Rails
- rails + capistrano + nginx + puma部署
- 部署/配置 Rails+Nginx+Passenger
- 部署/配置 Rails+Nginx+Passenger
- rails + nginx + passenger环境搭建
- 在 rails 3 环境中是用 生产环境 nginx + passenger 出现 css 文件无法编译的错误
- ruby on rails 项目部署(Nginx + Passenger)
- ruby on rails 项目部署(Nginx + Passenger)
- Passenger/Nginx/Ubuntu快速部署Rails
- Passenger/Nginx/Debian快速部署Rails
- ruby on rails 项目部署(Nginx + Passenger)
- Nginx+passenger部署ruby on rails应用
- rails passenger nginx部署ubantu虚拟机
- Rails部署云环境配置(Passenger+Apache)
- 在linux平台,使用capistrano, rvm, passenger来部署 rails 项目
- 培训机构都是骗人的?这样选择就对了!
- day44_jquery
- VS2010+Opencv-2.4.0的配置
- HTML 在画布中对图片,图片上另一个图层上的点,根据点绘制的路线进行缩放1
- 小白入坑
- rails 生产环境部署练习(nginx + passenger + capistrano)
- 同余与模运算
- WebSocket的事件触发机制
- mysql concat的用法
- java发送简单邮件
- Android动画-View动画,插值器
- Intent传递List<Object>
- 浏览器缓存机制剖析
- ReactNative textinput 常用方法