蒼時弦也
蒼時弦也
資深軟體工程師
發表於

部署你的第一個 Ruby on Rails 網站(四)

第一篇第二篇的說明,加上第三篇我想大家已經對編譯自己的環境稍為熟悉。

為了要可以用 Passenger 作為網站伺服器,我們需要自行編譯 Nginx 讓他可以使用 Passenger 模組。

不過因為 Passenger 已經針對這方面做好對應的處置,所以我們只需要按照 Passenger 提供的解決方案一步一步的進行編譯即可。

Passenger 提供了從原始碼安裝跟透過 Ruby Gem 安裝兩種,為了好維護跟升級,這篇文章會採取從原始碼安裝的方式。

取得原始碼

Passenger 除了開放原始碼的版本,也有企業版。從官網可以找到開放原始碼版本的下載點,而且貼心的提供了像下面截圖的安裝指南。

螢幕快照 2018-04-10 上午12.13.04.png

因為要從原始碼安裝,所以要先選擇其他作業系統。

螢幕快照 2018-04-10 上午12.13.30.png

因為要和 Nginx 搭配,要記得將 Standalone 改為 Nginx 才能得到正確的安裝指南。

不過 Standalone 模式似乎也會變編譯一個 Nginx 來運行,只是不會顯示給使用者。

對頁面上的「Download tarball」按鈕點選右鍵複製連結,會得到類似下面的連結。

https://www.phusionpassenger.com/latest_stable_tarball

因為 Passenger 不像 Ruby 安裝完畢後會複製到某個指定的資料夾,所以我們可以參考 Homebrew 的方式,在 /usr/local/passenger 裡面放置檔案。

1mkdir /usr/local/passenger
2cd /usr/local/passenger
3wget https://www.phusionpassenger.com/latest_stable_tarball

這邊建議用 root 來進行這個動作,因為 Passenger 安裝過程會需要 root 權限之外,/usr/local 目錄要新增資料夾也是需要有 root 權限的。

安裝 Passenger

首先把我們下載回來的 Passenger 解壓縮。

1tar -zxvf latest_stable_tarball

wget 不知道原因並沒有自動轉成檔名,不過能夠解壓縮就就不需要太在意細節。

解壓縮後應該會得到一個最新版的 Passenger 目錄(本文撰寫時是 5.2.3 版)

1[root@deploy-example passenger]# ls
2latest_stable_tarball  passenger-5.2.3

接著進入 passenger-5.2.3 這個目錄,執行 Passenger 的安裝程式。因為 Passenger 是有使用 Ruby 的,如果上一篇文章介紹的設定沒有正確的話,可能會無法執行。

1export PATH=/usr/local/passenger/passenger-5.2.3/bin:$PATH
2passenger-install-nginx-module

依照文件,我們跟上次設定 Ruby 的時候一樣先暫時讓 Passenger 的執行檔都可以執行。安裝中途也會嘗試呼叫這個目錄的其他執行檔,所以在安裝階段先這樣設定會讓後續流暢不少。

執行 passenger-install-nginx-module 會中斷好幾次,主要是 Passenger 會建議我們把一些設定改善後再繼續。

開始後,會先出現類似下面的詢問訊息:

 1[root@deploy-example passenger-5.2.3]# passenger-install-nginx-module
 2Welcome to the Phusion Passenger Nginx module installer, v5.2.3.
 3
 4This installer will guide you through the entire installation process. It
 5shouldn't take more than 5 minutes in total.
 6
 7Here's what you can expect from the installation process:
 8
 9 1. This installer will compile and install Nginx with Passenger support.
10 2. You'll learn how to configure Passenger in Nginx.
11 3. You'll learn how to deploy a Ruby on Rails application.
12
13Don't worry if anything goes wrong. This installer will advise you on how to
14solve any problems.
15
16Press Enter to continue, or Ctrl-C to abort.

因為有好幾次詢問,所以如果後面沒有特別提醒的話,請自己按 Enter 繼續執行即可。

開始後會先詢問要支援哪些語言,因為 Passenger 後來陸續增加了 Python 和 Node.js 的支援,如果需要的話,也可以用方向鍵和空白鍵選取起來。

1Which languages are you interested in?
2
3Use <space> to select.
4If the menu doesn't display correctly, press '!'
5
6 ‣ ⬢  Ruby
7   ⬡  Python
8   ⬡  Node.js
9   ⬡  Meteor

下一步會檢查相依性,如果出現類似下面的訊息,就表示有缺少一些程式。按下 Enter 之後 Passenger 會給出安裝指令,我們再複製來使用即可。

 1Checking for required software...
 2
 3 * Checking for C compiler...
 4      Found: yes
 5      Location: /usr/bin/cc
 6 * Checking for C++ compiler...
 7      Found: no
 8 * Checking for A download tool like 'wget' or 'curl'...
 9      Found: yes
10      Location: /usr/bin/wget
11 * Checking for Curl development headers with SSL support...
12      Found: no
13      Error: Cannot find the `curl-config` command.
14 * Checking for OpenSSL development headers...
15      Found: yes
16      Location: /usr/include/openssl/ssl.h
17 * Checking for Zlib development headers...
18      Found: yes
19      Location: /usr/include/zlib.h
20 * Checking for Rake (associated with /usr/local/ruby-2.4.3/bin/ruby)...
21      Found: yes
22      Location: /usr/local/ruby-2.4.3/bin/ruby /usr/local/ruby-2.4.3/bin/rake
23 * Checking for OpenSSL support for Ruby...
24      Found: yes
25 * Checking for RubyGems...
26      Found: yes
27 * Checking for Ruby development headers...
28      Found: yes
29      Location: /usr/local/ruby-2.4.3/include/ruby-2.4.0/ruby.h
30 * Checking for rack...
31      Found: no
32
33Some required software is not installed.
34But don't worry, this installer will tell you how to install them.
35Press Enter to continue, or Ctrl-C to abort.

提示的安裝指令如下

 1--------------------------------------------
 2
 3Installation instructions for required software
 4
 5 * To install C++ compiler:
 6   Please install it with yum install gcc-c++
 7
 8 * To install Curl development headers with SSL support:
 9   Please install it with yum install libcurl-devel
10
11 * To install rack:
12   Please make sure RubyGems is installed, then run /usr/local/ruby-2.4.3/bin/ruby /usr/local/ruby-2.4.3/bin/gem install rack
13
14If the aforementioned instructions didn't solve your problem, then please take
15a look at our documentation for troubleshooting tips:
16
17  https://www.phusionpassenger.com/library/install/nginx/
18  https://www.phusionpassenger.com/library/admin/nginx/troubleshooting/

既然缺少了,那們我們就先執行對應的指令將缺少的套件安裝完成。

1yum install gcc-c++ libcurl-devel
2gem install rack

完成之後,我們重新執行 passenger-install-nginx-module 指令,前面的檢查選項就可以通過。這時候就會詢問我們要自己將 Passenger 加入 Nginx 編譯,還是讓 Passenger 幫我們自動編譯 Nginx。

 1Automatically download and install Nginx?
 2
 3Nginx doesn't support loadable modules such as some other web servers do,
 4so in order to install Nginx with Passenger support, it must be recompiled.
 5
 6Do you want this installer to download, compile and install Nginx for you?
 7
 8 1. Yes: download, compile and install Nginx for me. (recommended)
 9    The easiest way to get started. A stock Nginx 1.12.2 with Passenger
10    support, but with no other additional third party modules, will be
11    installed for you to a directory of your choice.
12
13 2. No: I want to customize my Nginx installation. (for advanced users)
14    Choose this if you want to compile Nginx with more third party modules
15    besides Passenger, or if you need to pass additional options to Nginx's
16    'configure' script. This installer will  1) ask you for the location of
17    the Nginx source code,  2) run the 'configure' script according to your
18    instructions, and  3) run 'make install'.
19
20Whichever you choose, if you already have an existing Nginx configuration file,
21then it will be preserved.
22
23Enter your choice (1 or 2) or press Ctrl-C to abort: 1

輸入 1 之後按下 Enter 就會開始把 Nginx 下載並且安裝摟!如果被詢問安裝目錄,基本上保持預設值就好,只是會跟透過 yum 安裝的位置不太一樣,所以要稍微記一下。

1Where do you want to install Nginx to?
2
3Please specify a prefix directory [/opt/nginx]:

要注意的是如果選用的主機規格太小 Passenger 會建議換大一點的主機,至少要有 1G 以上的記憶體比較適合。

如果中間都沒有出錯的話,我們會看到像下面這樣的訊息,也就表示安裝成功了。

 1Nginx with Passenger support was successfully installed.
 2
 3The Nginx configuration file (/opt/nginx/conf/nginx.conf)
 4must contain the correct configuration options in order for Phusion Passenger
 5to function correctly.
 6
 7This installer has already modified the configuration file for you! The
 8following configuration snippet was inserted:
 9
10  http {
11      ...
12      passenger_root /usr/local/passenger/passenger-5.2.3;
13      passenger_ruby /usr/local/ruby-2.4.3/bin/ruby;
14      ...
15  }
16
17After you start Nginx, you are ready to deploy any number of Ruby on Rails
18applications on Nginx.
19
20Press ENTER to continue.

開啟 Nginx

不過到目前為止,我們其實只是把 Passenger 和 Nginx 編譯完成,但是並沒有把 Nginx 打開。也因此,其他人是無法連上這台伺服器上的網站。

為了方便管理,我們可以使用 systemd 功能,透過撰寫設定檔,來使用 systemctl 指令觀看狀態,或者重新啟動。

在 Nginx 官網有提供一份範例,基本上只要修改範例上的路徑到正確的位置,我們就可以使用 systemctl 來控制 Nginx 的開啟跟關閉。

透過 vi 編輯 /lib/systemd/system/nginx.service 這個檔案。

vi /lib/systemd/system/nginx.service

然後把下面的內容貼上,如果有修改 Nginx 的安裝路徑,要把 /opt/nginx 替換掉。

 1[Unit]
 2Description=The NGINX HTTP and reverse proxy server
 3After=syslog.target network.target remote-fs.target nss-lookup.target
 4
 5[Service]
 6Type=forking
 7PIDFile=/opt/nginx/logs/nginx.pid
 8ExecStartPre=/opt/nginx/sbin/nginx -t
 9ExecStart=/opt/nginx/sbin/nginx
10ExecReload=/bin/kill -s HUP $MAINPID
11ExecStop=/bin/kill -s QUIT $MAINPID
12PrivateTmp=true
13
14[Install]
15WantedBy=multi-user.target

還記得怎麼編輯嗎?按下 i 進入插入模式,貼上後用 Esc 退出,然後用 :wq 指令存檔離開。

完成之後,我們就可以用 systemctl 指令來開啟或者關閉 Nginx 了,不過在這之前我們會希望在意外當機後重開機時,能夠自動地把 Nginx 啟動。

1systemctl enable nginx

利用 enable 功能,把 Nginx 設定為開機自動啟動的項目。

接下來用 start 指令把 Nginx 打開,並且用 status 指令看看是不是變成 running 的運行狀態。

1systemctl start nginx
2systemctl status nginx

如果想檢查看看能不能連上,可以利用 curl 指令。

1curl localhost

如果有 HTML 語法出現,基本上就是安裝成功了!

如果找不到 curl 指令可以執行,嘗試看看自己用 yum 安裝吧!

小結

其實文章到這邊,安裝伺服器的部分就告一段落。下一階段會介紹怎麼設定 Ruby on Rails 專案,用 Capistrano 這個 Gem 幫助你把網站部署到這台伺服器。

不過,伺服器的設定其實還沒有完成,只是這些小問題會讓你在維護上不太方便。在後面的教學中,會陸續介紹跟提供解決的方案。