Ruby 3系 で Sinatra を使う時は WEBrick が標準ライブラリから削除されたので、別でアプリケーションサーバーを入れる必要がある
2022/03/13
タイトル通り
問題
SinatraアプリのRubyバージョンを2.7系から3.1系に上げようとしたら起動しなくなった
$ bundle exec ruby app.rb
/usr/local/bundle/gems/rack-2.2.3/lib/rack/handler.rb:45:in `pick': Couldn't find handler for: thin, puma, reel, HTTP, webrick. (LoadError)
from /usr/local/bundle/gems/sinatra-2.2.0/lib/sinatra/base.rb:1503:in `run!'
from /usr/local/bundle/gems/sinatra-contrib-2.2.0/lib/sinatra/reloader.rb:260:in `run!'
from /usr/local/bundle/gems/sinatra-2.2.0/lib/sinatra/main.rb:45:in `block in <module:Sinatra>'
原因
Sinatraは入っているアプリケーションサーバーを見つけて起動してくれる仕組みで、今までは標準で入っていたWEBrickを使っていた
ところが、Ruby 3.0からWEBrickが標準ライブラリから削除されたので、アプリケーションサーバーが見つからず起動に失敗していた模様
標準ライブラリから削除された理由はWEBrickにはいくつかの脆弱性の問題があり、これらをRubyコアチームでサポートをしていくのは難しいのでRubyから外すことになったみたい
- Ruby master - Feature #17303: Remove webrick from stdlib
- CVE-2020-25613: Potential HTTP Request Smuggling Vulnerability in WEBrick
解決方法
任意のアプリケーションサーバー(thin, puma, reel, HTTP, webrickなど)を入れてあげる
自分は推奨されているpumaを使うことにした
Gemfile
gem 'sinatra'
+gem 'puma'
$ bundle exec ruby app.rb
== Sinatra (v2.2.0) has taken the stage on 4567 for development with backup from Puma
Puma starting in single mode...
* Puma version: 5.6.2 (ruby 3.1.1-p18) ("Birdie's Version")
* Min threads: 0
* Max threads: 5
* Environment: development
* PID: 9
* Listening on http://127.0.0.1:4567
Use Ctrl-C to stop
無事、Ruby 3系でもSinatraを起動することができた