2026年9月29日

2026年9月29日

rbenvでVPSのRubyバージョンを管理する方法:インストールから切り替え・systemd運用まで

rbenv は、1台のサーバーに複数の Ruby を入れ、ディレクトリ(プロジェクト)ごとに使うバージョンを切り替えるツールです。OS のパッケージで入る Ruby は版が古かったり、OS の更新で版が変わったりするため、アプリケーションが必要とする版を固定したいときに使います。この記事では、Ubuntu または RHEL 系(AlmaLinux、Rocky Linux など)の VPS に rbenv を入れ、Ruby をインストールして切り替え、systemd のサービスから使うまでを説明します。

前提

  • 作業はアプリケーションを動かす一般ユーザー(この記事では deploy)で行います。rbenv はユーザーのホームディレクトリ(~/.rbenv)に入るため、root で入れる必要はありません。
  • Ruby はソースからビルドするため、1GB 程度のメモリがあると安心です。メモリが少ない VPS では、ビルド中に処理が強制終了されることがあります(後述)。
  • 2026年10月時点の Ruby の安定版は 4.0 系と 3.4 系です。どの版を入れるかは、アプリケーションの Gemfile や .ruby-version に合わせます。

ステップ1:ビルドに必要なパッケージを入れる

ruby-build の Wiki に載っている推奨パッケージを入れます。

Ubuntu / Debian:

sudo apt update
sudo apt install -y git curl build-essential autoconf libssl-dev libyaml-dev zlib1g-dev libffi-dev libgmp-dev rustc

RHEL 9 系(AlmaLinux 9、Rocky Linux 9):

sudo dnf install -y git make autoconf gcc patch bzip2 openssl-devel libffi-devel readline zlib-devel gdbm ncurses-devel tar perl-FindBin

RHEL 9 系では、YAML を扱う拡張(psych)に必要な libyaml-devel が標準のリポジトリに含まれていません。ビルドで psych のエラーが出た場合は、CRB リポジトリを有効にして追加します。

sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --set-enabled crb
sudo dnf install -y libyaml-devel

rustc は Ruby の YJIT(JIT コンパイラ)を有効にするために使われます。入っていなくても Ruby 自体はビルドできます。

ステップ2:rbenv をインストールする

rbenv の公式 README の手順どおり、Git で ~/.rbenv に取得し、シェルの設定を追加します。

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
~/.rbenv/bin/rbenv init

rbenv init を引数なしで実行すると、~/.bashrc などのシェルの設定ファイルに、次のような1行が追記されます。

eval "$(rbenv init - --no-rehash bash)"

設定を反映するため、いったんログアウトして SSH で入り直すか、新しいシェルを起動します。確認は次のとおりです。

type rbenv     # 「rbenv is a function」と表示されれば有効
rbenv --version

ステップ3:ruby-build を入れる

rbenv install コマンドは、プラグインの ruby-build が提供します。rbenv だけでは Ruby をインストールできないので、ruby-build を rbenv のプラグインとして入れます。

git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
rbenv install --version

ステップ4:Ruby をインストールして既定の版を決める

インストールできる版の一覧を表示します。-l は各系列の最新の安定版だけを表示し、-L はすべての版を表示します。

rbenv install -l

一覧から版を選んでインストールします。以下では例として 3.4.12 を使いますが、実際にはアプリケーションが必要とする版を指定してください。ビルドには数分から十数分かかります。

rbenv install 3.4.12
rbenv global 3.4.12     # このユーザーの既定の版にする(~/.rbenv/version に保存される)
ruby -v
rbenv versions          # インストール済みの版と、現在選ばれている版(* 印)

ruby -v で入れた版が表示されれば完了です。which ruby を実行すると ~/.rbenv/shims/ruby が表示されます。rbenv は shims という中継用のコマンドを PATH の先頭に置き、そこから選ばれた版の Ruby を呼び出す仕組みです。

ステップ5:プロジェクトごとに版を切り替える

プロジェクトのディレクトリで rbenv local を実行すると、そのディレクトリに .ruby-version というファイルが作られ、そのディレクトリ以下では指定した版が使われます。

cd ~/myapp
rbenv local 3.4.12      # .ruby-version を作成
rbenv version           # 現在の版と、どのファイルで決まったかを表示
ruby -v

すでに .ruby-version がリポジトリに含まれている場合は、その版を rbenv install で入れるだけで切り替わります。

rbenv が版を決める優先順位は次のとおりです。

優先度 設定方法 範囲
1(最優先) rbenv shell または環境変数 RBENV_VERSION そのシェルだけ
2 rbenv local(.ruby-version ファイル) そのディレクトリ以下
3 rbenv global(~/.rbenv/version) ユーザー全体の既定

版を切り替えたら、その版で gem を入れ直します。gem は Ruby の版ごとに別々に管理されます。

bundle install

Bundler は Ruby に標準で含まれています。Gemfile.lock が要求する Bundler の版が違う場合は、メッセージに従って gem install bundler -v 版 で入れます。sudo は付けません(sudo を付けると rbenv ではなく OS の Ruby に入ろうとします)。

ステップ6:systemd や cron から rbenv の Ruby を使う

systemd のサービスや cron は、~/.bashrc を読み込まないため、rbenv init の設定が効きません。そのままでは OS の Ruby が使われるか、ruby や bundle が見つからずに失敗します。rbenv exec をフルパス(/home/deploy/.rbenv/bin/rbenv)で呼び出すと、作業ディレクトリの .ruby-version に従った版で実行できます。

Rails アプリケーションを Puma で動かす systemd ユニットの例です(パスやファイル名は環境に合わせて変えます)。

# /etc/systemd/system/myapp.service
[Unit]
Description=myapp (Puma)
After=network.target

[Service]
Type=simple
User=deploy
WorkingDirectory=/home/deploy/myapp
Environment=RAILS_ENV=production
ExecStart=/home/deploy/.rbenv/bin/rbenv exec bundle exec puma -C config/puma.rb
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
systemctl status myapp

cron から Rake タスクなどを動かす場合も同じ考え方です。

# crontab -e(deploy ユーザー)
0 3 * * * cd /home/deploy/myapp && /home/deploy/.rbenv/bin/rbenv exec bundle exec rake some:task >> /home/deploy/myapp/log/cron.log 2>&1

Nginx と Passenger の組み合わせで動かす場合は、Passenger の passenger_ruby 設定に rbenv の Ruby のパス(例: /home/deploy/.rbenv/versions/3.4.12/bin/ruby)を指定します。Passenger の導入手順は版や OS によって異なるため、Phusion の公式ドキュメントに従ってください。

ステップ7:rbenv と Ruby を更新・削除する

新しい Ruby の版は、ruby-build を更新しないと一覧に出てきません。

git -C ~/.rbenv pull
git -C "$(rbenv root)"/plugins/ruby-build pull
rbenv install -l

使わなくなった版は削除できます。セキュリティ修正が終わった版は残さないようにします。

rbenv uninstall 3.3.10

よくあるエラーと対処

症状 原因と対処
rbenv: command not found シェルの設定が読み込まれていない。ログインし直すか、~/.bashrc に rbenv init の行があるか確認する
rbenv: no such command 'install' ruby-build が入っていない。ステップ3を行う
ビルドが psych や openssl のエラーで止まる 開発用パッケージ(libyaml-dev / libyaml-devel、libssl-dev / openssl-devel)が足りない。ステップ1を確認する
ビルド中に Killed と表示される メモリ不足。スワップを追加してから再実行する
ruby -v が違う版を表示する rbenv version で、どのファイルが版を決めているかを確認する
サービスから起動すると gem が見つからない systemd や cron は rbenv の設定を読まない。ステップ6のように rbenv exec を使う

メモリ不足でビルドが止まる場合は、一時的にスワップを追加すると完了することがあります。

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
free -h

まとめ

  • rbenv は ~/.rbenv に入れ、rbenv init でシェルに組み込む。Ruby のインストールには ruby-build が必要
  • rbenv install で版を入れ、rbenv global で既定、rbenv local(.ruby-version)でプロジェクトごとに切り替える
  • gem は版ごとに別管理。版を変えたら bundle install をやり直し、sudo は付けない
  • systemd や cron からは ~/.rbenv/bin/rbenv exec をフルパスで使う
  • 新しい版を入れる前に ruby-build を git pull で更新する

お気軽にご相談ください

お見積りへ お問い合わせへ
▲