Linux 上部署 Ruby on Rails 應用 文章首圖

Linux 上部署 Ruby on Rails 應用

Linux 上部署 Ruby on Rails 應用

對於許多開發者而言,將本地的 Ruby on Rails 應用成功部署到生產環境,往往是邁向成熟開發流程的關鍵一步。許多初學者容易過度依賴 Heroku 等 PaaS 平台,卻忽略了底層伺服器管理的樂趣與控制力。在本篇文章中,我們將手把手教你如何在 Ubuntu 22.04 或 Debian 12 伺服器上,使用 Nginx 作為反向代理,並結合 Phusion Passenger 來穩定運行 Rails 應用。這套組合不僅穩定,且資源佔用相對可控,非常適合中階使用者建立自己的部署環境。

前置準備與環境安裝

首先,請確保你擁有一台具有 sudo 權限的 Linux 伺服器,並已透過 SSH 連線進去。為了避免版本衝突,我們建議使用 rbenv 來管理 Ruby 版本,並利用 Nginx 處理靜態檔案與反向代理。

第一步是安裝系統依賴套件。Rails 依賴許多編譯工具與資料庫驅動程式,請執行以下指令:

sudo apt update
sudo apt install -y curl git-core zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev libffi-dev libpq-dev imagemagick dirmngr gnupg

接下來安裝 Ruby。我們選擇安裝最新穩定的 Ruby 3.2 版本(請根據你的應用需求調整版本號):

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 3.2.2
rbenv global 3.2.2

確認 Ruby 安裝成功後,安裝 RubyGems 並設定 gem 目錄:

rbenv rehash
gem install bundler

安裝 Phusion Passenger 與 Nginx

Phusion Passenger 是一個應用伺服器,能夠輕鬆地將 Rails 應用整合到 Nginx 中。首先安裝 GPG 金鑰與軟體源:

gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 561F7B9C4693BF69
echo "deb https://oss-binaries.phusionpassenger.com/apt/passenger jammy main" | sudo tee /etc/apt/sources.list.d/passenger.list
sudo apt update

現在安裝 Passenger 模組與 Nginx:

sudo apt install -y nginx libnginx-mod-http-passenger

安裝完成後,我們需要配置 Nginx。預設的配置文件位於 /etc/nginx/sites-available/default。請編輯該檔案,移除預設內容,並加入以下配置:

server {
    listen 80;
    server_name your_domain.com; # 請替換為你的實際網域名稱

    root /path/to/your/app/public; # 請替換為 Rails 應用目錄的 public 資料夾路徑

    # 啟用 Passenger
    passenger_enabled on;
    passenger_ruby /home/your_username/.rbenv/shims/ruby; # 請替換為 rbenv shim 的 ruby 路徑

    # 建議設定:限制請求大小
    client_max_body_size 50m;

    # 日誌設定
    access_log /var/log/nginx/your_app_access.log;
    error_log /var/log/nginx/your_app_error.log;
}

注意: 務必確認 passenger_ruby 的路徑正確指向由 rbenv 管理的 Ruby。你可以透過 which ruby 確認路徑。

完成配置後,檢查語法並重新啟動 Nginx:

sudo nginx -t
sudo systemctl restart nginx
sudo systemctl enable nginx

部署 Rails 應用

假設你的 Rails 應用已透過 Git 克隆至 /var/www/myapp。請進入該目錄並安裝依賴:

cd /var/www/myapp
# 安裝 bundle
bundle install --deployment --without development test

# 產生資料庫結構
RAILS_ENV=production bundle exec rails db:migrate
RAILS_ENV=production bundle exec rails db:seed

# 編譯前端資產
RAILS_ENV=production bundle exec rails assets:precompile

最後,確保 Nginx 使用者(通常是 www-data)有權限讀取應用目錄,特別是 tmplog 資料夾:

sudo chown -R www-data:www-data /var/www/myapp/tmp
sudo chown -R www-data:www-data /var/www/myapp/log

現在,透過瀏覽器訪問你的伺服器 IP 或網域名稱,應該就能看到 Rails 應用的首頁了!

常見問題與解決方案

1. 出現 "Passenger failed to start" 錯誤 這通常是因為 Ruby 路徑錯誤或權限問題。請檢查 Nginx 錯誤日誌 /var/log/nginx/error.log。確保 passenger_ruby 指向的路徑存在且可執行。另外,確認 Gemfile.lock 中的 Ruby 版本與伺服器安裝的版本一致。

2. 資料庫連線失敗 (PG::ConnectionBad) 確保 PostgreSQL 服務正在運行:sudo systemctl status postgresql。在 Rails 的 config/database.yml 中,確認生產環境的資料庫使用者名稱與密碼正確,且該使用者擁有對應資料庫的權限。

小結

透過 Nginx 與 Phusion Passenger 的組合,我們成功在 Ubuntu/Debian 上建立了一個穩定且高效的 Rails 部署環境。這種方式比傳統的多進程管理(如 Unicorn 或 Puma 搭配 Nginx 反向代理)更簡單直觀,特別適合中小型應用。當然,若你需要更進階的負載平衡或容器化部署,未來可以進一步探索 Docker 或 Kubernetes 的應用。希望這篇文章能幫助你跨出伺服器管理的重要一步!