Webサーバーとは

ブラウザがしているのは、頼んで受け取ることだけ

ブラウザにアドレスを打ち込むと、ページが出ます。あのとき裏で起きているのは、たった2往復ぶんの会話です。ブラウザが「このファイルをください」と頼み、向こう側のプログラムが「はい、これです」と返す。この頼む文をリクエスト、返ってくる文をレスポンスと呼びます。

そして、頼まれたら返す側にずっと居座っているプログラムがWebサーバーです。このコースで入れる nginx も、これから最初に動かす Python の簡易サーバーも、やっていることは同じです。決めたポート番号で待ち構えて、来たリクエストに対してファイルを返します。

待ち受けているのはポート番号

サーバー機には、番号の付いた窓口がたくさんあります。これがポートです。Webサーバーは普通 80 番か 443 番で待ちますが、番号自体に特別な意味はありません。待っているプログラムがいる番号なら繋がり、誰もいない番号は繋がりません。

# 誰も待っていない番号につなぐと、こうなる curl -v http://localhost:8080/ # curl: (7) Failed to connect to localhost port 8080 after 8 ms: Couldn't connect to server

Failed to connect は「その番号には誰もいません」という返事です。サーバーが落ちているときに真っ先に出るメッセージなので、いま覚えておくと後の章で効きます。

中身を見る道具が curl

ブラウザは受け取ったHTMLを絵にしてしまうので、生の会話が見えません。curl を使うと、やりとりをそのまま文字で読めます。

curl -v http://localhost:8080/

-v を付けると、送った行が > で、返ってきた行が < で表示されます。返事の1行目はこうなっています。

HTTP/1.0 200 OK

200 は「見つかったので返します」という番号です。よく見る 404 は「そんなファイルはありません」、403 は「あるけれど見せません」。この番号をステータスコードと呼びます。続く Content-Type などの行はヘッダーで、中身がHTMLなのか画像なのかを伝えています。ヘッダーのあとに空行が1つ入り、そこから先が本文です。

応答は保存できる

-D でヘッダーだけ、-o で本文だけをファイルに落とせます。あとから読み返せる形で残しておくと、うまくいかないときの比較材料になります。

curl -s -D headers.txt -o body.html http://localhost:8080/

手を動かす

この回では、Python に付いてくる簡易Webサーバーで自分のサイトを一度配信し、その応答を curl で受け取ってファイルに残します。nginx はまだ入れません。まず「待ち受ける側がいれば繋がる」という一点だけを、自分の目で確かめます。

ヒント

  • 1. curl -v http://localhost:8080/ を打ち、まだ誰も待っていないことを確かめる
  • 2. python3 -m http.server 8080 --directory /root/mysite & で簡易サーバーを起動する
  • 3. curl -v http://localhost:8080/ をもう一度打ち、返ってきた行を読む
  • 4. curl -s -D /root/first-response.txt -o /root/first-body.html http://localhost:8080/ で応答を保存する

4 項目で採点します