Apache HTTP Server (演習)

Apache HTTP Server

  • Apache HTTPD は世界で一番利用されている HTTP サーバです
  • 計算機実習室の iMac を利用して、Apache httpd を使ってみます
  • Mac OS X には httpd が付属していますが、そのままでは起動できません
  • Apache のお試し方法 に従って、httpd を起動し、ブラウザでアクセスして、「使い方」を表示させてください

プロセス・ポートの確認

  • httpd はデーモン(常駐プログラム)として動いている
  • ps -x でプロセスを確認
  • netstat -an | grep LISTEN で、8080ポートが LISTEN 状態にあることを確認

テストページの作成

  • 次のように ~/www/htdocs ディレクトリに移動して test.html を作成する
    $ cd
    $ cd www/htdocs
    $ ls
    $ touch test.html
    
  • test.html を編集する
    • ファインダーから test.html を探して、テキストエディットにドラッグ&ドロップ

test.html の中身

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>テスト</title>
</head>
<body>
<h1>テスト</h1>
こんにちは、私の名前は○山×男です。
</body>
</html>

ブラウザからアクセス

  • ブラウザの 「URL を開く」で、http://localhost:8080/test.html にアクセス
  • 表示を確認
  • ログを確認
    $ tail ~/www/logs/access_log
    127.0.0.1 - - [22/Jul/2008:08:50:30 +0900] "GET /test.html HTTP/1.1" 200 215
    
  • のような感じでアクセス記録が残る
  • クライアントの IPアドレス、日時、HTTP 要求、応答コード、転送バイト数 の情報がわかる
    • 隣の IP アドレスを聞いて、アクセスしてみよう
    • アクセスされたときのログも確認しよう

telnet を使ったアクセス

$ telnet localhost 8080
Connected to localhost.
Escape character is '^]'.
GET /test.html HTTP/1.0
 
HTTP/1.1 200 OK
Date: ...
  • ログも確認

エラーの確認

  • ブラウザとtelnet の両方で試してみる
  • 存在しないページ
    • 例:http://localhost:8080/tset.html
  • アクセス禁止
    • $ chmod -r test.html
    • 確認後 chmod +r test.html で戻しておく
  • 不正要求 (telnet で)
    • GET /../ HTTP/1.0
    • DELETE /test.html HTTP/1.0
    • HOGE / HTTP/1.0

ディレクトリへのアクセス

  • Apache httpd では、ディレクトリにアクセスがあると / (スラッシュ) が最後に付く URI へリダイレクトする
  • 設定ファイル ( ~/www/conf/httpd.conf ) で Options Indexes が指定されていると、そのディレクトリの一覧が返される
  • 但し、DirectoryIndex で指定されたファイルが存在すると、そのファイルを返す

ディレクトリ・アクセスのテスト

  • $ mkdir test
  • http://localhost:8080/test を開く -> 最後に / が付くことを確認
  • ログを確認
  • telnet でも試してみる
    • 301 応答に対して、ブラウザが再度アクセスしなおすことを理解してください

"304 応答" について

  • ブラウザから何度も同じ URL にアクセスすると、ログには 304 - が記録される
  • ブラウザ(又は、プロキシサーバ)にコンテンツのキャッシュがあると、その日時(あるいは ETag)を用いて変更がある場合のみ送るように要求している

CGI

  • CGI ... Common Gateway Interface
  • ウェブサーバ上でプログラムを実行させるためのインタフェース仕様
  • GET /xxx?a=b&c=d ... ? 以下は QUERY_STRING
  • POST /xxx ... Data をヘッダの後に付けて送信
  • Apache httpd では2種類の指定方法
    • ScriptAlias で指定したディレクトリに置く (cgi-bin)
    • AddHandler cgi-script で拡張子を指定 (.cgi)

CGI を使うための設定

  • ~/www/etc/httpd.conf を編集
  • ScriptAliasMatch を定義している行を探し、#を頭につけてコメントアウトする
  • 最後に以下の記述を追加:
       ScriptAlias /cgi-bin/ /home/%username%/www/cgi-bin/
       <Directory /home/%username%/www/cgi-bin/>
         Options None
         Allow from all
       </Directory>
    
  • 但し、%username% のところは自分のユーザIDに変える事
  • /usr/sbin/httpd -f ~/www/etc/httpd.conf -k restart で再起動
    • エラーがあればエラーメッセージをよく見て、httpd.conf を修正

CGI のテスト

  • test.py スクリプトをダウンロードして、~/www/cgi-bin に置く
  • cd ~/www/cgi-bin して、chmod +x test.py
  • http://localhost:8080/cgi-bin/test.py にブラウザでアクセス

Python CGI ライブラリ

  • test.py の最初に import cgi
  • req = cgi.FieldStorage() で、req オブジェクトに QUERY_STRING その他を読み込む
  • req.getvalue("who") で QUERY_STRING から who を取り出す
  • データの解析は、ライブラリに任せた方が、簡単
  • ブラウザから受け取ったデータを出力するときは、cgi.escape() を通す

その他

  • Apache httpd の利用法は、Apache docs にあるので、必要に応じて参照・勉強してください。

本日の出席確認

  • 菊地宛のメール に、~/www/logs/access_log を添付して送信。本文には感想・質問を記入。