高木のブログ

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から外すことになったみたい

解決方法

任意のアプリケーションサーバー(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を起動することができた

参考


ytkg

Written by ytkg, Twitter, GitHub