動機
フレームワーク無しでもWEBRickで簡単にWebサーバが作れるというのを読んで、面白そうだったので手元で試してみます。以下、忘れないようにするための記録です。
WEBRickでWebサーバーを立ち上げる(まずはローカル専用)
WEBRickについて詳しいことはこちらを見つつ。
↑これを見ると、
WEBrick は Ruby 3.0 で標準ライブラリから削除されました。Ruby 3.0 以降で WEBrick を使いたい場合は rubygems から利用してください。
とのことなので、gem installしておきます。
$ gem install webrick
次に、適当なディレクトリを作ってファイルを作成します。
require 'webrick'
options = { BindAddress: '127.0.0.1', Port: '10080', DocumentRoot: '.' }
server = WEBRick::HTTPServer.new(options)
trap(:INT) { server.shutdown } # Signal.trap(:INT) { server.shutdown } でも同じ
server.start
Webサーバオブジェクト(つまりWEBRick::HTTPServerのインスタンス)はstartメソッドを持ち、これが最終的にWebサーバを起動させます。
Webサーバオブジェクトは、WEBRick::HTTPServer.new(options)で作成しています。
optionsとしてはとりあえずBindAddress
, Port
, DocumentRoot
の3項目を渡せば動くそうです。他の項目についてはるりまにまとまっていました。
BindAddress
に127.0.0.1
を渡せばローカル専用のWebサーバになり、0.0.0.0
を渡せばLAN内に公開されたWebサーバになります。
trap(:INT)
の行で、ctrl+c
が入力された時の動作を指定しています。ここではserver.shutdown
でサーバーを止めています。(この行を書いていないとctrl+c
で止められません。ps aux | grep webrick
でプロセスidを調べてkillするとか)
あとはこのファイルを実行すればWebサーバが立ち上がります。
$ ruby server.rb
#[2021-10-31 18:09:13] INFO WEBrick 1.7.0
#[2021-10-31 18:09:13] INFO ruby 3.0.2 (2021-07-07) [x86_64-darwin20]
#[2021-10-31 18:09:13] INFO WEBrick::HTTPServer#start: pid=23294 port=10080
curlでアクセスしてみます。
$ curl http://127.0.0.1:10080
# (以下結果)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Index of /</TITLE>
<style type="text/css">
<!--
.name, .mtime { text-align: left; }
.size { text-align: right; }
td { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; }
table { border-collapse: collapse; }
tr th { border-bottom: 2px groove; }
//-->
</style>
</HEAD>
<BODY>
<H1>Index of /</H1>
<TABLE width="100%"><THEAD><TR>
<TH class="name"><A HREF="?N=D">Name</A></TH><TH class="mtime"><A HREF="?M=D">Last modified</A></TH><TH class="size"><A HREF="?S=D">Size</A></TH>
</TR></THEAD>
<TBODY>
<TR><TD class="name"><A HREF="..">Parent Directory</A></TD><TD class="mtime">2021/10/31 18:19</TD><TD class="size">-</TD></TR>
<TR><TD class="name"><A HREF="webrick227.rb">webrick227.rb</A></TD><TD class="mtime">2021/10/31 18:19</TD><TD class="size">375</TD></TR>
</TBODY></TABLE><HR> <ADDRESS>
WEBrick/1.7.0 (Ruby/3.0.2/2021-07-07)<BR>
at 127.0.0.1:10080
</ADDRESS>
</BODY>
</HTML>
Indexページのhtmlが返ってきました!
curlで指定したのと同じurlをブラウザで開くと...あれ?
10080番ポートはブラウザで見られない
ERR_UNSAFE_PORT
と書いてあります。調べるとどうやら、ブラウザが最近10080番ポートのサイトを見られないようにしているようです。
素直に10080番を避けて、options
のPort
に指定するのを20080
とかにしてみます。
# 省略
options = { BindAddress: '127.0.0.1', Port: '20080', DocumentRoot: '.' }
# 省略
urlは http://127.0.0.1:20080 になります。
するとこんな画面になりました。
↓
options
のDocumentRoot
で指定したディレクトリにindex.html
というファイルがなければ、この画面になります。(ホームページにアクセスすると「index of/」と表示され、ファイルが一覧で表示されてしまう)
今回はDocumentRoot
にはカレントディレクトリ('.'
)を指定しているので、server.rb
と同じ階層にindex.html
を作成して中身を適当に用意してみます。
<h1>Hello World!</h1>
ブラウザでさっきと同じurl( http://127.0.0.1:20080 )にアクセスすると...
先ほどのIndex of /
という画面ではなく、index.html
の中身が表示されるようになりました!
WebサーバをLAN内に公開する
上で書いたように、options
のBindAddress
に127.0.0.1
を渡せばローカル専用のWebサーバになり、0.0.0.0
を渡せばLAN内に公開されたWebサーバになります。
(カフェなどの公共のLANに繋いでる時は危険なので試さないほうがいいと思います)
# 省略
options = { BindAddress: '0.0.0.0', Port: '20080', DocumentRoot: '.' }
server = WEBRick::HTTPServer.new(options)
# 省略
もう一度サーバを立ち上げ直します。
$ ruby server.rb
これで、同一LAN内の他のパソコンやスマホからでもアクセスできるようになっているはずです。
アクセスするには127.0.0.1
の代わりに、プライベートIPアドレスを使います。もちろんポート番号(ここでは20080
)も引き続き付ける必要があります。
urlは例えばhttp://192.168.1.21:20080
のようになるはずです。
これで、同じWi-Fiに繋いだ他の端末のブラウザにこのurlを打ち込むと、index.html
の内容が見られました。
遊びでいろいろ使えそうな感じです。
繰り返しになりますが、公共のLANに繋いでる時は試さないほうがいいと思います。