動かし続ける

INPUT · スライド

自分のサーバーを立てる

01 / 08

Web はファイルを渡し合うだけ

いよいよ章12の最後だよ。3段の一番上、中身が返ってくるかをやるんだ。

1. ping     機械は生きている?      ○2. netstat  扉は開いている?        ○3. wget     中身は返ってくる?      ← 今日

まず、Web の正体をはっきりさせておこうね。

> Web は、ファイルを頼んで受け取るだけの仕組み

本当にそれだけなんだ。

こちら「/index.html をください」あちら「はい、これです」(中身)

あなたが章1から触ってきたファイルが、そのまま流れているだけでしょう。

頼む側と配る側に名前が付いているよ。

配る側    サーバー(server = 給仕する人)頼む側    クライアント(client = 客)

ブラウザは客のほうだね。今日は両方を自分でやるんだ。

httpd   配る係(サーバー)wget    頼む係(クライアント)

面白いのは、どちらもただのコマンドだということだよ。特別なものではないんだ。

世界中の Web サイトも、やっていることは同じ

規模と工夫は違うけれど、芯は「ファイルを頼んで受け取る」でしょう。今日それを自分の手で動かすと、この芯が身体に入るからね。

02 / 08

配る係を動かす

httpd の印は2つ覚えれば足りるよ。

~ $ httpd -p 8080 -h /home/learner/site~ $
-p 8080                  8080 番の扉で待つ-h /home/learner/site   この中のファイルを配る

-h で渡した場所をドキュメントルートと呼ぶよ。

配る場所 = /home/learner/site/index.html  →  /home/learner/site/index.html/a.txt       →  /home/learner/site/a.txt

URL の道と、ファイルの置き場所が対応しているでしょう。ここが分かれば Web の8割は分かったことになるんだ。

他の印も並べておくね。

すること
-p 番号待つ扉を決める(既定は 80)
-h 場所配る場所を決める(既定はいまの場所)
-f裏に回らず画面に留まる
-v何が来たかを詳しく出す

-f はときどき役に立つよ。

httpd -p 8080 -h site      裏に回る(すぐ画面が返る)httpd -f -p 8080 -h site   画面に留まる(Ctrl-C で止める)

裏に回ると止め方を忘れがちでしょう。章8の pskill、前のレッスンの killall で止められるようにしておいてね。

1つ落とし穴があるよ。

~ $ httpd -p 8080 -h /home/learner/naihttpd: can't change directory to '/home/learner/nai'

配る場所が無いと起動しないんだ。先に mkdir してから立てるでしょう。この順番を間違えると「起動したのに繋がらない」と悩むことになるよ。

03 / 08

URL の読み方

頼むときの住所の書き方を分解しておこうね。

http://127.0.0.1:8080/a.txt└─┬┘   └───┬───┘ └┬┘ └─┬─┘ 約束     住所     扉   道

4つの部分に分かれているよ。

部分意味
http://どの約束ごとで話すか
127.0.0.1どの機械か(前のレッスン)
:8080どの扉か(前のレッスン)
/a.txtその中のどのファイルか

前の2つのレッスンが、そのまま URL の中に居るでしょう。

ip / ping   → 住所の部分netstat     → 扉の部分今日        → 道の部分

章12がここでつながるんだ。

扉の番号は、決まっているときは省略できるよ。

http://example.com/       80 が省略されているhttps://example.com/      443 が省略されているhttp://127.0.0.1:8080/    8080 は省略できない

有名な番号だけ省略できるという約束なんだ。だから練習では必ず :8080 を書くよ。

道の部分で覚えておくことが1つあるよ。

http://127.0.0.1:8080/        →  index.html を探すhttp://127.0.0.1:8080/a.txt   →  a.txt を渡す

/ だけのときは index.html を探すという約束があるんだ。だからどのサイトにも index.html が置かれているでしょう。無いとどうなるかは、この回の問題で確かめようね。

04 / 08

返事には番号が付いている

wget-S を付けると、返事の頭が見えるよ。

~ $ wget -S -q -O /dev/null http://127.0.0.1:8080/a.txtHTTP/1.1 200 OK  Connection: close  Content-type: text/plain  Content-Length: 4

1行めの 200結果を表す番号だよ。

200 OK    うまくいった404 …     見つからない

番号は3桁で、百の位で大きく分かれているんだ。

百の位意味
2xxうまくいった200 OK
3xx別の場所へ行って301 移動した
4xx頼んだ側が悪い404 無い / 403 駄目
5xx配る側が悪い500 中で失敗

4 と 5 の違いがとても大事だよ。

4xx  あなたの頼み方の問題(URL の打ち間違いなど)5xx  サーバーの中の問題(プログラムが落ちた)
404 が出た  → URL を確かめる500 が出た  → サーバーの記録を見る(前のレッスンの logger!)

どちらの側を調べるかが番号で決まるでしょう。これが分かるだけで、無駄な調査が消えるんだ。

見出し(ヘッダ)も読んでおこうね。

Content-type: text/plain    中身の種類Content-Length: 4           中身の大きさ(バイト)

中身が始まる前に、中身の説明が届くんだ。荷物の送り状みたいなものだね。だから受け取る側は、開ける前に「何が来るか」を知っていられるでしょう。

05 / 08

種類は拡張子で決まる

Content-type は、配る側がファイルの名前から決めているんだ。

a.txt      →  text/plainb.html     →  text/htmlc.png      →  image/pngd.json     →  application/json

これがなぜ大事なのかというと、受け取る側の振る舞いが変わるからだよ。

text/html   ブラウザが「読み解いて」表示するtext/plain  そのまま文字として出す

同じ <h1>Fulfledge</h1> という中身でも、こうなるんだ。

text/html   大きな文字の「Fulfledge」text/plain  <h1>Fulfledge</h1> という文字そのまま

中身は同じで、見え方が変わるでしょう。

ここが原因の事故もよくあるよ。

HTML を書いたのに、タグが文字のまま出る  → 拡張子が .txt になっていた

名前の付け方で表示が変わるという、初めての人がいちばん驚くところなんだ。

逆向きの使い道もあるよ。

わざと text/plain で配る → 中身を安全に見せられる

なぜ安全かというと、text/html で配ると書かれた命令が動いてしまうからだよ。他人が書いた文字をそのまま text/html で配るのは、とても危ないんだ(他人の命令を自分のサイトで動かすことになるでしょう)。

他人が書いたものを HTML として配らない

これは Web の安全の話の入口だよ。今日は「種類が振る舞いを決める」ということだけ覚えておいてね。HTML の詳しい書き方は HTML/CSS のコースでやるからね。

06 / 08

頼む係の使い分け

wget の印は4つで足りるよ。

すること
-O ファイル保存先を決める(- なら画面)
-q途中の進み具合を出さない
-S返事の頭を見せる
--spider中身は取らず、あるかだけ見る

よく使う3つの形を覚えてしまおう。

wget -q -O - URL          画面で中身を見るwget -q -O ファイル URL   保存するwget -q --spider URL      あるかだけ確かめる

-O --画面のことだよ。章4でやったパイプにもつなげられるね。

wget -q -O - URL | grep 探す言葉wget -q -O - URL | wc -l

取ってきたものを、そのまま章3〜5の道具に渡せるでしょう。ここまで覚えてきたものが全部効くんだ。

--spider の使いどころも言っておくね。

wget -q --spider URL && echo aru || echo nai

中身が要らないときは取らないんだ。大きなファイルなら、これで何百倍も速くなるでしょう。

終了ステータスも押さえておこうね。

200 が返った      終了ステータス 0404 が返った      終了ステータス 1扉が閉まっている  終了ステータス 1

中身の有無をスクリプトで判定できるね。章11で覚えた &&|| の出番だよ。

もう1つ、curl という似た道具の名前も知っておいてね。この環境には入っていないけれど、世の中では curl のほうがよく使われるんだ。

wget   ファイルを取ってくるのが得意curl   細かく指定して試すのが得意

役割が少し違うだけで、考え方は同じだからね。

07 / 08

外には出られない

配る場所を決めたら、そこから外には出られないようになっているよ。試してみると分かるんだ。

~ $ wget -q -O - "http://127.0.0.1:8080/../himitsu.txt"wget: server returned error: HTTP/1.1 400 Bad Request

断られたでしょう。.. は章1でやった「1つ上」だね。

配る場所   /home/learner/site頼んだ先   /home/learner/himitsu.txt   ← 外!

もし外に出られたら、こんなことができてしまうんだ。

/../../../etc/passwd をください

機械の中身を全部読まれてしまうでしょう。だから配る係は、.. を含む頼みを断るように作られているんだよ。この攻め方には名前が付いていて、パストラバーサルと呼ばれるんだ。

でも安心しすぎないでね。大事なのはこの順番だよ。

> 配る場所には、配ってよいものだけ置く

断る仕組みに頼る    → いつか穴が見つかる置かない            → 穴があっても漏れない

そもそも無ければ漏れないでしょう。これは Web の安全の一番大事な考え方なんだ。

実際の事故はこうやって起きるよ。

配る場所に .git を置いたまま公開した  → 過去のパスワードまで読まれた配る場所に backup.zip を置いたまま忘れた  → 丸ごとダウンロードされた

どちらも「置いてしまった」のが原因でしょう。仕組みの穴ではないんだ。

だから今日の練習でも、site という専用の場所を作って、その中だけを配るようにするからね。置き場所を分けるのが作法だよ。

08 / 08

さあ、打ってみよう

この回で使う形をまとめておくね。

mkdir -p site                     配る場所を作るhttpd -p 8080 -h /home/learner/site   配るwget -q -O - URL                  画面で見るwget -q -O ファイル URL           保存するwget -S -q -O /dev/null URL       返事の頭を見るwget -q --spider URL              あるかだけ見るkillall httpd                     閉める

読むところも並べておくよ。

200 OK          うまくいった404 Not Found   見つからない400 Bad Request 頼み方がおかしいContent-type    中身の種類(拡張子で決まる)Content-Length  中身の大きさ

今日いちばん覚えてほしいことは3つだよ。

1. Web はファイルを頼んで受け取るだけ2. 4xx は頼む側、5xx は配る側の問題3. 配る場所には、配ってよいものだけ置く

そして今日の結論。

> サーバーは、自分で立てられる

特別な設備は要らないんだ。あなたはもう、ファイルを置いて配って取ってくるところまで自分でできるでしょう。

最後の問題では、章12で覚えたものを全部つないで3段の点検を自動でやる道具を作るよ。

ping → netstat → wget → logger → cron

これが書けたら、章12は卒業だからね。次の章では vi を覚えるよ。画面の中だけでファイルを書き換えられるようになると、ここで作ったページも直せるようになるんだ。では打ってみよう。