自宅サーバ設定&開設事例
〜SephieBrainの場合 HTTPサーバ編〜
まあ、こんなのほかのサイトでもやってる(しかもそっちのほうが詳しい)んだけどね。一応ということで。
さっとしか説明しないが、簡潔にわかりやすくやるつもり。
最終更新:2006/9/14
・その1 HTML編
まあ、HTTPサーバ(httpd)にはいろんな種類があるが、私は無料でしかも日本語のAN HTTPDを使うことにした。ApacheやIISはより高度なことができるが、その分設定も非常に複雑である。まずはこれで始めてみて、性能や機能に不満が出れば乗り換えるという手もある。
まず、サーバデーモン(httpd.exe)を置くディレクトリを作る。私はc:\httpd-binとした。
次に、そこにAN HTTPDの圧縮ファイルを解凍してできたファイルを展開する。最低限*.exeと*.dllがあれば動くので、ヘルプHTMLやサンプルスクリプトは別の場所に展開しておいて必要な時に参照・コピーしたほうがいいように思う。
そして、httpd.exeを起動させる。タスクトレイの黄色いアイコンをクリックすると下のような画面が出る。
ここで注目したいのは「ドキュメントルート」の部分である。
たとえばこれが「c:\httpd」だと、「http://サーバのアドレス/html/index.html」というアドレスで表されるファイルは「c:\httpd\html\index.html」となる。セキュリティ上ドキュメントルート以下にサーバデーモンの実行ファイルのあるディレクトリがあるのは好ましくないので、別のディレクトリを作ってそこをドキュメントルートにしよう。私は複数のサブドメインを運用しているので、このサイト(http://sephiebrain.jp/)のファイルはc:\httpd\sephiebrain.jp以下に置いている。ここでは分かりやすくするためc:\httpd\docrootとしよう。
しかし、ディレクトリを作成しただけではAN HTTPDはドキュメントルートがc:\httpd\docrootだと認識してくれない。そこで、メニューの「オプション(O) → 一般(G)...」(あるいは、タスクトレイのアイコンを右クリックして「オプション 一般(G)...」)から設定メニューを開き、ドキュメントルートと書かれている右にあるインプットボックスにドキュメントルートにするディレクトリのフルパス(上の例だとc:\httpd\docroot)を入力する。
ここまでやって、ドキュメントルートにindex.html(正確には↑の「デフォルトインデックス」のファイル名)というファイルを置いて、ブラウザで「http://127.0.0.1/」にアクセスすれば置いたhtmlファイルが見えるはずだ。
見えない場合は↑の設定画面でポートが80になっているか確認しよう。それでも見えない場合はすでに他のHTTPサーバが起動していないか(その場合はAN HTTPD起動時にエラーメッセージ(「Winsock error 0: サーバソケットを使用できません。他の HTTPサーバが動いていないか確認してください。あるいはポート番号を変えて下さい。」)が出るので分かるはずだ)、ファイアウォールやウイルス対策ソフトが妨害していないか(これも確認メッセージなどが出ることもある)調べよう。
最近のメーカー製PCの場合は初期状態でApacheが入っていることもある(外出先からPCを制御したり、録画した動画を見れるようにするための機能に使用されるらしい)ようなので、その場合は別マシンを用意するか、機能を諦めるか、あるいは自鯖(HTTP)を諦めるしかない。
両方諦めたくないがマシンはもう用意できないという場合、もしかするとApache(あるいは専用のHTTPサーバ)のポートを80以外に設定できるかもしれないので、マニュアルなどで調べよう。
これでひとまずは完成。あとは普通のレンタルサーバのようにリンクを張っていけばいい。しかし、まだCGIやSSI、Basic認証、SSLなどは使えない。
Tips1 もしドキュメントルート以下にサーバデーモンがあると…?
例えばドキュメントルートとサーバデーモンが同じディレクトリにあった場合、AN HTTPDではデフォルトでログはサーバデーモン実行ファイルと同じ場所に記録されるので、外部から閲覧できてしまう。ユーザーでパーミッションをかけようと思っても、ログの記録も読み出しもAN HTTPDが行うため、同一ユーザーとなってしまい都合が悪い。それ以外にもサーバ実行に必要な設定ファイルやメモ書きなど公開するつもりの無いファイルが公開されることになってしまうことがあるので、セキュリティ上別のディレクトリにするべきである。
Tips2
ポート80以外でもHTTPサーバを公開できる
ブラウザのアドレス欄に「http://ホスト名:10080/」のように入力すれば、該当するホストのポート10080に対してHTTP接続を試みる。
つまり、図1−2の「ポート」という場所を10080にすれば、↑の書き方でアクセスできるというわけだ。
ただ、手打ちだとポート番号を入力する分面倒だし、特殊な環境だと相手先ポートが80(HTTP)と443(HTTPS)しか許可していないという場合も考えられる。
複数のHTTPサーバを動かす場合などは、メインで公開したいほうのサーバを80、サブのほうをそれ以外としたほうがいいだろう。
その2 CGI・SSI編
せっかく自作サーバを立てたのに、CGIやSSIを使わないんではもったいない。が、httpd(AN HTTPDに限らず)は通常単体でCGIとかは実行できない(組み込み向けだと簡易実行環境が入っているのかもしれないが)。
CGIやSSIを実行するためには、「Perl(パール)」というシステムを組み込まないといけない。似たようなものにPHPがあるが、ここでは説明しない。
Windowsで動くPerlといえば「ActivePerl」なんかが有名。Linuxだとディストリビューションと設定によっては標準でインストールされるものもある。
どの系(5xx、6xx、8xx系など)を入れるかは自由だが、最近のCGIなどは8xxにも対応してきているので特に問題がなければ8xxを入れよう(2006/6/6現在、最新は638と817。ちなみにこの数字はバージョンナンバーの5.x.y.zzzのzzzにあたる部分)
私はこれを「c:\perl」にインストール。バックアップなどを考えるとHTTP鯖、ドキュメントルートのディレクトリ(またはそれ以下)とは別のディレクトリに入れたほうがいいだろう。
OSを再起動した後、httpd.exeを起動。メニューの「オプション(O) → 一般(G)...」(あるいは、タスクトレイのアイコンを右クリックして「オプション 一般(G)...」)の、下のほうのリストボックスで「.pl,.cgi」をクリックし、下の「編集」ボタンを押す。
出てきたダイアログ(↑)の「実行プログラム」と書いてある下にある入力ボックス+コンボボックスの▼をクリックし、「(perlをインストールしたディレクトリ)\bin\PerlIS.dll」というのを選択し、OKを押す。ActivePerlが正常にインストールされている場合はリストに入っているはずだが、もし無い場合は手動でパスを設定しよう(しかし、その場合もしかすると動かないかもしれないのでPerlをインストールしなおしたほうがいいかも)。ところで、コンボボックスから選ぶとなぜか「c:\perl\\bin\PerlIS.dll」のように\が2つ連続しているのだが、問題なく動作するようだ。気になる場合は手動で修正しておけばいいだろう。
するとPerlがhttpd.exeに登録され、CGIとSSIが使えるようになるはずである。ためしに適当なCGI(HelloWorld.cgiとか。名前をcgiに変えてから置こう)を「ドキュメントルート\cgi-bin」というディレクトリに突っ込み、「http://127.0.0.1/cgi-bin/tekitou.cgi(もちろん、tekitouの部分は設置したCGI名にする)」にブラウザでアクセスし、見事表示されればOK!うまくいかない場合は、CGIがUNIX系のカーネル特有のシステムコールを使用していないかなどを確認するなどしてみるといい。もちろん、CGIにミスがあれば結果が返らない(・・・・.cgi なんたら no output、つまり、cgiは出力をしなかったというエラーメッセージが出たりする)。
SSIは、html中に<!--#exec cmd="../cgi-bin/count/counter.pl"-->などという風に記述して使う。
Perlスクリプトの実行の他に、ファイル更新日時なども表示できる。より詳しい説明はネットで探してくれぃ(ぉ)。
Tips1 ActivePerlで未サポートな関数
ActivePerl 5.6.1 build 638だと
プロセスとプロセスグループ用関数
alarm(), getpgrp(), getppid(), getpriority(), setpgrp(), setpriority()
ユーザとグループ情報の取得
endgrent(), endpwent(), getgrent(), getgrgid(), getgrnam(), getpwent(),
getpwnam(), getpwuid(), setgrent(), setpwent()
System V プロセス間通信関数
msgctl(), msgget(), msgrcv(), msgsnd(), semctl(), semget(), semop(), shmctl(),
shmget(), shmread(), shmwrite()
ファイルハンドル、ファイル、ディレクトリ用関数
link(), symlink(), chroot()
入出力関数
syscall()
ネットワーク情報の取得
getnetbyname(), getnetbyaddr(), getnetent(), getprotoent(), getservent(), sethostent(),
setnetent(), setprotoent(), setservent(), endhostent(), endnetent(), endprotoent(),
endservent(), socketpair()
が未サポートらしい(perlインストールディレクトリ以下のhtml\faq\Windows\ActivePerl-Winfaq5.htmlより)。
また、fork()も挙動が違うようで(5.8では修正されてる?未調査(ぉ))、UNIX用CGIではfork()は多用されている(特に複数のユーザーが同時に使うようなCGIの場合)ので注意が必要かもしれない。
Tips2 cgi-binの場所と一般パス
cgi-binはデフォルトで「サーバデーモンのあるディレクトリ\cgi-bin」になっている。これはCGIが一種のサーバとみなされているからだろう。
また、図1−3に「一般パスでも実行する」というオプションがあるが、これにチェックがないと実行パス(「エイリアス」タブで設定する)以外ではCGIが動作しなくなる。
それとは別に、図1−2に「SSIを許可する」と「CGIを実行する」があり、これを外すと全てのパスで動作しなくなる。
また、「SSIを許可する」の右にある3つのチェックボックスで、どの種類のファイルでSSIを許可するか選択することができる。
Tips3 CGIを実行すると鯖が落ちる…。
どうも大規模なCGIをISAPI(PerlIS.dll)で動作させると不安定になることがあるようだ。
そのため、私は.cgiと.plを別々に分け(図1−2の「追加」「編集」で行う)、.cgi(中〜大規模なスクリプト)に「perl.exe」、.pl(小規模なスクリプト)に「PerlIS.dll」を割り当てている。
ただ、perl.exeで実行した場合エラーコードが蓄積される?らしく、突然以前のエラーが一気に出てくることがあるのが気になる。
その3 セキュリティ編
●ディレクトリリストの制御
「http://moemoe.orz/abcde/」などの最後が「/」で終わる所にアクセスしたときに表示される内容は、大体次の3パターンのどれかである。
1.403 Forbidden
2.index.htmlなどに飛ばされる
3.ファイルリストが表示される
このうち、2.はインデックスファイル(index.html、index.shtmlなど。AN HTTPDでは図1−2の「デフォルトインデックス」で指定)があったときの動作だが、1.と3.はインデックスファイルがなかったときの動作である。
AN HTTPDの場合、ファイルリスト(ディレクトリリスト、インデックスリスト)を表示するかどうかは「表示/インデックス」タブの「インデックス」というところで設定する。
図1−4の「インデックスリスト(ディレクトリリスト)を表示」にチェックを入れると、インデックスファイルがない場合はディレクトリリストを表示するようになる。チェックを入れないと403エラーになる。
「認証付ディレクトリのみ」にチェックを入れると、おそらく次に述べるユーザ認証(Basic認証)がかかったディレクトリの場合のみ表示、それ以外は403エラーになるはずである(未検証)。
「〜があるディレクトリのみ表示」にチェックを入れると、そのファイルが存在するディレクトリの場合は表示、それ以外は403エラーになる。
タイトルの右側にある2つのボックスは、それぞれディレクトリリストのタイトルと、親ディレクトリへのリンク文字に使われるもので、ここを「Index
of %s」「Parent directory」などにすれば英語ソフトっぽくなる。
→と思ったら、これは「Accept-Language: ja」、つまりブラウザで優先する言語を日本語にしてある場合の表示指定で、ブラウザがAccept-Languageヘッダを吐かない場合は「Index
of 〜」と「Parent Directory(Dが大文字)」になるらしい。
あと、これはエラー表示にも関係あるのだが、下の「メッセージ」にある「サーバ名/バージョンを〜」のオプションは、なんらかの事情があって旧バージョンを試用していて、特定のサーバ/バージョンに存在する脆弱性を狙った攻撃を避けたい場合などに使えるかもしれない。ただ、botで手当たり次第に攻撃してるような場合には無意味なので、出来る限り最新の安定バージョンを使うべきである。
●ユーザ認証(Basic認証)
HTTPの認証(クライアント認証)にはBasic認証とDigest認証があるが、AN HTTPDではDigest認証は使えないのでBasic認証を使うことになる。
Basic認証はユーザー名とパスワードを実質平文(暗号化されていない分。本当はbase64エンコードするが、暗号ではないためすぐ解読できる)で送るため、厳格なセキュリティが必要な場面で使うべきではない。その場合はDigest認証を使うか、SSLと共に使うことになる。
AN HTTPDにおいては、「ユーザ認証」タブでユーザ認証の設定を行うことが出来る。
まず、「ユーザ認証」チェックボックスをONにして、ユーザ認証を使えるようにする。
次に、認証したいユーザを登録する。「ユーザ/パスワード」の右側にある「追加」ボタンを押して、ユーザ名とパスワードを入力する。
入力したパスワードは暗号化されるので、忘れないようにしよう。また、同じパスワードを入力しても、「ユーザ/パスワード」の所に表示される暗号化パスワードは異なったものになる。
次に、必要であればグループ化を行っておく。「グループ」の右側にある「追加」ボタンを押して、グループ名とグループに所属するユーザを入力する。ユーザ名の追加は1行に1つずつ、改行で区切って入力していく。
最後に、「ユーザ名/パスワード」の上に3つ並んでいるボタンの「追加」を押して、「認証名」にブラウザなどに表示する名前(例:メンバー専用エリア)、「パス」に認証をかけるディレクトリのパス(ドキュメントルートからのパス。例:/html/memberonly/)、「認証ユーザ/グループ」に認証の対象にするユーザやグループを改行で区切って入力する。
「PUT/DELETEを許可する」にチェックを入れると、PUT/DELETEメソッドを利用してファイルを書き込み/削除できるようになる。しかし、あまり使う場面はないだろう。
Tips1 ファイルに認証かけられないの?
Basic認証はディレクトリにかけるものだが、ファイルに認証をかけたい場合もあるだろう。
例えば、/cgi-bin/forall.cgiは全員に、/cgi-bin/formember.cgiは会員のみといった場合である。
この場合はCGIで独自に認証をかけるしかない。あるいは、/cgi-bin/member/を新たに作り、それにBasic認証をかけ、そこに移動させるという手もある。
●アクセス制御
未完成…
●SSL
未完成…
その4 バーチャルホスト編
未完成。
バーチャルホストは下から順にチェックされるが、設定画面から順番を変えられない。レジストリを弄ろう。
どの項目にも当てはまらないホスト名でアクセスされた場合は一番上の有効になっているホストへのアクセスとみなされるので一番上はデフォルトにしておこう。
その5 その他の機能
エラー表示を変える
ログを制御する
サービス動作させる
ファイルタイプを追加する
Proxyサーバとして使う