はじめに
久しぶりに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に依存しているツールが複数ある場合は方法②を行ってシステム設定から変更してしまったほうが楽だと思います。
本記事を参考にしていただければと思います。