阿里云、腾讯云Ubuntu 16.04 上使用 Nginx Passenger 部署 Ruby on Rails

本教程将会涉及以下工具:

  • Ubuntu 16.04 LTS
  • RVM
  • Ruby
  • Rails
  • Passenger
  • Nginx(由 Passenger 编译)

创建帐号

假设你已经用 root 帐号通过 SSH 登陆服务器。

ssh root@[ip address]  #腾讯云用户名使用ubuntu

出于安全考虑,不要使用 root 帐号运行 web 应用。这里新建一个专门用于部署的用户,例如 deploy 或者其它你喜欢的名字。运行以下命令创建用户:

  # useradd -m -s /bin/bash deploy  #腾讯云需要添加sudo

将用户加入 sudo 群组,以便使用 sudo 命令:

# adduser deploy sudo  #腾讯云需要添加sudo

为 deploy 用户设置密码:

# passwd deploy  #腾讯云需要添加sudo

退出当前 SSH 链接,用 deploy 帐号重新登陆。

ssh deploy@[ip address]

安装 RVM 和 Ruby

更新 apt,并安装 curl:

$ sudo apt-get update
$ sudo apt-get install curl

然后安装 RVM:

$ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

$ \curl -sSL https://get.rvm.io | bash

RVM 安装完毕后,重新登陆 SSH,让 RVM 配置生效。

修改 RVM 的 Ruby 安装源到 Ruby China 的 Ruby 镜像服务器,这样能提高安装速度

$ echo "ruby_url=https://cache.ruby-china.com/pub/ruby" > ~/.rvm/user/db

为了能正常工作,RMV必须安装一些依赖。你可以让RVM自动安装它们:

$ rvm requirements

Ruby-China的指导里有关于Readline和OpenSSL的rvm的安装,虽然感觉可以不装,但是装一下也无妨。

$ rvm pkg install readline
$ rvm pkg install openssl

然后安装 Ruby 2.5.1:

$ rvm install 2.5.1
$ rvm use 2.5.1 --default

Ruby 安装过程会请求 apt-get update 的权限,并自动安装系统依赖。安装完毕后,确认目前的 Ruby 版本:

$ ruby -v

应该看到 ruby 2.5.1 字样。

安装Rails:

$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.com
# 确保只有 gems.ruby-china.com
$ gem install rails
$ rails -v
Rails 4.0.3

安装数据库

添加阿里云镜像

编辑/etc/apt/sources.list文件,腾讯云不需要修改,已默认添加腾讯云镜像

#sudo vim /etc/apt/sources.list

在文件最前面添加以下条目,操作前请做好相应备份。

deb http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse

安装MySQL:

$ sudo apt-get install mysql-server

或者PostgreSQL:

$ sudo apt-get install postgresql postgresql-client libpq-dev

安装 Passenger

如果安装失败,提示缺少依赖,则把对应的依赖单独安装即可。

# Install our PGP key and add HTTPS support for APT
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
$ sudo apt-get 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-get update
 
# Install Passenger + Nginx
$ sudo apt-get install -y nginx-extras passenger

使用which ruby命令,找到ruby所在路径

# which ruby
/home/deploy/.rvm/rubies/ruby-2.5.1/bin/ruby

根据此路径修改 nginx 配置,编辑 /etc/nginx/nginx.conf

#sudo vim /etc/nginx/nginx.conf

添加以下两行至http块

    ...    
    http {
        passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
        passenger_ruby /home/deploy/.rvm/rubies/ruby-2.5.1/bin/ruby;
    ...

这会打开 Passenger 支持,并且指定使用之前用 rvm 安装的 ruby 版本。

Git Server

RoR比较流行的是使用git,我们来配置一下Git Server,首先我们需要新建一个名为git的用户并且为它添加公钥。

$ sudo adduser git

配置ssh-keygen,并生成公钥

输入以下命令:

$ cd ~/.ssh
$ ssh-keygen -t rsa -C "[[email protected]]"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/deploy/.ssh/id_rsa): [Press enter]
$ ssh-add id_rsa
Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type passphrase again]
Your identification has been saved in /Users/you/.ssh/id_rsa.
Your public key has been saved in /Users/you/.ssh/id_rsa.pub.
The key fingerprint is:
01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db [email protected]
$ pbcopy < ~/.ssh/id_rsa.pub

如果遇到-bash: cd: ~/.ssh: No such file or directory的错误,新建一个.ssh的文件夹即可。

# mkdir ~/.ssh

这时候我们切换到ssh的Profile,输入以下的命令:

# vi ~/.ssh/authorized_keys

通过vi把刚刚复制到剪贴板的内容粘贴到authorized_keys里,然后保存退出。

我这里假设你的项目名称是project和准备把git仓库的目录设定为/opt/git,如果你没有一个/opt/git目录,需要切换到root新建并且把这个目录的所有者改为git:

$ su - root  #ubuntu需要初始root密码
# cd /opt
# mkdir git
# chown git git

切换到git用户操作:

$ cd /opt/git
$ mkdir project.git
$ cd project.git
$ git --bare init

如果你之前已经有一个Rails项目,那么可以跳过以下步骤。

本地计算机上,新建一个Rails项目,并且把它纳入git版本管理中:

$ rails new project --skip-bundle
$ cd project
$ git init
$ git add .
$ git commit -m 'initial commit'

我们需要添加git remote连接服务器,并且把这个项目push到服务器上去。

$ git remote add origin git@[ipaddress]:/opt/git/project.git
$ git push origin master
Counting objects: 59, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (48/48), done.
Writing objects: 100% (59/59), 13.41 KiB | 0 bytes/s, done.
Total 59 (delta 2), reused 0 (delta 0)
To git@[ipaddress]:/opt/git/project.git
 * [new branch]      master -> master

如果你的系统没有报错的话,这个时候我们已经完成了Git Server的部署。

部署站点

检查一下swap的大小:

$ free -m
      total       used       free     shared    buffers     cached
Mem:           490        405         84          0         12        311
-/+ buffers/cache:         80        409
Swap:            0          0          0

如果没有swap,手动创建swap文件:

$ sudo mkdir /swap
$ cd /swap
$ sudo dd if=/dev/zero of=swapfile bs=1024 count=500000
$ sudo mkswap -f swapfile
$ sudo swapon swapfile

设置开机自动挂载, 编辑 /etc/fstab

#sudo vim /etc/fstab 

在最后追加一行

/swap/swapfile swap swap defaults 0 0

切换到deploy用户,创建站点文件夹:

$ sudo mkdir -p /var/www/example
$ sudo chown deploy:deploy /var/www/example

clone 项目文件:

$ cd /var/www/example
/var/www/example $ git clone /opt/git/project.git

取决于你的应用,这里需要安装数据库等其他系统组件,例如 PostgreSQL:

$ sudo apt-get install postgresql libpq-dev

执行 bundle 和 migrate:

/var/www/example $ cd current
/var/www/example/current $ bundle install
/var/www/example/current $ RAILS_ENV=production rake db:create db:migrate

执行 assets precompile:

/var/www/example/current $ rake assets:precompile

修改 Nginx 配置

删除原有的默认网站配置:

$ sudo rm /etc/nginx/sites-enabled/default

新建网站配置:

$ touch /etc/nginx/sites-enabled/example.conf

编辑 sudo vim /etc/nginx/sites-enabled/example.conf,写入以下内容:

server {
    listen 80 default;
    server_name example.com; # 这里填写你真实域名
    root /var/www/example/project/public;
    passenger_enabled on;
}

重启 nginx:

$ sudo service nginx restart

完成

在浏览器打开服务器的 IP 地址或域名,应该看到你的网站在运行。

优化

  1. 编辑 sudo vim /etc/nginx/sites-enabled/example.conf,写入以下内容:
server {
  ...
  passenger_min_instances 6;
  ...
}

2.编辑 #sudo vim /etc/nginx/nginx.conf
添加以下至http块

    ...    
    http {
      ...
      passenger_max_pool_size 30;
      passenger_pool_idle_time 90;
      passenger_max_requests 500;
      ...
    }

问题

解决git Unable to create temporary file ...

搞计算机的总会莫名奇妙的遇到一些问题,之前做了那么多的项目,突然就出现了,在push 时候抛出这样的错误

fatal: Unable to create temporary file: Permission denied  
error: pack-objects died of signal 13  

搜索后,发现也挺频繁的。大致就是这样:

// 登录git服务器,进入你的项目
cd your_rep.git  
chmod -R g+ws *  
chgrp -R git *  
git config core.sharedRepository true  

然后再回到你本地目录,输入 git repack master

你可能感兴趣的:(阿里云、腾讯云Ubuntu 16.04 上使用 Nginx Passenger 部署 Ruby on Rails)