Webサーバを考える(2)(BNS 補助資料 サーバ編2)

1 Webサーバを動かす(その2)

Webrick で Webサーバ

位置付け

Webrickのリファレンス にあるプログラムを動作させてみる。

このシステムの位置付け
Webrickについて

a 準備作業の概要

作業
  1. エディタを開く
  2. 上記ページからプログラムをコピーしてエディタ画面に貼付
  3. 後述の Windows向けの変更
  4. 名前をつけて保存(場所と拡張子に注意)

b Windowsでの追加作業

shebang

手順:

  1. まず、コマンドプロンプトで、

    where ruby

    として出てきた、rubyインタプリタの場所(をフルパス名で表記したもの)を、

  2. Webサーバのコードの中の、WEBrick::HTTPServer.new に渡す オプション(Hash型; ブレース { }で囲んである)の中に、

    :CGIInterpreter => 'C:/tools/ruby27/bin/ruby.exe'
    # または
    CGIInterpreter:'C:/tools/ruby27/bin/ruby.exe'

    のように渡す。 Hashの文法

  3. また、動的コンテンツ生成の例として(CGIHandler経由で呼ばれることになるプログラム)‘view.rb’ については、 ここではこのファイルをダウンロードして、 ドキュメントルートと同じ場所に置いて)使って下さい。

c 完成例

webServer0.rb を参考にして下さい。 ただし、上記のruby.exeのパス名は、自分の環境にあったものに変えて使うこと。

d 使い方

  1. ソースファイルの準備(a 準備作業を参照)
  2. 起動
  3. アクセスする。


動作図

2 動作解説

(右図を参考に理解を試みて下さい)

. 要チェックの同音カタカナ語や同音異義語(補足)

Webサーバの動作概要

静的動的
静的コンテンツと動的コンテンツ
ルーティングについて
プログラム(再掲)
require 'webrick'
srv = WEBrick::HTTPServer.new(
   DocumentRoot:'./',  BindAddress:'127.0.0.1',
   Port:20080,    CGIInterpreter:'C:/tools/ruby27/bin/ruby.exe')
srv.mount('/view.cgi', WEBrick::HTTPServlet::CGIHandler, 'view.rb')
srv.mount('/foo.html', WEBrick::HTTPServlet::FileHandler, 'hoge.html')
trap("INT"){ srv.shutdown }
srv.start

動作解説

indexpage
アクセスしたURL 動作
http://localhost:20080/ => / に対する応答は標準のルール(ルーティング)に従い
DOCUMENTROOT/index.html (右図)
http://localhost:20080/foo.html => (ファイルハンドラーによるルーティングに従い、)
DOCUMENTROOT/hoge.html
http://localhost:20080/view.cgi => (CGIハンドラーによるルーティングに従い、)
DOCUMENTROOT/view.rb をプログラムとして実行した結果
http://localhost:20080/x.html => (それ意外の実在するファイルならば)
DOCUMENTROOT/x.html

マウント ルーティング

動作中の様子

C:\Users\nobu\Documents\class\BNS>WebServer1.rb
[2018-07-05 11:21:59] INFO  WEBrick 1.3.1
[2018-07-05 11:21:59] INFO  ruby 1.9.3 (2013-11-22) [i386-mingw32]
[2018-07-05 11:21:59] WARN  TCPServer Error: Only one usage of each socket addre
ss (protocol/network address/port) is normally permitted. - bind(2)
C:/App/Ruby193/lib/ruby/1.9.1/webrick/utils.rb:85:in `initialize': Only one usag
e of each socket address (protocol/network address/port) is normally permitted.
- bind(2) (Errno::EADDRINUSE)
        from C:/App/Ruby193/lib/ruby/1.9.1/webrick/utils.rb:85:in `new'
        from C:/App/Ruby193/lib/ruby/1.9.1/webrick/utils.rb:85:in `block in crea
te_listeners'
        from C:/App/Ruby193/lib/ruby/1.9.1/webrick/utils.rb:82:in `each'
        from C:/App/Ruby193/lib/ruby/1.9.1/webrick/utils.rb:82:in `create_listen
ers'
        from C:/App/Ruby193/lib/ruby/1.9.1/webrick/server.rb:82:in `listen'
        from C:/App/Ruby193/lib/ruby/1.9.1/webrick/server.rb:70:in `initialize'
        from C:/App/Ruby193/lib/ruby/1.9.1/webrick/httpserver.rb:45:in `initiali
ze'
        from C:/Users/nobu/Documents/class/BNS/WebServer1.rb:2:in `new'
        from C:/Users/nobu/Documents/class/BNS/WebServer1.rb:2:in `<main>'

ポート重複 このポート番号はすでに(最初に起動したWebサーバによって)掴まれているため(右図)、 後から起動したプログラムは同じポートを使用できず、異常終了する。

3 データの表現(補足)

a 文字コードとエンコーディング(概要)

b ネットワークにおける文字コード

c 補足

文字コード