写给刚刚开始学习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 -)"
让配置文件生效
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应用的云服务器环境。
在下一篇中,我们将重点聊一下应用发布的步骤。