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で更新する