前端工程師後端之旅(7) - 爬上穹頂的最後一哩路:部署

什麼是部署

所有功能實作完之後,為了讓網站可以被一般使用者看到,我們必須要將程式碼放到一台有網路連接的電腦,只要有跟網路連接,就可以透過IP位址找到網站的所在位置,以前要做到這件事情還必須購買硬體主機等等昂貴的設備。

不過現在已經有許多網路主機商提供雲端虛擬主機的服務,只要花一點相對非常便宜的費用就可以連線到該主機去設定系統並且安裝需要的套件跟程式碼,這個複雜且充滿未知挑戰的最後一步我們稱為「部署」。

Outline

  1. 雲端Server 選擇
  2. 新增使用者
  3. 更新資源庫
  4. 安裝mysql
  5. 安裝rvm
  6. 使用rvm 安裝 並使用ruby
  7. 安裝Rails
  8. Clone 要部署的專案
  9. 安裝 Passenger 跟 nginx
  10. Nginx Server設定
  11. 參考教學

雲端Server 選擇

基本上這類服務都差不多,最基本就是用價錢跟使用時間來做考量,在這裡我使用的是Google的GCP服務,在GCP剛註冊的會員會給予300塊美金,並且在一年內可以使用,非常適合拿來做練習,而且我記得Google每個人最多可以開五個左右的帳號,一組用不夠…可以開兩個啊

對於怎麼建立一台主機,網路上應該有很多類似的教學,看一下教學應該半小時內可以完成,在此不多做說明。裝完主機後,透過GCP介面提供的指令,應該可以很快讓你從電腦連到該機器。

新增使用者

我們通常不會一直用root去操作跟安裝,而是會新增一個使用者後,在給予最高權限,因為每個帳號有自己個別的資料夾,如此一來可以讓系統比較好維護,而最高權限意味著可以做任何事情,當然包括把自己刪掉,所以在使用上要非常小心。

sudo adduser mujing
sudo adduser mujing sudo

切換帳號

su mujing

更新資源庫

我使用的是ubuntu系統,因此新系統安裝完時,最好更新一下系統內預設的套件管理器:

sudo apt-get update 

安裝mysql

這個Rails專案是搭配mysql資料庫開發的,因此必須安裝:

sudo apt install mysql-server

如果是在unbuntu上使用mysql 的話記得多裝個mysql client :

sudo apt-get install libmysqlclient-dev

安裝rvm

rvm 是Ruby 語言版本的管理套件,可以讓你在不同版本之間快速切換,方便管理:

curl -L https://get.rvm.io | bash

使用rvm 安裝 並使用ruby

使用的ruby是2.4.1 ,可以根據需求安裝不同版本

rvm install 2.2.3

設成預設

rvm use 2.4.1 --default

安裝Rails

走了那麼多步驟,終於可以安裝Rails啦

gem install rails --no-ri --no-rdoc 

Clone 要部署的專案

把程式碼從git server 下載到這台主機上,一般會放在github,
如這個專案的程式碼位置 https://github.com/moojing/rails-cart

下載完之後記得進入專案資料夾下 bundle install 指令,安裝專案所需要的套件,並透過rails指令把資料表產出來,記得專案裡面database.yml的資料庫使用者帳號密碼要設定對,否則會連不上Sql Server:

bundle install
rake db:create
rake db:migrate

安裝 Passenger 跟 nginx

Nginx 是一套http Server,可以讓管理者設定許多網頁相關的功能,我們這裡只需要最簡單的監聽某個port,可以讓資料跟外面溝通就行。

Passenger可以想成是Nginx的擴充模組,透過設定,讓你再啟動Nginx時一起把Rails 開起來,透過Nginx監聽某port,來與外界傳送資料跟溝通。

安裝以上兩個工具基本上不會很複雜,Passenger已經寫好教學等你去看了,只要照著操作就能安裝完Nginx跟Passenger:

https://www.phusionpassenger.com/library/install/nginx/install/oss/xenial

Nginx Server設定

安裝完之後開啟nginx 設定檔

sudo nano /etc/nginx/nginx.conf

應該可以看到passenger幫你加入這兩行,把註解打開就行:

# passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
# passenger_ruby /usr/bin/ruby;

由於nginx預設監聽80port,所有Server都是預設80port,平常你上網直接打網址的時候其實就是對到80port,
而且Server的port同時只能被一個程序佔用,所以如果想讓80port空下來,我們必須改掉他預設的設定:

打開下列的檔案,這裡是nginx預設的設定檔

sudo vim /etc/nginx/sites-available/default

把 listen 80 default_server;相關的設定註解掉:

# listen 80 default_server;
# listen [::]:80 default_server ipv6only=on;

在同樣的資料夾新增一個屬於你網站的設定檔:

sudo vim /etc/nginx/sites-available/mysite

放入相關設定:

server {
 listen 80 default_server;
 server_name http://34.80.215.175; //如果沒有domain 就放網址
 passenger_enabled on; //passenger 設定,要有才能串連rails
 passenger_app_env development; // 環境變數
 root /home/rails/rails-cart/public; // 你的rails專案資料夾的public
}

設定軟連結,

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

然後再重啟Nginx Server 就大功告成:

sudo service nginx start 

終於成功了!系統部署一般屬於DevOps的工作,當然以上都只用到非常基礎的知識而已,DevOps領域可說是博大精深,學也學不完,這只能算是淺嘗輒止,總之你可以在這裡看到我的實作成果。

參考教學

Luka’s notes - Deploy Redmine to VPS by Rails way in Ubuntu 14.04

How To Deploy a Rails App with Passenger and Nginx on Ubuntu 14.04

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×