? ? ? 寫給剛剛開始學(xué)習(xí)Ruby on Rails的朋友們,希望能對(duì)第一次在云服務(wù)器上發(fā)布自己項(xiàng)目的朋友有一點(diǎn)點(diǎn)幫助,節(jié)約一些時(shí)間。
? ? ? 對(duì)于只是純粹學(xué)習(xí)Ruby on Rails的朋友,還是挺推薦Heroku,發(fā)布非常簡(jiǎn)單,可以很容易的來驗(yàn)證學(xué)習(xí)、練手成果。但是,畢竟國(guó)外的網(wǎng)站,訪問速度比較受限。
? ? ? 如果想把自己的Rails項(xiàng)目發(fā)布、分享給自己的朋友們或種子用戶。租用國(guó)內(nèi)的云服務(wù)器還是比較方便。本文就以阿里云服務(wù)器為例,走一遍Rails發(fā)布的過程。
? ? ??需要用到的應(yīng)用:
? ? ? - Ruby on Rails
? ? ? - Nginx
? ? ? - Unicorn
? ? ? - Postgresql
? ? ? - Capistrano
? ? ? 本文共分兩篇來完成,這是第一篇,重點(diǎn)在前期準(zhǔn)備和服務(wù)器端的環(huán)境配置,共兩個(gè)部分,9個(gè)步驟。
? ? ? 注:文中用#開頭的斜體文字都是說明性文字,不需要作為命令輸入;
? ? ? ? ? ? 代碼中"yourapp"只是一個(gè)示例,您可以替換成您網(wǎng)站應(yīng)用的名字(非中文);
明確目標(biāo):
1、有一臺(tái)阿里云服務(wù)器;
2、用Ruby on Rails做了一個(gè)網(wǎng)站,要發(fā)布出去;
3、后續(xù)版本更新發(fā)布用一行簡(jiǎn)單的代碼搞定,比如:
cap production deploy
操作系統(tǒng)環(huán)境:
云服務(wù)器操作系統(tǒng):Ubuntu 14.04 64位
本地系統(tǒng):Mac OS 10.11.6
Part 1 : 服務(wù)器準(zhǔn)備
這一部分涉及3個(gè)方面內(nèi)容:
- 下載一個(gè)好用的終端工具:iTerm
- 連接云服務(wù)器;
- 服務(wù)器打補(bǔ)丁,創(chuàng)建新用戶;
Step 1 ?終端工具:iTerm
iTerm2是一個(gè)替代OS X系統(tǒng)自帶終端的一個(gè)軟件,受很多Mac系統(tǒng)的開發(fā)者喜愛,本文利用iTerm2完成命令操作,重點(diǎn)不在介紹iTerm,如果有興趣可以看一下這篇博文:《你應(yīng)該知道的 iTerm2 使用方法--MAC終端工具》。
Step 2 ?連接云服務(wù)器
打開iTerm2,輸入命令:
ssh root@[ip address]
然后輸入服務(wù)器的root密碼,連接到云服務(wù)器。
Step 3 ?服務(wù)器基本配置
? ? 關(guān)于服務(wù)器安全相關(guān)的一些配置,例如使用公鑰登陸、防火墻設(shè)置等,本文不做深入的探究。網(wǎng)上相關(guān)資源挺多,有興趣的朋友可以自己多了解一下。
? ? 給服務(wù)器打補(bǔ)丁,并創(chuàng)建新用戶(不能總用root來做操作)。
1) 輸入下面的命令,安裝服務(wù)器補(bǔ)丁
aptitude update
aptitude safe-upgrade
2)創(chuàng)建一個(gè)新的用戶,起一個(gè)你喜歡的名字,這里用chris做示例
adduser chris
把新創(chuàng)建的用戶加入到sudo組,就可以使用sudo命令了
usermod-a-G sudo chris
重啟一下服務(wù)器,讓安裝的補(bǔ)丁生效
sudo reboot
Part 2 : 服務(wù)器配置
這一部分涉及6個(gè)方面的內(nèi)容:
- 安裝必要的軟件包(如postgres,nginx等);
- 創(chuàng)建一個(gè)用來發(fā)布應(yīng)用的用戶;
- 安裝Ruby;
- 安裝和配置Postgresql(數(shù)據(jù)庫(kù)服務(wù));
- 安裝和配置Nginx(Web服務(wù));
- 安裝和配置Unicorn (Ruby應(yīng)用服務(wù));
Step 1 在服務(wù)器上安裝必要的軟件包
1)安裝必要的軟件包
aptitude與 apt-get 一樣,是功能極其強(qiáng)大的包管理工具。我們利用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
軟件包很多,下面貼出命令代碼,請(qǐng)?jiān)趇Term中輸入:
# 安裝必要的軟件包(在Part1 step3中新創(chuàng)建的用戶下執(zhí)行下面的命令)
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 創(chuàng)建一個(gè)用來發(fā)布應(yīng)用的用戶
#創(chuàng)建專門的發(fā)布用戶,對(duì)于在一個(gè)服務(wù)器環(huán)境下,部署配置和發(fā)布多個(gè)不用的應(yīng)用比較方便。
1 ) 創(chuàng)建用戶
sudo adduser deploy
2)更改用戶組,給予發(fā)布用戶sudo的命令權(quán)限
usermod-a-G sudo deploy
3 )創(chuàng)建用來發(fā)布應(yīng)用的目錄,更改對(duì)應(yīng)的權(quán)限
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 在服務(wù)器上安裝Ruby
1)首先,切換到剛創(chuàng)建的deploy用戶(在對(duì)應(yīng)的發(fā)布用戶下來配置對(duì)應(yīng)的部署環(huán)境)
sudo su-deploy
2)rbenv是一個(gè)非常方便的Ruby版本管理工具,用來管理多個(gè)版本的 ruby 在用戶目錄的安裝和使用。首先我們來安裝rbenv:
git clone https://github.com/sstephenson/rbenv.git~/.rbenv
3)配置一下bashrc文件:
#利用nano來打開bashrc,當(dāng)然也可以使用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版本作為示例,當(dāng)然您可以選擇自己需要的版本來安裝,利用rbenv來管理不同版本
rbenv install2.3.1
#設(shè)置全局版本
rbenv global2.3.1
#生效
rbenv rehash
#查看Ruby版本來驗(yàn)證一下
ruby -v
#安裝 bundler gem
gem install bundler--no-ri--no-rdoc
#rehash
rbenv rehash
至此,我們?cè)诜?wù)器上完成了Ruby的安裝。
Step 4 在服務(wù)器上配置postgres
#切換postgres用戶
sudo su - postgres
#連接postgres
psql
#為應(yīng)用創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),owner設(shè)定為應(yīng)用的發(fā)布賬戶
create database yourapp_production owner deploy
#退出psql和postgres用戶
\q
exit
#切換到deploy用戶
sudo su-deploy
# 測(cè)試數(shù)據(jù)庫(kù)連接
psql -d yourapp_production
#測(cè)試成功,退出
\q
exit
至此,我們完成了postgres數(shù)據(jù)庫(kù)服務(wù)器的基本配置。
Step 5 在服務(wù)器上配置Nginx
1 ) 刪除Nginx默認(rèn)頁面,并創(chuàng)建一個(gè)新的
sudo rm/etc/nginx/sites-enabled/default
sudo nano/etc/nginx/sites-available/yourapp
2)下面是Nginx 配置文件的一個(gè)基本設(shè)置
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替換成您的網(wǎng)站項(xiàng)目名字(非中文);
? ? ? [your domain or ip address] 替換成您的域名或者服務(wù)器外網(wǎng)IP.
3 )讓您的新網(wǎng)站生效
sudo ln-s/etc/nginx/sites-available/yourapp/etc/nginx/sites-enabled/yourapp
#啟動(dòng)Nginx
sudo service nginx start
至此,我們完成了服務(wù)器端Nginx的配置工作;
Step 6 在服務(wù)器上配置Unicorn
1) 創(chuàng)建Unicorn配置文件
sudo nano/etc/init.d/unicorn_yourapp
2) 配置文件設(shè)置參考
#!/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
看起來有點(diǎn)長(zhǎng)。。復(fù)制粘貼到您的配置文件,把“yourapp”替換成您網(wǎng)站項(xiàng)目的名字(非中文)即可。
#設(shè)置權(quán)限
sudo chmod755/etc/init.d/unicorn_yourapp
#設(shè)置啟動(dòng)腳本
sudo update-rc.d unicorn_yourapp defaults
至此,我們就完成了服務(wù)器端Unicorn的配置。
以上,在我們的云服務(wù)器上安裝了必要的軟件包,完成了服務(wù)器的基本配置。這樣我們就基本搭建出一個(gè)可以方便的部署Ruby on Rails應(yīng)用的云服務(wù)器環(huán)境。
在下一篇中,我們將重點(diǎn)聊一下應(yīng)用發(fā)布的步驟。