2009-05-16 19 views
8

ここでいくつかの検索を行った後、Webサーバーの開発に関する質問はありません。Webサーバー開発のヒント

私は主に2つの理由でこれを行うつもりです。サーバープログラムの開発について詳しく学ぶ。これは、利用可能なアプリケーションに変わりはありません。学習ツールの多く

質問は簡単です。

  • Webサーバーを開発しましたか? (関係なくどのような言語)
  • 落とし穴やその他の良いヒントは何ですかあなたが供給できる便利サイトへ

リンクは歓迎されているが、これであるため、オープンソースであるワーキングプロジェクトにリンクしていません学習のプロセスについて

答えて

16

Webサーバは、コードの非常にシンプルな作品であることとして開始:そのソケット上の接続のための

  • 待機を終了していない間

    • は、ポート80
    • 上のTCP/IPソケットを開きます
    • 誰かがあなたHTTPヘッダ
      • がFILへのパスを見つける送ります電子
      • だから、コードのアウトラインが簡単です

ソケットにファイルをコピーします。

今、あなたが処理するために、いくつかの複雑さを持っている:コードの最も簡単なバージョンで

  • 、あなたは1つのブラウザに話している間、他のすべては接続できません。あなたは、複数の接続を処理する何らかの方法を考え出す必要があります。
  • 他のプログラムを実行できるようにするには、静的ファイル以外のものを送信することができれば便利です(ただし、最初のHTTPサーバーではそうしました)。

複数の接続の可能性を処理することは、比較的簡単であり、いくつかの選択肢があります。

  • 最も簡単なのは、ポート80をリッスンするコードにその接続の特定のソケットを設定し、それを処理するコードをフォークします接続。このプロセスは、ソケットが閉じられるまで実行され、終了します。しかし、それは比較的高価です。フォークには一般的に数十ミリ秒かかります。そのため、実行速度は制限されます。
  • 2番目の選択肢は、リクエストを処理する軽量プロセス(a/k/a スレッド)を作成することです。

プログラムの実行は、実際には非常に簡単です。一般に、CGIディレクトリへの特別なパスを定義します。そのディレクトリを通るパスを持つURLは、パス名をプログラムへのパスとして解釈します。次に、サーバーは、STDOUTをソケットに接続してfork/execを使用してサブプロセスを作成します。プログラムが実行され、STDOUTに出力が送信され、クライアントブラウザに送信されます。

これは基本パターンです。 Webサーバーが行うその他すべてのことは、この基本パターンにフリルと追加機能を追加するだけです。


それprett:ここ

は、例えば、コードのいくつかの他の源でありますyがずっとあなたが本当に欲しいものを何もしませんが、シンプルのためにそれを打つのは難しいthis onehttp://www.commandlinefu.comから:

$ pythonの-m SimpleHTTPServer

+0

私は実際にはもっと簡単なバージョンのpythonを既に持っています。静的ヘッダーとコンテンツを送信するだけです。 –

+0

答えにとても素敵です。 –

0

私はPythonをよりよく学ぶ方法と同じプロジェクトを開始することを考えていました。かなり良い出発点であるBaseHTTPServer classがあります。

は、ここではいくつかのチュートリアル形式の記事です:1 & 2

+0

はい、それは良い出発点ですが、私がやりたいことは、ソケットとリスナーを作成...最初から全力を尽くすあります。しかし、ありがとう。 –

1

ネットワーキングらはかなり標準公正なので、そのことについてはあまり心配しないでください。ほとんどの言語でサンプルネットワークサーバーがいくつか存在します。

代わりに、実際にHTTP仕様を実装することに焦点を当てます。あなたは、a)あなたが知らないもの、b)HTTPに準拠していると思われるもの、実際にはそうではないが、うまくいかないものに驚かれるだろう。

あなたはウェブがまったく機能することに驚くでしょう。

HTTPを終了したら、IMAPの実装をお楽しみください。

1

私は数年前にPythonでライトウェブサーバーを作成しました。また、学習プロジェクトとしても使用しました。

私が与えることができる最も簡単なアドバイスは、特に学習プロジェクトとして、効果的なコアを構築し、その上に反復的なデザインを組み込むことです。ホップを離れて月を目指してはいけません。非常に小さいものから始まり、フィーチャーを追加し、精緻化し続けます。 Pythonのような体験を奨励するツールを使用することをお勧めします。Pythonのように、文字通り同時にコードを入力してテストすることができます。

8

まずは、これが有用なプロジェクトにならないようにしてください。ウェブサーバーのセキュリティ権を取得することは本当に難しいです。

[OK]を、ここに心に留めておくべきものは以下のとおりです。

  1. 接続を受け入れるスレッドができるだけ早く として バックグラウンドスレッドにハンドオフする必要があります。
  2. 1つの接続ごとにスレッド を持つことはできません。 スレッドの上限を使い果たして大量になります。
  3. リクエストを処理するには、何らかの種類の ワーカースレッドプールを使用します。
  4. HTTP GET リクエストを受け取ったら、 のURLをスクラブしてください。だから私は何かをすることができなかった http://localhost/../../Users/blah/ のようなより高いレベルのアクセスを得る。
  5. 関連する のコンテンツとMIMEタイプを必ず設定してください。

幸運 - これは仕事の地獄です。

+0

サイトの開発者としてウェブで作業した後、私は問題のセキュリティについてよく知っています:)しかし、良い答え。 –

+0

実行可能コードをインターネットに公開するリスクを知っていることは、ほとんどの開発者よりも先に進んでいます。 :) – rein

1

私はTAEDもちろん、プロキシの割り当てを持っていた私はそうここにいくつかの光を当てることができると思います。

だから、あなたの人生を楽にするために多くのヘッダーを変更することになります。つまり、HTTP/1.0はHTTP/1.1よりも扱いが簡単です。あなたはタイムアウトやキープアライブなどの管理に対処する必要はありません。トランザクションごとに1つの接続が最も簡単です。

あなたはたくさんの解析を行います。解析は、それがで1行に既存のC文字列関数を使用するのが最も簡単です単にので、私は

int readline(char *buff, int maxLen) { 
    while((c = readNextCharFromSocket(&s)) && c != '\n' && i < maxLen) 
     buff[i++] = c; 
    return i; 
} 

のようなものである機能を書くことをアドバイスし、それを一度に1行を処理したいC.では困難です時間。また、行は\ r \ nで区切られており、ヘッダーは\ r \ n \ r \ nで終わっています。

ファイルを読むことができる限り、他のすべてのものが期待どおりに機能する限り、主な難しいことは解析されます。

デバッグのために、スタッフが壊れたときにそれらをテストするために渡されたヘッダーを印刷したいと思うでしょう。

1

local-web-serverは...それは使用して私はすでに(htmlとPHPを)実行するWebサーバを開発しましたpython -m SimpleHTTPServer

0

よりも信頼性だとより多くの機能を持っているのNode.jsで書かれたシンプルな開発用ウェブサーバーの例です。 C言語 複数のリクエストを処理するために、TCP/IPソケット、スレッドを使用する方法を知っている必要があります複雑なことではありませんfork(phpコマンドラインを実行するための子を作成する必要があります(私はexecvpを使用しています)

私は最もstrugling部分は、C言語で文字列を処理し、コマンドラインでPOST/GET要求を送信すると思います。

幸運

+0

これは投稿に何が追加されているのか分かりません。 :) – gsamaras

+0

追加する内容を教えてください: サーバーを構築する手順 –

関連する問題