阿里云發(fā)布Ruby on Rails(上)

? ? ? 寫給剛剛開始學(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 -)"

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版本作為示例,當(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ā)布的步驟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,055評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,346評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,889評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,118評(píng)論 0 286
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,637評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,558評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,739評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,980評(píng)論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評(píng)論 1 280
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,347評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,702評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容

  • 下載ubuntu 14.4server版安裝, 裝完干凈的系統(tǒng)后,我們首先需要更新 $ sudo apt-get ...
    星野君閱讀 2,318評(píng)論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,776評(píng)論 18 139
  • Git安裝 a)git –-version如果沒有安裝的話,提示安裝,不要選擇xcode b)驗(yàn)證安裝是否成功 查...
    IT達(dá)摩閱讀 1,544評(píng)論 1 3
  • 最近看了一本日本的小說《影繪》。我從字面上來理解的時(shí)候覺得肯定和攝影或者繪畫有關(guān)的一本書,然后翻來看以后是...
    遇見軍艷閱讀 570評(píng)論 0 0
  • 我身在 當(dāng)時(shí)你 幻想的 未來里 這個(gè)狂熱和沖動(dòng) 早已冷卻的如今 你頑固 的神情 消失在 鏡子里 只留下 時(shí)光消逝的...
    黎落清音閱讀 166評(píng)論 4 0