C または C++ で書かれた高性能 (理想的にはイベント対応でオープンソース) Web サーバーはありますか?
これを使用すれば、入力済みの HTTP リクエスト クラス/構造体を使用してアプリケーション内のメソッド/関数を呼び出し、入力済みの HTTP レスポンス クラス/構造体を返すことができるようになります。
オープンソースでない場合は、ロングポーリング接続やキープアライブなどの組み込みサポートが必要になりますが、そうでない場合は、自分でこれらの機能を追加できると思います。
そのようなサーバーが利用可能かどうかわからない場合は、タスクに適した独自のWebサーバーを作成することをお勧めしますか?できないファイルベースであり、高性能な C/C++ で記述する必要があります。
編集: C 用の Ruby Mongrel のようなものを考えています。参考になれば幸いです。
ベストアンサー1
私の仕事にもまったく同じ要件があったので、mongoose、libmicrohttpd、libevent など、いくつかのソリューションを評価しました。また、nginx モジュールの作成も検討していました。私の調査結果をまとめると次のようになります。
nginx
私はこのサーバーが大好きで、よく使っています。パフォーマンスとリソースの使用率は Apache よりもはるかに優れています。Apache もまだ使っていますが、nginx に移行する予定です。
- 非常に優れた調整可能なパフォーマンス。豊富な機能。移植性。
- モジュールAPIは文書化されておらず、非常に冗長なようです。こちらを参照してくださいnginx hello world モジュール例として。
- Nginx はスレッドを使用せず、複数のプロセスを使用します。これにより、モジュールの作成が難しくなり、共有メモリ用の nginx API などを学習する必要があります。
マングース
- すべてのサーバーのコードは単一の mongoose.c ファイル (約 130K) に含まれており、依存関係はありません。これは良いことです。
- 接続ごとに 1 つのスレッドなので、同時実行が必要な場合は、多数のスレッドを構成する必要があります。つまり、RAM の使用量が高くなります。あまり良くありません。
- パフォーマンスは優れていますが、例外的ではありません。
- API はシンプルですが、すべての応答 HTTP ヘッダーを自分で作成する必要があります。つまり、HTTP プロトコルを詳細に学習する必要があります。
libmicrohttpd
- 公式 GNU プロジェクト。
- 冗長な API は、nginx モジュールを書くよりもはるかに簡単ですが、扱いにくいように思えます。
- キープアライブ モードではパフォーマンスが良好です (以下のベンチマークへのリンク)。キープアライブなしではそれほど良好ではありません。
リベント
Libevent ライブラリには、evhttp と呼ばれる Web サーバーが組み込まれています。
- これはイベントベースであり、そのために libevent を使用します。
- 簡単な API。HTTP ヘッダーを自動的に構築します。
- 公式にはシングルスレッドです。これは大きな欠点です。ハッキングこれにより、evhttp の複数のインスタンスが同時に実行され、同じソケットからの接続を受け入れます。これがすべて安全で堅牢であるかどうかはわかりません。
- シングルスレッドの evhttp のパフォーマンスは驚くほど低いです。マルチスレッド ハックはより良く動作しますが、それでも良くはありません。
G-WAN
G-WANプロジェクトオープンソースではありませんが、少し説明したいと思います。
- パフォーマンスが非常に良く、メモリ使用量が少なく、実行可能ファイルは 150 KB です。
- 非常に便利な「サーブレット」の展開: .c ファイルを csp ディレクトリにコピーするだけで、実行中のサーバーが自動的にコンパイルします。コードの変更もオンザフライでコンパイルされます。
- シンプルな API。いくつかの点で制約はありますが、豊富な機能 (json、キー値ストアなど) を備えています。
- 不安定です。静的ファイルでセグメント違反が発生しました。一部のサンプル スクリプトでハングします。(クリーン インストールで発生しました。異なるバージョンのファイルを混在させたことはありません)。
-
32 ビット バイナリのみ(もうありません)。
ご覧のとおり、既存の代替品はどれも私を完全に満足させるものではありませんでした。そこで、私は独自のサーバーを開発しました。
NXウェブ
主な機能:
- 非常に優れたパフォーマンス。プロジェクト ページのベンチマークを参照してください。
- 数万件の同時リクエストに対応可能
- メモリ使用量が小さい
- 拡張性を考慮したマルチスレッドモデル
- 非常に軽量なコードベース
- シンプルなAPI
- 適切なHTTPプロトコル処理
- キープアライブ接続
- SSL サポート (GNUTLS 経由)
- HTTP プロキシ (キープアライブ接続プール付き)
- 非ブロッキング sendfile サポート (設定可能な小さなファイル メモリ キャッシュ、gzip で事前にエンコードされたファイル提供)
- 開発者向けのモジュール設計
- デーモンとして実行可能。エラー発生時に自動的に再起動する。
- オープンソース
制限事項:
-
libev ライブラリに依存します(もう依存しません) - Linuxでのみテスト済み