とりあえず設定項目の一覧が欲しいという人はこちら

Webサーバー設定の難しさ

Webサーバーというのはとても複雑です。ブラウザからは特定のパスに存在する(であろう)ファイルをリクエストするわけですが、そこには必ずしも物理的なHTMLファイルが存在するわけではなく、実体がないのにあたかもそこにHTMLファイルが存在しているかのように見せている場合がほとんどです。

つまるところ、Webサーバーの主な設定の1つは「何がリクエストされたとき何を返すか」になるわけです。

また、セキュリティの設定や、プロトコル、メモリの使用量の設定なども必要です。

こういった複雑な設定を正確に行ったり、逆に人が設定した内容を見て正確に内容を把握したりすることってメッチャ難しいと思うのですがどう思いますか?

実はBayServer開発者は、Tomcatをhttpsでアクセスできるように設定するのに丸一日かかってしまったこともあります。MySQLを使ったPHPアプリケーションをApacheで動かすのに何日もかけて結局動かなかったこともあります。まあこれはMySQLを一般ユーザーで動かすという特殊な環境だったこともありますがw

こう言った苦い経験から、Webサーバーの設定は誰でも簡単に行えるものであって欲しいと、BayServer開発者は切に願っていたのでした。

BayServerの世界観

設定を簡単にするため、BayServerは他のWebサーバーにはない独自の世界観を持っています。この世界観を理解することで、Webサーバーの設定はとても簡単になります。従ってまずはBayServerの世界観に慣れることから始めましょう。

こちらの絵を見ながら読んでみてください。

まず、あなたは、とある港湾都市の設計者です。

海外からたくさんの船が到着し、その乗客たちを正しい場所へ案内するために必要な港湾都市の設計を任されたというわけです。

船は何隻停泊できますか?観光客を案内するためのタクシーは何台準備しますか?中には悪い船もいます。国籍を偽って密入国を試みる者もいます。こういった者たちをどうやって防ぎますか?

あなたはとても責任重大な任務を任されてしまいました笑

ドッカーという概念

ドッカー(docker)とは、港湾従事者という意味ですが、BayServerでは様々な種類のドッカーがそれぞれの任務を着実にこなしてくれることで、あなたの港湾の安全は維持されます。

紛らわしいですが、仮想コンテナのDockerは全く関係ないのでここでは忘れてください笑

では、BayServerにはどんなドッカーがいるんでしょうか。以下にそれを示します。

Harborドッカー港湾全体に関する取りまとめをするドッカー
Portドッカー到着した船舶を留めたり管理するためのドッカー
Secureドッカー通信を暗号化したり解読するためのドッカー
Permissionドッカー入国審査を行うドッカー
Logドッカー入国の記録を行うドッカー
Rerouteドッカー行先を変更するドッカー
Cityドッカーcity(都市)を管理するドッカー
Townドッカーcityの中のtown(町)を管理するドッカー
Clubドッカー(何をしたいかという)ツアーの目的を管理。いわゆる「倶楽部」やお店としての「club」を提供するドッカー
Troubleドッカー問題が起きた時に別の方法で対処してくれるドッカー

えっと、分かりづらいですか?それは一般のWebサーバーに毒されてしまった証拠です笑

そのような方のために、こちらの表のに実際の動作を示します。

Harborドッカータイムアウトやスレッド数などWebサーバー全体の設定
PortドッカーいわゆるTCPやUDPのポート。どのポートがどのプロトコルで待ち受けるかなど設定する
SecureドッカーSSLによる暗号化を行うための設定をする
PermissionドッカーIPやホスト名によるアクセス制限やBasic認証によるユーザー認証を設定する
Logドッカーいわゆるアクセスログ
RerouteドッカーURL Rewriting
Cityドッカー仮想ホストごとの設定
Townドッカー仮想ホスト内の特定のパスに関する設定
Clubドッカー拡張子ごとの設定
TroubleドッカーHTTPエラーが起きた時に決まった処理を行うための設定

どうでしょうか。こちらの表の方がよっぽど何やってるのか分からないと思いませんか?笑

試しにIT系じゃないお友達に2つの表を見せてどっちが分かりやすいか聞いてみてくださいw

他にもBayServerには船舶(Ship)、代理人(Agent)、列車(Train)、タクシー(Taxi)、ツアー(Tour)など港湾都市に関連した概念がいくつか出てきますが、それらは出てきたときに都度解説します。

ちなみにソースコードレベルで言うと、ヨット(Yacht)、ボート(Boat)、荷物運搬人(Transporter)、お店(Store)とかも出てきますので、頭を柔らかくしないと読むのは辛いかもしれませんね笑

設計ファイルの場所

設定ファイルはつまり、港湾の設計書に他ならないので、BayServerでは「設定ファイル」ではなく「設計ファイル(Planファイル)」と呼ぶことを推奨しています。デフォルトの設計ファイルはBayServerをインストールした場所のplanディレクトリにある「bayserver.plan」というファイルですが、起動時の「-plan」オプションで変更することも可能です。

設計ファイルの形式

設計ファイルはWindowsのiniファイル形式に似たシンプルな形式で、ドッカーごとにブロックを設置していきます。ちょっと例を見てみましょう

[harbor]
    charset UTF-8
    timeout 30

[port 2020]
    timeout 10

[city www.baykit.yokohama]
    [town /]
       location www/root
       index    index.php
       [club *.php]
            docker php

    [log log/access.log]
        format %h %l %u %t "%r" %>s %b

例えば

[harbor]

という記述は「こっから harborドッカーに関する設定が始まります」ってことです。ドッカーごとの各設定項目は空白でインデントを下げて1行ずつにまとめていきます。インデントの数はいくつでも良いですが、そのドッカーの中では揃っていないとだめです。(それ、Pythonじゃんw)

ちなみに、「全角空白」や「タブ」だけは絶対に使わないよう注意してください。BayServerはこれを空白と認識しません。

で、設定項目(パラメータ)は「名前 値」のように空白で区切って設定します。

[harbor]
    charset UTF-8
    timeout 30

これは、「charset」という設定項目の値が「UTF-8」であること、「timeout」という設定項目の値が「30」であることを意味します。

よく「名前=値」っていう感じで記述するフォーマット見ますけど「=」って意味あるんですかね?Shiftキー押さないといけないから面倒くさいっすよね笑

あと「名前」んとこの大文字小文字は区別しません。つまり「charset」でも「CharSet」でも「ChArSeT」でもよいです。

そしてインデントが元の位置に戻るところまでがこのドッカーの設定ということになります。XMLみたいに閉じタグとかないし、中カッコで囲むとかもないです。Pythonなので笑

ドッカーには同じタイプのものが複数存在する場合がありますので、そういうものは識別できるものを後ろにくっつけます。

[port 2020]

これは2020番ポートを開けるということなんですが、ポートは複数開けることがあるので、こうやってポート番号を使ってportドッカーを識別していきます。

ドッカーはネストした構成をとるものもあります。その場合もインデントは揃えるようにしてください。

[city www.baykit.yokohama]
    [town /]
       location www/root
       index    index.php

なお、「#」で始まる行はコメントとして認識されます。また、空白文字だけの行は何もなかったとみなされ無視されます。

[city www.baykit.yokohama]   
# この行はコメント
    [town /]
         # この行もコメント

港湾の全体的な設計(Harborドッカー)

港湾全体に関する設計はharborドッカーで行います。設定できる項目はリファレンスを参照してもらうとして、ここでは最低限知っておいた方がよい設定項目を解説します。

[harbor]
    charset UTF-8
    maxShips 1024
    logLevel info
    multiCore on
    grandAgents 4
    traceHeader on

charset

charsetの指定はOSファイルを送信する場合に関係します。送信するファイルのcontent-typeがtextなんちゃらの場合、ここに指定したcharsetをcontent-typeに追加して送信します。(ファイルの中身を変換するわけではないことに気を付けてください)

charsetの指定がないと、日本語のテキストファイルは文字化けしてしまいますので必ず指定してください。

maxShips

この港湾に停泊できる最大の船舶数を指定します。「船舶」とは物理的なTCP接続のことです。

maxShipsで指定した数以上の船舶が到着した場合は、その船は洋上で空くのを待たされることになります。

デフォルトは1024ですが、BayServerはC10K対応を考えて作られており、OSが許すなら大きな値を指定しても問題ないはずです。

logLevel

logLevelはBayServerが吐き出すメッセージのログレベルです。ログレベルは「fatal」「debug」「warn」「info」「debug」「trace」があり、デフォルトは「info」で最低限必要なものしか出ません。「debug」や「trace」にすると大量のメッセージが出るので注意してください笑。これらはバグ報告する際に必要になるかもです。

multiCore

multiCoreは、マルチコアで動かすかシングルコアで動かすかを指定します。デフォルトは「on」で、通常はマルチコアで動かすので指定しなくてよいですが、あえてシングルコアで動かしたい場合は「off」を指定します。Windows上でRuby/Python版BayServerを動かす場合、マルチコアで動かせないので強制的にシングルコアモードになります。

ここで、multiCoreパラメータのように真偽値のパラメータは「on」の代わりに「true」「1」「yes」なども指定可能です。また「off」の代わりに「false」「0」「no」も指定可能です。

grandAgents

grandAgentsは、グランドエージェントの数を指定します。グランドエージェントとは、到着した船を管理し、その乗客を適切な場所に連れていく人で、BayServerの中で最も重要で最もよく働く人です。

デフォルトは4です。CPUのコア数より多い値にしてもあまり意味がないかと思います。

traceHeader

デバッグ用にヘッダやCGI環境変数を出力したい場合は「on」にします。アプリケーション開発時のデバッグに便利です。

Portドッカーの設定

次に港湾への入り口となるportドッカーの設計をします。

港湾には様々な種類の船がやって来ますが、種類ごとに入れるportを決めます。例えば

  • 観光客を乗せた一般客船は横浜港に停泊させよう
  • セキュリティチェックに対応した船は軍隊のある横須賀港に停泊させよう

という感じです。

これを設計ファイルで表現すると次のようになります。

# 横浜港
[port 2020]


# 横須賀港
[port 2024]
    [secure]
        cert cert/oreore.crt
        key  cert/oreore.key

最初の行は「2020番ポートで開くportドッカーを宣言します」という意味です。

横須賀港の方は2024番ポートで開く、と宣言しています。

httpsにしたい場合はsecureドッカーを使用しますが、詳しいことはこちらのページを参照してください。

BayServerでは以下の4種類のPortドッカーを用意しています。これらはプロトコルの差異によるものです。

Port Docker名設定値機能
HTTPドッカーhttpHTTP/1またはHTTP/2で待ち受ける(デフォルト)
AJPドッカーajpAJP(Apache JServ Protocol)で待ち受ける
FCGIドッカーfcgiFCGI(Fast CGI)で待ち受ける
HTTP/3ドッカーh3HTTP/3で待ち受ける(Java版、Python版のみ)

デフォルトでないPortドッカーを使用するには以下のように指定します。

[port 2025]
    docker ajp

上記のようにすると、2025番ポートでAJPを待ち受けることができます。

このように、dockerパラメータを指定することで、使用するドッカーをデフォルト値から変更することができます。

Cityドッカーの設計

さて、港(port)に船舶が入ってきました。

そこから乗客が下りてくるわけですが、その乗客はどこの都市に行きたいのでしょうか?

 横浜? 鎌倉? 小田原?

そう、その行きたい場所を定義するのがcityドッカーです。

HTTPの場合、乗客が行きたい都市はこんな感じでhostヘッダに書かれています。

Host: kamakura.baykit.jp

そう、Cityとは「仮想ホスト」のことですw 

1つのマシンに複数のホスト名が割り当てられている場合、どの名前でアクセスしてきたかをこのヘッダで判別してるんです。

cityドッカーの定義は次のように始まります

[city kamakura.baykit.jp]

ちなみに、次のようにすると、どこにも当てはまらなかったのcityに関する設計が可能です。

[city *]

Townドッカーの設計

観光客が行きたい場所は鎌倉だということが分かりました。さて鎌倉と言っても広いですし、鎌倉の中のどこに行きたいのでしょうか?

その行きたい場所を決めるのがtownドッカーです。

住所「鎌倉市雪ノ下2丁目」の「雪ノ下」の部分ですね。(ちなみにここには鶴岡八幡宮がある)

URLで言うと、例えば「http://kamakura.baykit.jp/yukinoshita/2nd/」の「/yukinoshita」の部分になります。

[city kamakura.baykit.jp]
    [town /yukinoshita]
        location /home/user1/app1/
        welcome  index.html

ここでは、「/yukinoshita/」に続くパスへのリクエストは、このtownへ行きたいんだということになります。

location

locationはそのtownがOS上のどのディレクトリに対応するかを指定します。プロキシなど、別のサーバーへ転送する場合は指定しなくても構いません。

welcome

パスが「/」で終わっている、つまりファイル名が指定されなかった場合に読み込まれるデフォルトのファイルを指定します。

さて、以下の記述を追加すると、すべての町へのアクセスがこのtownドッカーを使用します。

     [town /]
          location  .....

また、1つのcityの中で、複数のtownドッカーを指定できます。

[city kamakura.baykit.jp]
     [town /]
        location ....
    [town /yukinoshita]
        location ...
    [town /yukinoshita/2nd]
        location ...

複数のtownドッカーを定義した場合、長いものから順にマッチするかチェックされます。この場合、”/yuikinoshita/2nd/1ban” は最後のtown、”/yukinoshita/3rd” は二番目のtown、”/yuigahama” は最初のtown にマッチします。

Clubドッカーの設計

さて、観光客はCityやTownなどの観光地に行って何をするのでしょうか?

ある人はシネマクラブで映画を見たり、ナイトクラブで踊ったりとインドアな遊びをするかもしれません。

またある人はゴルフクラブでゴルフを楽しんだり、テニスクラブでテニスを楽しんだりとスポーツをすることでしょう。

このように、観光地で何をするのかを決めるのが「Clubドッカー」です。「こういった観光客はこういったClubを楽しむ」っていうことを設計するわけですね。

これをWebサーバのコンテキストで当てはめて言うと、「①拡張子がphpのURLはPHPアプリケーションを起動」とか、「②ここの以下のパスは全部プロキシで他のサイトのコンテンツを表示」となります。

例えば①の場合は以下のように設計します。

    [town /app]
        location /home/user1/app
        [club *.php]
            docker phpCgi

ここで言う[club *.php]が、拡張子がphpのファイル、「docker phpCgi」がPHPを起動、ということになります。つまり、「/app/hogehoge.php」というファイルのリクエストで「/home/user1/app/hogehoge.php」というPHPファイルが実行されることになります。

②の場合は以下のように設計します。

    [town /examples/]
        [club *]
            docker httpWarp
            destCity localhost
            destPort 8080
            destTown /examples/

ここで言う[club *]が、任意のファイル、「docker httpWarp」がHTTP Warpドッカー、すなわちHTTP経由で他のサイトのコンテンツを取ってくる設計になります。

ClubドッカーはTownドッカーの下に配置もできますし、Cityドッカーの下にも配置できます。Cityドッカーの下に配置した場合は全てのTownで有効になります。

BayServerで用意されているClubドッカーは以下になります。

Club Docker名設定値機能
Fileドッカーfileファイルを送信(デフォルト)
CGIドッカーcgiCGIプログラムを起動
PHPドッカー(CGI Mode)phpCgiPHPプログラムを起動
ServletドッカーservletServletアプリケーションを起動(Java版のみ)
TerminalドッカーterminalRailsなどのRackアプリケーションを起動(Ruby版のみ)
BanjoドッカーbanjoDjangoなどのWSGIアプリケーションを起動(Python版のみ)
HTTP WarpドッカーhttpWarpプロキシ機能を提供(HTTPを使用)
AJP WarpドッカーajpWarpプロキシ機能を提供(AJPを使用)
FCGI WapドッカーfcgiWapプロキシ機能を提供(FCGIを使用)

それぞれの詳細はリファレンスを参照してください。

このように、BayServerの設計は、Harbor、Port、City、Town、Clubが最低限の骨組みとなります。

Twitterでフォローしよう

おすすめの記事