2008年12月20日土曜日

WEBrickでHTTPサーバーを書いてみました。

こんにちは。モリモルです。

今回はRubyに標準添付されている、WEBrickモジュールを使って、HTTPサーバーを作ってみます。

公式リファレンスでは、
「汎用HTTPサーバーフレームワーク。HTTPサーバを簡単に作ることができます。」
とのことです。

WEBrickモジュールを使うと、一般的なHTTPサーバーが提供する多くの機能を実装できますが、今回はとりあえず、静的なHTMLファイルを表示するところまでやってみます。

以下の環境で行いました。
------------------------------------------------------------
クライアント:Windows Xp /IP:192.168.207.1
サーバー:CentOS release 5 (Final)/IP:192.168.207.128/ruby 1.8.7
------------------------------------------------------------

ディレクトリ構成は次のとおり
------------------------------------------------------------
/var2
|-- www <---DocumentRoot
 |-- index.html
------------------------------------------------------------
wwwディレクトリ以下は、サーバー用スクリプトを実行するユーザーがアクセスできるように、
権限を設定してください。

スクリプトを書いてみます。
server.rb
------------------------------------------------------------

1 #!/usr/local/bin/ruby
2
3 require 'webrick'
4 include WEBrick
5
6 server = HTTPServer.new(
7 :DocumentRoot => "/var2/www",
8 :Port => 20080,
9 :BindAddress => "192.168.207.128")
10
11 trap("INT"){server.stop}
12
13 server.start

------------------------------------------------------------


では、動かしてみます。
------------------------------------------------------------
$ > chmod 744 server.rb
$ > ./server.rb &
[1] 5035
$ > ps
5035 pts/1 00:00:00 server.rb
------------------------------------------------------------
psコマンドで起動が確認できました。

では、ブラウザからIP:192.168.207.128の20080番ポートに接続してみます。



はい。繋がりません。。

iptablesのフィルタにひっかかっていました。。

20080番ポートへの接続を許可します。
------------------------------------------------------------

$ > sudo iptables -t filter -A INPUT -p tcp --dport 20080 -j ACCEPT
$ > sudo /etc/init.d/iptables save
$ > sudo service iptables restart

------------------------------------------------------------

で、
フィルタはこうなりました。
------------------------------------------------------------

$ > sudo iptables -t filter -L INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:20080

------------------------------------------------------------

再度、アクセスしてみます。



接続確認ができました!
ただ、反応が激遅いです。。VMware上で動いているサーバーからでしょうか。

今回のスクリプトでは、HTTPサーバーのログ情報は、標準エラー出力としてターミナルの画面に表示されていますので、次回は、ログをファイルに出力してみようと思います。
ではでは、