阿里云发布Ruby on Rails(上)

      写给刚刚开始学习Ruby on Rails的朋友们,希望能对第一次在云服务器上发布自己项目的朋友有一点点帮助,节约一些时间。

      对于只是纯粹学习Ruby on Rails的朋友,还是挺推荐Heroku,发布非常简单,可以很容易的来验证学习、练手成果。但是,毕竟国外的网站,访问速度比较受限。

      如果想把自己的Rails项目发布、分享给自己的朋友们或种子用户。租用国内的云服务器还是比较方便。本文就以阿里云服务器为例,走一遍Rails发布的过程。

      需要用到的应用:

      - Ruby on Rails

      - Nginx

      - Unicorn

      - Postgresql

      - Capistrano

      本文共分两篇来完成,这是第一篇,重点在前期准备和服务器端的环境配置,共两个部分9个步骤。

      注:文中用#开头的斜体文字都是说明性文字,不需要作为命令输入;

            代码中"yourapp"只是一个示例,您可以替换成您网站应用的名字(非中文);

明确目标:


1、有一台阿里云服务器;

2、用Ruby on Rails做了一个网站,要发布出去;

3、后续版本更新发布用一行简单的代码搞定,比如:

cap production deploy


操作系统环境:


云服务器操作系统:Ubuntu 14.04 64位

本地系统:Mac OS 10.11.6

Part 1 : 服务器准备


这一部分涉及3个方面内容:

- 下载一个好用的终端工具:iTerm

- 连接云服务器;

- 服务器打补丁,创建新用户;


Step 1  终端工具:iTerm

iTerm2是一个替代OS X系统自带终端的一个软件,受很多Mac系统的开发者喜爱,本文利用iTerm2完成命令操作,重点不在介绍iTerm,如果有兴趣可以看一下这篇博文:《你应该知道的 iTerm2 使用方法--MAC终端工具》。

Step 2  连接云服务器

打开iTerm2,输入命令:

ssh root@[ip address]

然后输入服务器的root密码,连接到云服务器。

Step 3  服务器基本配置

    关于服务器安全相关的一些配置,例如使用公钥登陆、防火墙设置等,本文不做深入的探究。网上相关资源挺多,有兴趣的朋友可以自己多了解一下。

    给服务器打补丁,并创建新用户(不能总用root来做操作)。

1) 输入下面的命令,安装服务器补丁

aptitude update

aptitude safe-upgrade

2)创建一个新的用户,起一个你喜欢的名字,这里用chris做示例

adduser chris

把新创建的用户加入到sudo组,就可以使用sudo命令了

usermod-a-G sudo chris

重启一下服务器,让安装的补丁生效

sudo reboot

Part 2 : 服务器配置


这一部分涉及6个方面的内容:

- 安装必要的软件包(如postgres,nginx等);

- 创建一个用来发布应用的用户;

- 安装Ruby;

- 安装和配置Postgresql(数据库服务);

- 安装和配置Nginx(Web服务);

- 安装和配置Unicorn (Ruby应用服务);


Step 1 在服务器上安装必要的软件包

1)安装必要的软件包

aptitude与 apt-get 一样,是功能极其强大的包管理工具。我们利用aptitude来安装必要的软件包:

- git-core  curl  build-essential  python-software-properties

- nodejs

- postgresql  postgresql-server-dev-9.3

- Other Libraries:zlib1g-dev  libssl-dev  libreadline-dev  libxml2-dev  libxslt1-dev  libcurl4-openssl-dev

- Nginx using a ppa

软件包很多,下面贴出命令代码,请在iTerm中输入:

# 安装必要的软件包(在Part1 step3中新创建的用户下执行下面的命令)

sudo aptitude -y install git-core curl build-essential zlib1g-dev libssl-dev libreadline-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev nodejs postgresql postgresql-server-dev-9.3 python-software-properties

2)安装 Nginx

# 安装 nginx ppa

sudo add-apt-repository ppa:nginx/stable

#更新

sudo aptitude update

#安装Nginx

sudo aptitude-y install nginx

Step 2 创建一个用来发布应用的用户

#创建专门的发布用户,对于在一个服务器环境下,部署配置和发布多个不用的应用比较方便。

1 ) 创建用户

sudo adduser deploy

2)更改用户组,给予发布用户sudo的命令权限

usermod-a-G sudo deploy

3 )创建用来发布应用的目录,更改对应的权限

sudo mkdir-p/opt/www/yourapp

sudo chown-R deploy/opt/www/yourapp

sudo chgrp-R deploy/opt/www/yourapp

sudo chmod-R775/opt/www/yourapp

Step 3 在服务器上安装Ruby

1)首先,切换到刚创建的deploy用户(在对应的发布用户下来配置对应的部署环境

sudo su-deploy

2)rbenv是一个非常方便的Ruby版本管理工具,用来管理多个版本的 ruby 在用户目录的安装和使用。首先我们来安装rbenv:

git clone https://github.com/sstephenson/rbenv.git~/.rbenv

3)配置一下bashrc文件:

#利用nano来打开bashrc,当然也可以使用vim等其它编辑工具

nano~/.bashrc

在bashrc文件中加入如下两行:

export PATH="$HOME/.rbenv/bin:$PATH"

eval"$(rbenv init -)"

阿里云发布Ruby on Rails(上)_第1张图片
bashrc文件编辑参考,前两行为添加的配置

让配置文件生效

exec $SHELL

4)安装Ruby

#install ruby-build

git clone git://github.com/sstephenson/ruby-build.git~/.rbenv/plugins/ruby-build

#列出可以安装的Ruby 版本

rbenv install-l

#这里选择2.3.1版本作为示例,当然您可以选择自己需要的版本来安装,利用rbenv来管理不同版本

rbenv install2.3.1

#设置全局版本

rbenv global2.3.1

#生效

rbenv rehash

#查看Ruby版本来验证一下

ruby -v

#安装 bundler gem

gem install bundler--no-ri--no-rdoc

#rehash

rbenv rehash

至此,我们在服务器上完成了Ruby的安装。

Step 4 在服务器上配置postgres

#切换postgres用户

sudo su - postgres

#连接postgres

psql

#为应用创建一个数据库,owner设定为应用的发布账户

create database yourapp_production owner deploy

#退出psql和postgres用户

\q

exit

#切换到deploy用户

sudo su-deploy

# 测试数据库连接

psql -d yourapp_production

#测试成功,退出

\q

exit

至此,我们完成了postgres数据库服务器的基本配置。

Step 5 在服务器上配置Nginx

1 ) 删除Nginx默认页面,并创建一个新的

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

sudo nano/etc/nginx/sites-available/yourapp

2)下面是Nginx 配置文件的一个基本设置

upstream unicorn_yourapp {

    server unix:/tmp/unicorn.yourapp.sock fail_timeout=0;

}

server {

    listen 80 default deferred;

    server_name  [your domain or ip address];

    root/opt/www/yourapp/current/public;

    location~^/assets/{gzip_static on;

    expires max;

    add_header Cache-Control public;

}

try_files $uri/index.html $uri @unicorn;

location @unicorn {

    proxy_set_header Host $http_host;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_redirect off;

    proxy_pass http://unicorn_yourapp;

}

error_page 500 502 503 504 /500.html;

client_max_body_size 4G;

keepalive_timeout10;

}

注:yourapp替换成您的网站项目名字(非中文);

      [your domain or ip address] 替换成您的域名或者服务器外网IP.

3 )让您的新网站生效

sudo ln-s/etc/nginx/sites-available/yourapp/etc/nginx/sites-enabled/yourapp

#启动Nginx

sudo service nginx start

至此,我们完成了服务器端Nginx的配置工作;

Step 6 在服务器上配置Unicorn

1) 创建Unicorn配置文件

sudo nano/etc/init.d/unicorn_yourapp

2) 配置文件设置参考

#!/bin/sh

set-e

TIMEOUT=${TIMEOUT-60}

APP_ROOT=/opt/www/yourapp/current

PID=$APP_ROOT/tmp/pids/unicorn.pid

CMD="cd$APP_ROOT; bundle exec unicorn -D -c$APP_ROOT/config/unicorn.rb -E production"

AS_USER=deploy

set-u

OLD_PIN="$PID.oldbin"

sig () {

test-s "$PID" && kill -$1 `cat $PID`

}

oldsig () {

test-s$OLD_PIN&&kill-$1`cat$OLD_PIN`

}

run () {

if ["$(id -un)"="$AS_USER"]; then

   eval $1

else

  su-c"$1"-$AS_USER

  fi

}

  case "$1" in

start)

    sig 0 && echo >&2 "Already running" && exit 0

    run"$CMD"

    ;;

stop)

    sig QUIT && exit 0

    echo >&2 "Not running"

    ;;

force-stop)

  sig TERM && exit 0

  echo >&2 "Not running"

  ;;

restart|reload)

  sig HUP && echo reloaded OK && exit 0

  echo >&2 "Couldn't reload, starting '$CMD' instead"

  run"$CMD"

  ;;

upgrade)

if sig USR2 && sleep2 && sig 0 && oldsig QUIT

then

  n=$TIMEOUT

  while test-s $OLD_PIN && test $n -ge 0

  do

 printf '.' && sleep 1 && n=$(( $n-1 ))

done

echo

if test $n -lt 0 && test -s $ OLD_PIN

then

  echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds"

  exit 1

fi

exit 0

fi

echo >&2 "Couldn't upgrade, starting '$CMD' instead"

run "$CMD"

;;

reopen-logs)

  sig USR1

;;

*)

echo >&2 "Usage: $0 "

exit 1

;;

esac

看起来有点长。。复制粘贴到您的配置文件,把“yourapp”替换成您网站项目的名字(非中文)即可。

#设置权限

sudo chmod755/etc/init.d/unicorn_yourapp

#设置启动脚本

sudo update-rc.d unicorn_yourapp defaults

至此,我们就完成了服务器端Unicorn的配置。


以上,在我们的云服务器上安装了必要的软件包,完成了服务器的基本配置。这样我们就基本搭建出一个可以方便的部署Ruby on Rails应用的云服务器环境。

在下一篇中,我们将重点聊一下应用发布的步骤。

你可能感兴趣的:(阿里云发布Ruby on Rails(上))