【システム設計】pythonを使って楽しいウェブサーバーを構築する(1)

優れた開発者になりたい場合は、プログラミング言語、データベースとオペレーティングシステム、Webサーバー、Webフレームワークなど、日常的に使用するソフトウェアシステムの内部構造を深く理解している必要があります。さらに、これらのシステムをよりよく、より深く理解するために、最初から始めて、このシステムをレンガごとに再構築する必要があります。

Ruslanの3つのシリーズの記事では、誰もがWebサーバーをよりよく理解できるように、単純なWebサーバーを最初から作成する方法を教えてください。この記事は主にRuslanの3つの記事の翻訳であり、私自身の理解の一部です。皆様のお役に立てれば幸いです。この記事をより深く理解するために、Mr。ProtocolForest Seriesを参照してください。注文しますか?(HTTPプロトコルの概要)

Webサーバーとは

独自のWebサーバーを構築するには、最初にWebサーバーとは何かを知る必要がありますか?以下は典型的なWebサーバーです。誰もがこれを実際に使用していると思います
【システム設計】pythonを使って楽しいウェブサーバーを構築する(1)
。つまり、Webサーバーは実行中のWebサーバー(つまり、ソフトウェアの一部)であり、クライアントからの要求の送信を待機しています。要求を受信すると、応答を生成してクライアントに送り返します。クライアントとサーバーは、HTTPプロトコルを介して相互に通信します。クライアントは、ブラウザ、またはHTTPプロトコルを使用するその他のソフトウェアにすることができます。実際、この公式アカウントの記事を読むと、Webサーバーが提供するサービスを使用していることになります。

シンプルなWebサーバーの実装

商用Webサーバーは非常に複雑です。数十万行のコードがあるのが一般的ですが、数十行のコードのように非常に単純な場合もあります。信じられないかもしれませんが、Ruslan氏の最初のバージョンのWebサーバーコードを見てください。この例はPythonで書かれています。Pythonについて聞いたことがない場合でも(非常に簡単な言語です。ぜひ試してみてください)、コードとコメントから概念を理解できるはずです。

import socket
HOST, PORT = '', 8888
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print 'Serving HTTP on port %s ...' % PORT
while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(1024)    
    print request

    http_response = """\
HTTP/1.1 200 OK

Hello, World!"""
    client_connection.sendall(http_response)
    client_connection.close()

上記のコードをwebserver1.pyとして保存し、コマンドラインでこのプログラムを実行します。このような:

$ python webserver1.py
Serving HTTP on port 8888 ...

次に、WebブラウザのアドレスバーにURL:http:// localhost:8888 / hello入力し、Enterキーを押して、奇跡を目撃します。次の画像のように、ブラウザに「Hello、World!」と表示されているはずです。
【システム設計】pythonを使って楽しいウェブサーバーを構築する(1)

Webサーバーのワークフロー次に
、実際にどのように機能するかについて説明します。まず、入力したWebアドレスから始めます。これはURLと呼ばれ、これが基本構造です
【システム設計】pythonを使って楽しいウェブサーバーを構築する(1)
。URLはWebサーバーのアドレスであり、ブラウザーはこのアドレスを使用してWebサーバーを検索して接続し、上記のコンテンツを返します。ブラウザがHTTPリクエストを送信する前に、WebサーバーとのTCP接続を確立する必要があります。次に、TCP接続でHTTP要求を送信し、サーバーがHTTP応答を返すのを待ちます。ブラウザが応答を受信すると、そのコンテンツが表示されます。上記の例では、「Hello、World!」と表示されます。

HTTP要求を送信する前に、クライアントとサーバーの間にTCP接続を確立するプロセスをさらに詳しく見ていきましょう。リンクを確立するために、彼らはソケット(ソケット)を使用します。ブラウザを直接使用してリクエストを送信するのではなく、コマンドラインでtelnetを使用して、このプロセスを人為的にシミュレートします。

Webサーバーを実行しているコンピューターで、コマンドラインでtelnetセッションを確立し、ローカルドメイン名を指定し、ポート8888を使用して、Enterキーを押します。

$ telnet localhost 8888
Trying 127.0.0.1 ...
Connected to localhost.

この時点で、ローカルホストで実行されているサーバーとのTCP接続が確立されています。次の図では、サーバーが最初からTCP接続を確立できるようになるまでの基本的なプロセスを示しています。
【システム設計】pythonを使って楽しいウェブサーバーを構築する(1)
同じtelnetセッションで、GET / hello HTTP / 1.1と入力してから、次のように入力します。

$ telnet localhost 8888
Trying 127.0.0.1 ...Connected to localhost.
GET /hello HTTP/1.1

HTTP/1.1 200 OK
Hello, World!

手動でブラウザをシミュレートしました(作業)!HTTP要求を送信し、HTTP応答を受信しました。HTTPリクエストの基本構造は次のとおりです。HTTPリクエスト
【システム設計】pythonを使って楽しいウェブサーバーを構築する(1)
の最初の行は、HTTPメソッド(サーバーにコンテンツを返すためのGET)、必要なページを示すpath / hello、およびプロトコルの3つの部分で構成されます。バージョン。

簡単にするために、作成したWebサーバーは上記の要求コンテンツを完全に無視します。「GET / hello HTTP / 1.1」の代わりに役に立たないコンテンツを入力することもできますが、それでも「Hello、World!」という応答が返されます。

要求行を入力してEnterキーを押すと、クライアントは要求をサーバーに送信します。サーバーは要求行を読み取り、対応するHTTP応答を返します。

以下は、サーバーからクライアント(上記の例ではtelnet)に返される応答の内容です。
【システム設計】pythonを使って楽しいウェブサーバーを構築する(1)
この応答は、ステータス行HTTP / 1.1 200 OKとそれに続く空白行、および以下の応答本文の3つの部分で構成されます。

HTTP応答ステータス行HTTP / 1.1 200 OKには、HTTPバージョン番号、HTTPステータスコード200、およびHTTPステータスフレーズ「OK」が含まれています。ブラウザが応答を受信すると、応答の本文が表示されます。そのため、ブラウザに「Hello、World!」と表示されます。

上記は、Webサーバーの基本的な動作モデルです。要約すると、Webサーバーはリスニング状態でソケットを作成し、ループで新しい接続を受信します。クライアントが正常なTCP接続を確立すると、サーバーにHTTP要求を送信し、サーバーがHTTP応答で応答し、クライアントがHTTP応答の内容をユーザーに表示します。TCP接続を確立するために、クライアントとサーバーの両方がソケットを使用します。

Webサーバーの基本的な動作を理解したので、ブラウザーまたはその他のHTTPクライアントを試すことができます。試して観察したことがあれば、telnetを使用してHTTP要求を手動で記述し、「ヒューマノイド」HTTPクライアントになることができるはずです。

ここで、小さな質問があります。「プログラムに変更を加えずに、セットアップしたばかりのWebサーバーでDjango、Flask、またはPyramidアプリケーションをどのように適応させるのですか?」このシリーズの第2部で説明します。詳細に説明してください。

推奨読書:

入念に整理|歴史的な乾物記事カタログ
[福祉]オンラインブティックコースのビデオ共有を収集しました(上)
[システムアーキテクチャ]大規模なウェブサイトアーキテクチャの進化(上)
[システムアーキテクチャ]大規模なウェブサイトアーキテクチャの進化(下記)
[C ++ノート] C ++オブジェクトモデルのメモリレイアウト(2)
[C ++注] C ++オブジェクトモデルのメモリレイアウト(1)

サーバーのバックグラウンドテクノロジースタックの知識の概要の共有に焦点を当てる

コミュニケーションと共通の進歩に注意を払うことを歓迎します

【システム設計】pythonを使って楽しいウェブサーバーを構築する(1)

コーディング

コードファーマーには、テクノロジーを簡単にするためのわかりやすい技術記事を提供する正しい方法があります。

おすすめ

転載: blog.51cto.com/15006953/2552093