2020年8月24日月曜日

Ruby 標準の Web サーバ Webrick を使ってサーバを構築してみる

概要

開発などでは大抵の場合 Rails や Sinatra などのフレームワークを使います
ただベースになっている技術は Ruby に標準で実装されている Webrick を使っている場合がほとんどです
今回は Webrick の学習も含めて Webrick だけを使ってサーバを構築してみました

環境

  • macOS 10.15.6
  • Ruby 2.7.1p83

とりあえずサーバを立ててみる

まずはサーバを立ててみましょう
単純な Web サーバでカレントにあるファイルを配信するだけですが以下でサーバが作れます

  • vim app.rb
require 'webrick'
srv = WEBrick::HTTPServer.new({
                                :DocumentRoot => './',
                                :BindAddress => '127.0.0.1',
                                :Port => 20080
                              })
trap("INT"){ srv.shutdown }
srv.start
  • ruby app.rb

trap("INT"){ srv.shutdown } をしないと Ctrl+c で停止できないので記載しましょう
これで localhost:20080 にアクセスすれば以下のようにファイルインデックスが確認できます

Index files を見せない

公開するサーバはセキュリティ的にもファイルインデックスをオフにする場合が多いです
Webrick の場合は以下のようにします

  • vim app.rb
require 'webrick'
srv = WEBrick::HTTPServer.new({
                                :DocumentRoot => './',
                                :BindAddress => '127.0.0.1',
                                :Port => 20080
})
srv.mount('/', WEBrick::HTTPServlet::FileHandler, Dir.pwd, { :FancyIndexing => false })
trap("INT"){ srv.shutdown }
srv.start

これで 403 が表示されるようになります

cgi を使う

CGI を使って ruby のスクリプトの結果を返すこともできます
WEBrick::HTTPServlet::CGIHandler を使います
また Ruby スクリプト内で cgi を使うようにしましょう

  • vim view.rb
#!/usr/local/opt/ruby/bin/ruby
require 'cgi'

cgi = CGI.new
html = <<-EOF
<html>
<head>
<title>cgi test</title>
</head>
<body>
<h1>Hello</h1>
</body>
</html>
EOF
puts cgi.header
puts html
  • chmod 755 view.rb

またシェバングと権限の変更を忘れないように行いましょう

  • vim app.rb
require 'webrick'
srv = WEBrick::HTTPServer.new({
                                :DocumentRoot => './',
                                :BindAddress => '127.0.0.1',
                                :Port => 20080
})
srv.mount('/view.cgi', WEBrick::HTTPServlet::CGIHandler, 'view.rb')
trap("INT"){ srv.shutdown }
srv.start

これで localhost:20080/view.cgi を確認すると「hello」が返ってくることが確認できると思います

HTML を表示する

単純に HTML を表示することもできます

  • vim test.html
<html>
<head>
<title>test html</title>
</head>
<body>
<h1>Test html</h1>
</body>
</html>
  • vim app.rb
require 'webrick'
srv = WEBrick::HTTPServer.new({
                                :DocumentRoot => './',
                                :BindAddress => '127.0.0.1',
                                :Port => 20080
})
srv.mount('/hoge.html', WEBrick::HTTPServlet::FileHandler, 'test.html')
trap("INT"){ srv.shutdown }
srv.start

http://localhost:20080/hoge.html にアクセスすると test.html の内容が表示されるのが確認できると思います

最後に

素の Webrick を使ってみました
最低限の Web サーバを構築するための機能が実装されているのでこれらを使ってフレームワークなどが作られている感じかなと思います

参考サイト

0 件のコメント:

コメントを投稿