はじめに(歌詞)
約2年、私はWeb開発に従事し、PHPでサイトとWebアプリケーションを作成しました。 それはちょうどウェブ開発で、私は非常に奇妙な生活環境の組み合わせを手に入れました。 私にとって面白くないとは言わないでください-ウェブサイトがどのように作成され、インターネットが一般的にどのように機能するかを知ることは私にとって非常に面白かったです。
しかし同時に、私は常に低レベルのプログラミングに魅了されていました。 勉強中であっても、C ++プログラミング言語が本当に好きでした。 それを使用する場所は、エンターテインメント以外にはありませんでした。 それから私は下りました-私はアセンブラーを勉強しました。 プロセッサがどのように機能するのか(表面的にすぎますが)、プログラムが実際にどのように実行されるのかを理解しました。
こうした一連の知識と経験をすべて活かして、Web開発に取り組みました。 最初はすべてが非常に良いように見えましたが、思ったよりもずっとシンプルでした。 そして時間がたつにつれて、それは退屈になり、単純すぎて面白くなくなり、最適化や興味深い解決策の余地はなくなりました。 Webページを生成し、jsスクリプトを記述して接続し、cssを使用してページを配置します。 私はもはやプログラマーとして成長していないと感じました。
その時、質問が私を苦しめ始めました:
- なぜC ++(CGIではない)のような言語で高性能Webアプリケーションを作成できないのですか? 結局のところ、私はこの言語が誰よりも好きです。 C ++で書かれたサイトがあると聞いたことがありません。 なんで?
- スクリプト(解釈)プログラミング言語がWeb開発をキャプチャしたのはなぜですか?
もちろん、インタープリター言語では、すべてが明確です。 彼らは非常に便利です-変更を加えた後にプロジェクト全体を再構築する必要はありません。 この場合、Webアプリケーションを再起動(停止)せずに、すべての変更がその場で適用されます。
最初の質問-C ++でサイトを書く方法-の答えを探していました。 インターネット上では、このトピックに関して賢明なものは見つかりませんでした(CGIを介してのみ)。 そして恐ろしい:どのように? 開発ツールを自由に選択したいので、好きな言語を使いたいです。 そして今のところ誰も何もしていませんか? またはしましたが、自宅でのみ使用しますか?
これにより、Webアプリケーション(サイト)がライブラリ(* .so、* .dll)として接続する独自のWebサーバーの開発を開始しました。
(開発中に、HTTPプロトコルを正しく使用する方法を認識し、理解しました。RESTfulとは何かを学びました。Webアプリケーションのアーキテクチャを正しく構築する方法を学びました。 。
エッセンス
自分のWebサーバー(最も
ファッショナブルな新しい標準のC ++で記述)で作業する1年間、私はすべての基本的な必要な機能を実装することができました。
- ファイルの送信(X-Sendfileヘッダーの設定による);
- アプリケーションHTMLページによって生成された送信。
- 部分的なGETリクエストの理解と処理。
- さまざまなフォーム(application / x-www-form-urlencoded、multipart / form-data)のフォーム(ファイルおよびテキスト)からデータを受信し、完成したフォームでアプリケーションに転送します。
- キープアライブ接続のサポート。
- アップグレード接続(WebSocket)のサポート。
サポートされるオペレーティングシステム:Linux、Windows
Webサーバーの仕組み
起動時のWebサーバーは、構成ファイルで指定されたライブラリをそれ自体に接続します。 例:
server { listen 2280; server_name servertest www.servertest; server_module /media/projects/sites/servertest/module/servertest_release.so; server_module_update /media/projects/httpserverapp/httpserverapp/bin/Release/libhttpserverapp.so; root_dir /media/projects/sites/servertest/www/; request_max_size 10485760; }
どこで
- listen-アプリケーションへのリクエストを受信するためのポート。
- server_name-Webアプリケーション(サイト)の名前。
- server_module-Webアプリケーションの機能を実装するライブラリへのパス。
- server_module_update-新しいバージョンのWebアプリケーションライブラリへのパス。Webサーバー自体を再起動せずにWebアプリケーションを更新するために使用されます(ほぼオンザフライ)。
- root_dir-サイトファイル(Webアプリケーション)のルートディレクトリ。
- request_max_size-リクエストデータの最大サイズ(バイト単位)。リクエストのデータサイズが大きい場合、リクエストは無視されます。
ライブラリをWebアプリケーションに接続するとき、ライブラリ内の関数を検索します。
- application_call-各リクエストを処理するために呼び出される関数。
- application_clear-この関数は、WebアプリケーションからWebサーバーに送信されるヘッダーに割り当てられたメモリを解放するために呼び出されます。
- application_init-ライブラリが正常にロードされると、関数が実行されます、[オプション];
- application_final-Webサーバーのシャットダウン時に実行されます、[オプション];
説明は、application_callがWebアプリケーションの主要な機能であるエントリポイントであることを示しています。 すべてのヘッダー(個別に逆アセンブル)、リクエストデータ(URI-リソース識別子(クエリ文字列)、アセンブルされていない形式のリクエストパラメーター "?Var1 = sample&var2 = 1000")、ファイルリンク(転送される場合)、Webアプリケーションデータ(ルートディレクトリ)。 各リクエストは、個別のスレッドで処理および実行されます。
特殊な点は、クライアントソケットも送信されることであり、これを使用して直接作業する(必要とする)ことができます。
Webサーバーの開発に関する主要な作業は完了したと言えます。 開発者は、任意のプログラミング言語で独自のWebアプリケーションを作成できます。そのコンパイラーを使用すると、プロジェクトをライブラリーの形式でアセンブルできます。 たとえば、CおよびC ++。
もちろん、そのようなWebサーバー(プログラム)を実行し、Webアプリケーションの速度を楽しむには、独自のサーバー(コンピューター)が必要です。 データベースを使用すると、アプリケーションのパフォーマンスが劇的に低下することを覚えておいてください。 しかし、コンパイルされた言語の使用を完全に放棄するほどではありません。
試してみませんか?
Webサーバーのソースコードと
サンプルアプリケーションが添付されています(IDEで使用-Monodevelop)。
WebサーバーはAGPLの下でライセンスされています。
次は?
Webサーバーは動作しますが、まだやるべきことがあります(いくつかの機能のコードを順番に持ってきて、コードにコメントを書きます)。
さらに、Webアプリケーションの構造をより詳細に分析して説明し、興味のある人のために開発を開始する場所を説明したいと思います。
現在、Webサーバー用のC ++ Webアプリケーションの開発に便利なフレームワークを作成しています(まだ利用できません)。 まったく同じフレームワークで、ある会社のウェブサイトを開発しています。 通常のサイト-注目すべき点はありませんが、最適化されています。 DBMS MariaDBを使用します。