
(マニュアル等はこちら)
「簡単」「軽量」「高速」なWebサーバー
BayServerは、横浜ベイキットが開発・公開している、オープンソースのWebサーバーです。
Version 1 では「XMLアプリケーションが簡単に開発できる」を売りにしていましたが、Version 2 では「簡単」「軽量」「高速」なWebサーバーとしてゼロから開発されました。
Version 3では、大幅なリファクタリングを行い、I/O多重化の選択肢を増やしました。
特徴1:簡単
ApacheやNginxは自由度が高い分設定がとても複雑です。「ちょっとSSLを試したいだけなのに設定に1日かかってしまった」なんて経験をした方も多いのではないでしょうか。
必要な設定をするのに試行錯誤を繰り返し、労力をかけることは、本質的でないことに時間を費やすことになり時間の無駄です。
BayServerでは「設定が簡単」というのを1つの目標にしています。設定ファイルは Windows の ini ファイルのように簡単で、Pythonのように直感的なフォーマットです。
そして、横浜ベイキットのスローガンでもある「ソフトウェアを楽しく使う」という部分も忘れていません。
BayServerを設定は自分の「港」を設計する感覚で行います。誰が港に入れるのか、誰をどこに連れていくのか、そう言ったことを設定します。
なので、簡単で楽しく使えるのです。
特徴2:軽量
昨今、ソフトウェアはパッケージ管理ツールを用いて簡単にインストールできるようになりました。aptやyum、dnfなどをはじめ、各種プログラミング言語でも mavenやgem、pip など様々です。
このこと自体はとても便利ではあるのですが、根本的な問題として、「あるパッケージがほかのパッケージに依存している」という状態は、予期せぬ不具合が発生するリスクを多大に秘めていることになります。
「あるパッケージをバージョンアップしたらこのパッケージが動かなくなった」「2つのパッケージが同じパッケージに依存しているのにバージョンが異なる」なんて経験をしている方も多いでしょう。
また、多くのパッケージを使用して1つのソフトウェアを作るということは、それだけ多くのプログラムを実行時に読み込むことになり、動作も重くなります。
BayServerは、標準APIのみを使用して開発されているため、他のどのパッケージも必要せず単体で動作します。つまり、「パッケージの依存性の問題で動かない」なんてことは起きません。動作環境が満たされていればインストールしてすぐに動かすことができます。
(ただし、一部HTTP/3の機能については、外部のライブラリを利用しています)
特徴3:高速
BayServerは、CPUの限界を最大限に引き出すように設計されており、高速に動作します。というか爆速ですw
特にリバースプロキシサーバーとして使用した場合に最大限のパフォーマンスを引き出すことができます。
Webサーバーの最大のボトルネックは通信、すなわちネットワークI/O待ちです。I/O待ちの間はCPUは何もすることがありませんから、言ってみれば無駄な時間になります。この無駄な時間を別の処理に割り当てれば、多くのクライアントを同時に処理することができます。
これを実現するため、多くのWebサーバーはマルチスレッドを使用しています。
ところが、大量のクライアントがアクセスすると今度はスレッドの切り替えがボトルネックになってしまいます。いわゆるC10K問題(1万クライアントの問題)です。
BayServerはクライアントの切り替えにスレッドを使用せず、ノンブロッキングAPIを使用して次のI/Oを処理します。これによりCPUは1つのスレッドで休むことなくそのときできる処理をひたすら続けることになります。CPUのコア数分のスレッドを用意すれば、そのマシンの限界まで性能を引き出せることになります。
その他の特徴
多岐にわたる実装言語
BayServerは、Java版、Ruby版、Python版、PHP版が存在します。
どの版を使用しても使い方は同じです。
また、それぞれServletコンテナ(Java版)、Rackサーバー(Ruby版)、WSGIサーバー(Python版)を内蔵しているので、既存のWebアプリケーションをBayServerに乗せ換えることも簡単にできます。
そして、それぞれの版は、それぞれのプログラミング言語で出せる性能の限界に挑戦しています。
従って「簡単」「軽量」「高速」という目標、そしてベイキットの「ソフトウェアを楽しく」という哲学の全てを、どの版を使っても享受できるのです。
多くのプロトコル
BayServerは HTTP の他、AJP(Apache JServ Protocol)やFCGI(Fast CGI)などのプロトコルもサポートします。これらのプロトコルはサーバーとしてもクライアント(プロキシとして使用した場合はクライアントとなる)としても動作します。以下、サポートしているプロトコルおよびモードの対応表です。
サーバー | クライアント | |
HTTP 1.1(Plain) | 〇 | 〇 |
HTTP 1.1 (SSL) | 〇 | 〇 |
HTTP 2(Plain) | × | × |
HTTP 2 (SSL) | 〇 | × |
HTTP3 | 〇 | × |
AJP | 〇 | 〇 |
FCGI | 〇 | 〇 |
これだけバリエーションがあるので、以下のように柔軟な構成が可能になります
- BayServerをプロキシとして、バックのTomcatと AJP でつなぐ
- BayServerをプロキシとして、バックのPHP-fpmでPHPアプリケーションを実行する
- Apacheをプロキシとして、Tomcatの代わりにバックのBayServerと AJP でつなぐ
- Nginxをプロキシとして、PHP-fpmの代わりにバックのBayServerとFCGIでつなぐ
もちろんプロトコルとアプリケーションに依存性はないので、「FCGIで受け付けてサーブレットアプリケーションを動かす」とか、「AJPで受けてRailsアプリケーションを動かす」なんてこともできます。
なお、実装言語によってもサポートされている機能が異なりますので、詳細は比較表を確認してください。