【Rails】macOSのアップデート後にrailsコマンドが失敗する事象の対処法

はじめに

久しぶりにRailsアプリに手を入れようと思い、rails serverコマンドを実行してRailsサーバーを立ち上げようとしたところ、エラーが出て起動に失敗してしまいました。

前回までの間にしたことの中で思い当たることと言えば、macOSのアップデートを行ったくらいです。そういえば以前から何度かmacOSのアップデートを行った後にRailsサーバーが起動できなくなる事象に陥っていたような気がします。今後は同様の事象が出ても焦ることのないように対処法をまとめておきたいと思います。

事象:エラー内容

ターミナルでrails serverコマンドを実行し、Railsサーバーを起動しようとしたところ、以下のエラーが出て起動に失敗してしまいました(実際のエラーメッセージは流れてしまったのでネットからの拾い物)。

ERROR:  Loading command: install (LoadError)
    dlopen(/Users/user/.rbenv/versions/2.5.3/lib/ruby/2.5.0/x86_64-darwin18/openssl.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /Users/user/.rbenv/versions/2.5.3/lib/ruby/2.5.0/x86_64-darwin18/openssl.bundle
  Reason: image not found - /Users/user/.rbenv/versions/2.5.3/lib/ruby/2.5.0/x86_64-darwin18/openssl.bundle

OpenSSLというライブラリがロードできないようです。

OpenSSLは、SSLプロトコル・TLSプロトコルの、オープンソースで開発・提供されるソフトウェアである。中心となっているライブラリは基本的な暗号化関数と様々なユーティリティ関数を実装している。様々なコンピュータ言語でOpenSSLライブラリを利用できるようにするラッパーもある。 ウィキペディア

原因

macOSでは、macOS High SierraからデフォルトのOpenSSLとして(OpenSSLではなく)OpenSSLを元にして作られているLibreSSLというライブラリを使用しています。OpenSSLは致命的な欠陥があるらしく、LibreSSLのほうが優れているとのことです。

LibreSSLは、TLS/SSLプロトコルのオープンソースによる実装である。TLSの実装にOpenSSLを利用していたOpenBSDの開発者が、2014年4月に明らかとなったOpenSSLのハートブリード脆弱性を受けて独自にフォークしたものである。 ウィキペディア

ターミナルで以下のコマンドを実行すると、デフォルトのOpenSSLが確認できます。

$ openssl version
LibreSSL 2.8.3

一方、Rubyで使用しているOpenSSLはOpenSSLです(Rubyに限らず様々なツールがOpenSSLに依存しているようです)。

おそらく、macOSをアップデートしたことにより、デフォルトのOpenSSLがOpenSSLからLibreSSLに変更され(あるいは戻され)、OpenSSLに依存しているツール(今回はRuby=Ruby on Rails)が動かなくなってしまったのだと思われます。

対処

方法①:Rubyの再インストール

Rubyの再インストールを行うことでOpenSSLの設定を再構成します。

# インストール済みのRubyバージョンを確認
$ rbenv versions
  system
* 2.6.3 (set by /Users/user/Products/app/.ruby-version)

# Rubyをアンインストール
$ rbenv uninstall 2.6.3

# Rubyをインストール
$ rbenv install 2.6.3

# システム全体で使うRubyバージョンを設定
$ rbenv global 2.6.3

Rubyの再インストールを行ったらBundlerをインストールします。

# Bundlerのインストール
$ gem install bundler

# GemfileのGemをインストール
$ bundle install

なお、bundle installコマンドに失敗する場合は以下の記事を参照してください。

方法②:macOSのOpenSSLを変更(未検証)

OpenSSLをインストールしていない場合は、以下のコマンドを実行してインストールします。

# HomebrewでOpenSSLをインストール
$ brew install openssl

# インストールしたOpenSSLの確認
$ brew info openssl
openssl@3: stable 3.0.0 (bottled) [keg-only]
Cryptography and SSL/TLS Toolkit
https://openssl.org/
...
==> Analytics
install: 66,090 (30 days), 66,103 (90 days), 66,109 (365 days)
install-on-request: 53,207 (30 days), 53,220 (90 days), 53,226 (365 days)
build-error: 0 (30 days)

macOSのOpenSSLをインストールしたOpenSSLを使用するように変更します。

# .bash_profiileに設定を追加
$ echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

# .bash_profileを反映
$ source ~/.bash_profile

これでmacOSでもLibreSSLではなくOpenSSLを使用するようになりました。

$ openssl version
OpenSSL 3.0.0  14 Oct 2021

まとめ

事象が発生しているツールがRuby(Ruby on Rails)だけの場合は方法①を行うだけで十分です。もしOpenSSLに依存しているツールが複数ある場合は方法②を行ってシステム設定から変更してしまったほうが楽だと思います。

本記事を参考にしていただければと思います。

関連記事

【Rails】Paranoiaを使用した論理削除(ソフトデリート)
# はじめに Paranoiaは、Railsアプリケーションで論理削除(ソフトデリート)を実現するためのGemです。 論理削除は、データベースのレコードを物理的に削除するのではなく、削除フラグを設定することで「削除済み」とみなす方法です。こ [...]
2024年7月20日 21:33
【Rails】activerecord-multi-tenantを使用したマルチテナントアプリケーションの作成
# はじめに マルチテナントアプリケーションでは、複数の顧客(テナント)が同じアプリケーションを利用するため、データの分離が必要です。 activerecord-multi-tenantは、このようなマルチテナント環境をサポートするための便 [...]
2024年7月18日 16:50
【Rails】RubyとRailsにおけるattr_reader, attr_writer, attr_accessorの概念と使用方法
# はじめに RubyとRailsの開発において、`attr_reader`,`attr_writer`,`attr_accessor`は非常に便利なメソッドです。これらは、クラス内でインスタンス変数に対するゲッターおよびセッターメソッドを簡単に [...]
2024年7月17日 18:11
【Rails】RubyとRailsにおけるyieldの概念と使用方法
# はじめに RubyとRailsにおける`yield`は、メソッドやテンプレートの中で動的にコードブロックを実行する能力を提供し、これによってコードの再利用性と拡張性が大幅に向上します。本記事では、RubyとRailsにおける`yield`の概 [...]
2024年7月17日 13:15
【Rails】AASMを使用してオブジェクトの状態遷移を効率的に管理
# はじめに Railsアプリケーションにおいて、オブジェクトの状態管理は重要な課題の一つです。AASM (Acts As State Machine) gemは、複雑な状態遷移を効率的に管理します。本記事では、AASMの基本的な使い方を解説して [...]
2024年7月16日 18:00
【Rails】RSpec + Swagger + rswagでアプリケーションのAPIをテストおよびドキュメント化する方法
# はじめに Railsアプリケーションの開発において、APIのテストとドキュメント化は重要な要素です。 RSpecはテストフレームワークとして広く利用されており、SwaggerはAPIの設計とドキュメント化を支援します。これらを統合するr [...]
2024年7月16日 14:27
【Rails】mailcatcherを使用して開発環境でメール送信をテストする方法
# はじめに mailcatcherは、開発環境でのメール送信をキャプチャするためのツールです。ローカルで送信されたメールをブラウザ上で簡単に確認できるようにします。mailcatcherをRailsアプリケーションで使用する方法について説明しま [...]
2024年7月15日 16:37
【Rails】impressionistを使用してページビューやクリック数を追跡する方法
# はじめに impressionist Gemを使用してRailsアプリケーションでページビューやクリック数を追跡する方法について説明します。 # 実装方法 ## impressionist Gemのインストール まず、impre [...]
2024年7月15日 14:18