進度條

[Rails] 在Ubuntu底下使用Nginx 安裝Rails

更新日期:

0. 建立自己的使用者,Linode、DigitalOcean都是使用root做為一開始的使用者

0.1 建立使用者

$ sudo useradd <使用者名稱>
例如:sudo useradd goodman , 那你的使用者名稱就是goodman, 後面內容依此代換<使用者名稱>。


0.2 改變使用者密碼, 預設沒有, 所以無法登入 
$ sudo passwd <使用者名稱>

0.3 將使用者加入sudo, 擁有超級使用者權限
$ usermod -aG sudo <使用者名稱>

0.4 進入 /home/, 建立使用者資料夾 
$ cd /home/
$ mkdir <使用者名稱>

0.5 讓使用者可以使用此資料夾
$ chown <使用者名稱>:<使用者名稱> <使用者名稱>
$ chmod 700 <使用者名稱>

0.6 改變使用者登入使用bash而非sh
$ vim /etc/passwd

最底下改成
<使用者名稱>:x:1000:1000::/home/<使用者名稱>:/bin/bash
數字如果不是1000沒關係,不用改

0.7 登出後以新帳號 <使用者名稱> 登入

======= 以下由 <使用者名稱> 權限執行 =========

0.8 更新apt list與套件
$ sudo apt update
$ sudo apt upgrade
 

如果你的RAM只有1 GB, 那後面安裝編譯會有點問題
用硬碟模擬可以解決,但是效能比較不好
利用硬碟空間增加記憶體空間,也就是使用虛擬記憶體與swap

 

 

1. 安裝rvm來安裝與管理ruby,  官網為準

1.1 安裝gpq2
$ sudo apt install gnupg2

 

1.2 安裝rvm key
$ gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

 

1.3 安裝rvm
$ \curl -sSL https://get.rvm.io | bash -s stable

 

1.4 執行source (此步驟也可以改成登出後再登入)
$ source /home/<使用者名稱>/.rvm/scripts/rvm

 

1.5 使用任意rvm指令觀看是否正常
$ rvm list known
應該會出現所有可能的ruby版本

 

2 安裝ruby

2.1 安裝2.6版,如果有更新的就裝更新的穩定版本
$ rvm install ruby-2.6

 

2.2 設定ruby版本
$ rvm use 2.6 --default

 

2.3 確認 ruby 版本
$ ruby -v
 

 

3. 安裝nodejs

3.1 下載更新檔更新最新nodejs所在位置(會直接執行apt update),這邊的setup是nodejs 12, 以nodejs Github說明頁為準
$ curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -

 

3.2 上一步執行完後,apt即可下載安裝
$ sudo apt-get install -y nodejs

 

 

4 安裝 yarn, 以yarn官網為準

4.1 加入repository
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

 

4.2 更新repository 與 安裝
$ sudo apt-get update && sudo apt-get install yarn
 

 

5. 安裝nginx

5.1 用apt安裝nginx

$sudo apt install nginx


5.2 用任何電腦瀏覽器看你的<ip>, 用http, 不要用https, 即可看到nginx 歡迎頁面,ip跟你用ssh連上的ip是同一個

 

5.3 歡迎頁面在Server的 /var/www/html 

 

6. 安裝Rails
6.1 安裝完ruby 後就會有gem指令, RubyGems是Ruby的套件管理系統
$ gem install rails --no-document

 

6.2 進入 /var/www, 移除html, 加入新資料夾, 資料夾名稱可為網站全名或<專案名稱>
$ cd /var/www
$ sudo mkdir <專案名稱>

 

6.3 改變資料夾權限
$ sudo chown www-data:www-data <專案名稱>
$ sudo chmod 775 <專案名稱>

 

6.4 將<使用者名稱>加入www-data 群組
$ sudo usermod -aG www-data <使用者名稱>

 

6.5 登入後登入 exit

 

6.6 進入<專案名稱>
$ cd /var/www/<專案名稱>

 

6.7 安裝rails在當前目錄
$ rails new . --skip-test-unit

【其中<.>表示當前目錄, 要注意的是此目錄的權限必須是
www-data:www-data 775, 然後目前使用者必須包含在www-data的group裡面】

 

6.8 初始化webpacker
$ rails webpacker:install

 

6.8 安裝文字介面瀏覽器lynx
$ sudo apt install lynx

 

6.9 背景執行rails server
$ rails s &
會出現一個pid 數字, 要記得

 

6.10 用lynx觀看
$ lynx http://localhost:3000

會看到類似:Yay! You’re on Rails!
按q => 按y 離開 (或是ctrl + c 也可以強制中斷)
 

6.11 關閉背景執行的rails server

$ kill -9 <pid>

忘記pid 也可以用

$ ps

就會看到ruby前面有PID

 

 

7 安裝passenger 以官網為準

 

7.1 讓passenger可以被apt下載的前置作業
$ sudo apt-get install -y dirmngr gnupg
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
$ sudo apt-get install -y apt-transport-https ca-certificates

 

7.2 把passenger站台加入apt source.list並更新
$ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list'
$ sudo apt-get update

 

7.3 下載nginx passenger
$ sudo apt-get install -y libnginx-mod-http-passenger

 

7.4 拷貝passenger設定檔到nginx設定檔執行
$ if [ ! -f /etc/nginx/modules-enabled/50-mod-http-passenger.conf ]; then sudo ln -s /usr/share/nginx/modules-available/mod-http-passenger.load /etc/nginx/modules-enabled/50-mod-http-passenger.conf ; fi

 

7.5 檢查設定檔是否存在
$ sudo ls /etc/nginx/conf.d/mod-http-passenger.conf

 

7.6 重啟Nginx
$ sudo service nginx restart

 

7.7 檢查相關內容是否正確
$ sudo /usr/bin/passenger-config validate-install
$ sudo /usr/sbin/passenger-memory-stats

 

 

8. 部署rails 程式顯示於http port
8.1 執行以下指令看設定
$ passenger-config about ruby-command

會顯示類似
To use in Nginx : passenger_ruby /home/<使用者名稱>/.rvm/gems/ruby-<版本號>/wrappers/ruby

 

8.2 進到nginx 網站設定檔
$ cd /etc/nginx/sites-available/

 

8.3 改名或複製 default 成你的網站設定檔名稱,可以直接使用<專案名稱>
$ sudo cp default <專案名稱>
或是
$ sudo mv default <專案名稱>

 

8.4 進入更改該檔案
$ sudo vim <專案名稱>

 

8.4.a
root /var/www/html; => root /var/www/<專案名稱>/public;
server_name _  => server_name <你的網站完整網域,包含子網域>; //例如 www.google.com.tw
passenger_enabled on;
passenger_ruby /path-to-ruby;  <= 8.1 看到的路徑
rails_env development; <= 或是 production

小心每一行最後到要加分號結尾「;」, 跟C語言一樣
如果rails_env開development 就直接可以用,開production在Rails裡面還要設定,所以會出現500頁面


8.5 建立軟連結至/etc/nginx/sites-enable/
$ sudo ln -s /etc/nginx/sites-available/<專案名稱> /etc/nginx/sites-enabled/


8.6 移除default於/etc/nginx/sites-enabled/
$ sudo rm /etc/nginx/sites-enabled/default

 

9.a [暫時有問題,先不要使用這個, 用9.b] 使用自簽SSL加密成HTTPS,此作法瀏覽器直接訪問會顯示「危險」,但是經過CloudFlare SSL Full 模式後會顯示正常。(因為最後對外為CloudFlare 的SSL)

9.a.1 進到家目錄
$ cd ~

9.a.2 依照下面步驟執行,會產生兩個檔案 MyCertificate.crt, MyKey.key
$ openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out MyCertificate.crt -keyout MyKey.key
中間的選項全部都按Enter略過即可,因為無論多正確都不會通過瀏覽器的驗證

9.a.3 更改key的權限為唯讀
$ sudo chmod 400 MyKey.key

9.a.4 變更 /etc/nginx/sites-available/<專案名稱>
$ vim /etc/nginx/sites-available/<專案名稱>

server {
  listen 443 ssl http2 default_server;
  listen [::]:443 ssl http2 default_server;

  include snippets/snakeoil.conf; #這個不是必須,但是我們利用他預設寫好的路徑比較方便

  root /var/www/<專案名稱>/public;
  server_name <你的網站完整網域,包含子網域>; #例如 www.google.com.tw
  passenger_enabled on;
  passenger_ruby <8.1 看到的路徑>;
  rails_env development; #或是 production
}

9.a.5 看snakeoil.conf 內容
cat /etc/nginx/snippets/snakeoil.conf

顯示:
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

9.a.6 移動pem和key到對的位置
$ sudo mv ~/MyCertificate.crt /etc/ssl/certs/ssl-cert-snakeoil.pem
$ sudo mv ~/MyKey.key /etc/ssl/private/ssl-cert-snakeoil.key

9.a.7 restart Nginx
$ sudo service nginx restart

9.a.8 用瀏覽器開啟 https://<ip>
會出現 Not Secure,但是略過警告後一樣可以看

9.a.9 打開Cloudflare, 設定A record, 橘色的雲打開, ssl 限制選擇Full

9.a.10 強制導向http到https
9.a.10.1 可以用cloudflare的Page Rules設定,免費的可以使用三個Page Rules
         這樣會佔用掉一個
9.a.10.2 或是在vim /etc/nginx/sites-available/<專案名稱> 裡面增加

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name <你的網站完整網域,包含子網域>;
    return 301 https://$host$request_uri;
}


9.b [可選] 安裝SSL變成HTTPS, 使用Let's encrypted (此步驟使用CloudFlare可不做,或是選用CloudFlare Full)
待完成,可參考https://certbot.eff.org