2016年6月17日 星期五

Ruby on Rails 筆記 — 部署(Deploy)網站於Amazon EC2 # Part2:使用Nginx+Passenger部署




 I. 寫在開始之前
在看Part2的同時,相信大家都已經根據Part1完成AWS帳號註冊以及伺服器的建立了!接著我們就要在伺服器上嘗試手動部署,也就是在Amazon EC2上使用Nginx+Passenger建立一個部署的環境,並將Rails網站部署在該伺服器上。

Nginx是目前最流行的網站伺服器之一,其運作效率高;而Passenger是一套Apache和Nginx的擴充模組,在部署Ruby on Rails上設定較為簡單,因此選擇兩者進行網站的部署。


II. 提醒事項
§ 確認伺服器已經建立完成,且可以SSH連線
§ 伺服器採用的是Ubuntu 14.04 LTS
§ 在本文中寫給讀者看的註解會使用 % 符號
§ [ ] 為reference,會將網址放在最後提供參照
§ 如果是終端機的指令前面會加上$,輸入時只需要輸入這個符號後的程式碼


III. 部署流程

「本機端」

本機端需要為Server端的部署做一些前置作業

1.將database.yml檔加入.gitignore
(1) 打開.gitignore檔

(2)在裡面加上
/config/database.yml
% 這一步驟很重要,因為database.yml裡面會有database設定的一些資料,不能被git紀錄,否則有些敏感的資訊可能就會被盜用。之後有一些含有secret之類的資料也要比照處理。

2.Gemfile修改
(1)將therubyracer的註解打開

(2)將sqlite3移到development的group裡面去(如果沒有就自己寫一個group),並且新增production group在裡面加入mysql2 gem
gem 'therubyracer', platforms: ruby

group :development do
  gem 'sqlite3'
end

group :production do
  gem 'mysql2', '~> 0.3.18'
end
% 後面兩個區塊是因為我們在production環境需要使用mysql資料庫,因此我們在專案中安裝mysql2 adapter好讓我們能跟資料庫溝通;原本使用的sqlite3就必須指定只有development環境才使用。
% mysql2的版本指定為0.3.18是因為Rails4.x.x會和最新版的mysql2有衝突

3.如果有使用devise gem的話必須到config/initializers/devise.rb中將以下uncomment(取消註解)

config.secret_key = ‘…....’


「Server端」
 
如同前一篇所設定,server端採用Ubuntu 14.04LTS
這邊讓我們來談一下伺服器。目前我們建立了一台遠端伺服器準備將專案deploy到上面好讓大家都可以看到網站。要有辦法這樣的話,首先我們就要設定該伺服器的環境,包括標題所述的Nginx、Passenger,以及需要的資料庫、rbenv(ruby的版本控制)等等,完成了這些以後我們再將專案放上去,讓server自動運行網站。

另外值得一提的是伺服器非常重視權限,在上面可以創建很多帳號,讓每個帳號都擁有不一樣的權限,這樣的話就比較不會因為不小心而弄壞了什麼東西。這些在後面也會實作到,所以這一篇的內容會比較多,希望大家有耐心的看下去。

1.首先先連線到server端
$ ssh -i <name>.pem ubuntu@<server_ip>
% .pem是你在創立server時所下載的密鑰名稱,server_ip則是你該server的public ip,例如 ssh -i jacky.pem ubuntu@111.222.333.444

2.系統更新(在進行任何安裝之前將系統更新到最新)
依序輸入
$sudo apt-get update
$sudo apt-get upgrade
$sudo apt-get autoremove
% autoremove是將升級過程中用到但是升級完後不需要的套件刪除

3.設定時區
$sudo dpkg-reconfigure tzdata

4.安裝需要的套件
$sudo apt-get -y install build-essential git-core curl libssl-dev libreadline5 libreadline-gplv2-dev zlib1g zlib1g-dev libmysqlclient-dev libcurl4-openssl-dev libxslt-dev libxml2-dev

5.安裝system-wide rbenv(Ruby的版本控制)
參考 https://gist.github.com/v1nc3ntlaw/1441139
(1)安裝rbenv
$sudo git clone git://github.com/sstephenson/rbenv.git /usr/local/rbenv

(2)將rbenv加入PATH裡面(當run command時會去找PATH看對應的可用file)
$sudo vim /etc/profile.d/rbenv.sh (進入vim編輯模式)

在編輯模式裡輸入(先按i,然後再把下面那段複製貼上)
export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH" 
eval "$(rbenv init -)"

完成後存檔退出(先按esc,再按:wq,再按Enter)

(3)修改權限
$sudo chmod +x /etc/profile.d/rbenv.sh (將rbenv.sh加入可執行(executable)的權限)

(4)安裝ruby-build
$git clone git://github.com/sstephenson/ruby-build.git /tmp/ruby-build
$sudo /tmp/ruby-build/install.sh

(5)轉換權限至root
$sudo su -

(6)安裝Ruby(看你的專案ruby版本是什麼就安裝什麼)
$rbenv install 2.2.4
$rbenv global 2.2.4
$rbenv rehash

6.安裝ImageMagick
$apt-get install imagemagick

7.安裝MySQL
$sudo apt-get mysql-server (中途輸入密碼,密碼要記得)
$sudo apt-get install libmysqlclient-dev mysql-com mysql-client

8.安裝Passenger
$gem install passenger

9.用Passenger安裝Nginx
(1)安裝Nginx
$passenger-install-nginx-module
% 過程中會需要你按三次enter,都直接按就好

(2)安裝Nginx init script
$git clone git://github.com/jnstq/rails-nginx-passenger-ubuntu.git
$sudo mv rails-nginx-passenger-ubuntu/nginx/nginx /etc/init.d/nginx
$sudo chown root:root /etc/init.d/nginx

(3)設定Nginx conf
$vim /opt/nginx/conf/nginx.conf (進入vim編輯模式)

找到server的hash,在裡面加上(一樣要先按i才能編輯)
root /home/apps/training/public;
passenger_enabled on;
接著把server hash裡其他不重要的都刪掉,最後會是這樣
server {
    listen       80;
    server_name  localhost;
    root /home/apps/<app_name>/public;
    passenger_enabled on;
}
% 其中 要填上你專案的名稱。server hash外的東西不要修改,而其中的apps是我們後面會設定的一個帳號名稱(用來deploy專案的)

(4)重新開啟Nginx
$sudo /etc/init.d/nginx restart (有寫OK的話代表成功)

10.進行apps帳號設定
(1) 先安裝必要的gem
$gem install bundle
$gem install execjs

(2)新增user
$sudo adduser apps
% 接下來的的操作都要用apps這個帳號,如果還沒切換可以輸入
$sudo su - apps
(3)確認ruby版本
$ruby -v (2.2.4 correct)

(4) 產生ssh-key並貼到github上
$ssh-keygen ( 連按三次enter)

$more ~/.ssh/id_rsa.pub (複製並貼到github ssh key設定的頁面上)

% 這步驟是要讓server可以直接提取github上面的專案

11.clone自己的專案
$git clone git@github.com:alan123/training.git
% 上面是範例github以及專案名稱,要把那邊換成你們自己的
% 而”git@github”這樣的連結代表我是用SSH方法去github拿專案,如果上一步沒設定好這一步就無法成功

12.設定config/database.yml
production:
    adapter: mysql2
    encoding: utf8
    database: training
    pool: 5 
    username: root 
    password: "" 
    socket: /var/run/mysqld/mysqld.sock
% 當你把專案clone過來之後,你的server上就有一份完整的專案,資料夾結構就和你本機端的一模一樣,你可以輸入ls看目前這一層有什麼檔案和資料夾。要進到config/database.yml就必須
$vim training/config/database.yml (training要換成你的專案名稱)

% 另外裡面的database要換成你的專案名稱,password要填入你前面在設定MySQL時設定的值

13.安裝專案需要的gem&跑rake任務
(1)安裝專案gem
$cd training (training改為你的專案名稱)
$bundle install
% 接著應該會噴錯誤,他會告訴你apps這個帳號不夠權限安裝gem(在系統層)如下
Your user account isn’t allowed to install to the system Rubygems.
You can cancel this installation and run:
bundle install –path vendor/bundle
to install the gems into ./vendor/bundle/, or you can enter your password and install the bundled gems to Rubygems using sudo.
% 但由於apps是我們設定用來deploy的,不應該給他太多權限,這樣才能以防萬一,因此根
據建議我們將gem安裝在 vendor/bundle裡面
$bundle install --path vendor/bundle --without development test
% 上面順便讓development和test group裡面的gem不會被安裝,因為我們根本用不到,第一次安裝好後,以後都只需要bundle install即可

(2)跑rake任務
$RAILS_ENV=production bundle exec rake db:create
$RAILS_ENV=production bundle exec rake db:migrate
$RAILS_ENV=production bundle exec rake assets:precompile
% 上面分別是建立資料庫、遷移資料庫、將靜態檔案precompile

(3)在config/secrets.yml中加上production的密碼
$vim config/secrets.yml (進入vim編輯模式)
可以直接將development的secret_key_base複製貼到production上
development:
    secret_key_base: c5c5c4e1fa5b620d39b384c8169

test:
    secret_key_base: e5515ebeade651145843b86f755

production:
    secret_key_base: c5c5c4e1fa5b620d39b384c8169

14.重開nginx,看是否成功
$sudo /etc/init.d/nginx restart

15.在瀏覽器輸入server的ip,看看網站首頁有沒有出現,有的話就成功啦!!

16 則留言 :

  1. I am really happy with your blog because your article is very unique and powerful for new reader.
    Click here:
    Selenium Training in Chennai | Selenium Training in Bangalore | Selenium Training in Pune | Selenium online Training

    回覆刪除
  2. href="https://istanbulolala.biz/">https://istanbulolala.biz/
    KD2

    回覆刪除