たぶん難しくないApache2・初期設定編その4~変幻自在のコンテンツ(CGI)~ [Linux(Apache)]
今度はサーバでCGIを動かすことが出来るように設定してみよう。なお、CGIを使用するに当たっては、CGIプログラム、あるいはCGIスクリプトの内容については特に注意深くデバッグをしておかなければならない。さもなければ、Apacheの設定をどれだけ慎重に施してもCGIプログラム、あるいはCGIスクリプトがセキュリティ上のアキレス腱になってしまうからである。
なお、このblogではCGIプログラム、あるいはCGIスクリプトの作成については原則的に言及しない。なぜなら、そこまで責任を取れないからである。(大笑)
それでは、CGIを動かす設定について、解説を加える。
CGIを動かすことも、基本的にそれほど難しい訳ではない。ただ少しばかり直感的でないため、混乱しやすいだけなのである。まずは一番簡単な基本形の理解から入ろう。
手順1:CGIプログラム、あるいはCGIスクリプトを作成する
手順2:CGIプログラム、あるいはCGIスクリプトの配置場所を作成する
手順3:httpd.confに、「手順2」で作成した配置場所の指定を記述する
手順4:CGIを動作させたいディレクトリに、CGIの実行を許可する
手順5:実際にCGIが動作するかどうかチェックする
手順1:CGIプログラム、あるいはCGIスクリプトを作成する
なにはなくとも、CGIプログラムを作成するところから。テスト用CGIとして、ひとまずperlで以下のようなプログラムを作成し、これで実験することにする。
「chmod +x /tmp/test.pl」で実行権を付けた状態でこれを実行すると…
このような実行結果が出力されることになる。
手順2:CGIプログラム、あるいはCGIスクリプトの配置場所を作成する
CGIプログラムやCGIスクリプトは、一般的にはダウンロードさせたくないだろう。もともとサーバ側で実行するためのものであって、クライアントに用はないはず。そこで、ドキュメントルートの外側に、CGIを配置するディレクトリを作成する。(内側にあってもいいんだけどね…)
ここでは、とりあえず /var/www/cgi-bin ディレクトリにCGIを配置することにしよう。「mv /tmp/test.pl /var/www/cgi-bin/test.pl」とでも実行してCGIもそこに配置する。
これでよし。
手順3:httpd.confに、「手順2」で作成した配置場所の指定を記述する
cgi-binディレクトリの存在は、まだApacheが認識できていないので、これを認識させる必要がある。ここで登場するディレクティブは「ScriptAlias」である。一般的には、「ScriptAlias /cgi-bin/ /var/www/cgi-bin/」という記述になるだろう。
さらに、CGIを配置したディレクトリに対するアクセス許可の設定も必要となる。ドキュメントルートの外側に配置した場合、明示的なアクセス許可の設定をしなければ、ルートディレクトリに対して行った、アクセス拒否の設定が引き継がれてしまう。このために、「Directory」ディレクティブでCGIディレクトリに対する許可を別途作成することとなる。
このような設定を記述する。
手順4:CGIを動作させたいディレクトリに、CGIの実行を許可する
通常の状態では、CGIの動作は一切許可されない。そこで、CGIの実行許可を明示的に行う必要がある。このために使用するディレクティブは「Options」である。一般的には、「Options +ExecCGI」という記述になるだろう。(なお、ケースによっては「+」記号を省略しても構わない)
手順5:実際にCGIが動作するかどうかチェックする
それでは、実際のhttpd.confを見てみよう。なお、「その3」シリーズで記述を加えた認証まわりの設定はばっさり省略していることに注意されたし。また、モジュールの宣言も追加されていることにも注意。(ベースとなるhttpd.confは「その2」の末尾にあるものを使っている)
それから、今までに説明していないディレクティブ「TypesConfig」が登場している。これはmod_mimeモジュールが使用するファイル「mime.types」の保存場所を指定するのだが、デフォルトの状態(記述を省略した状態)だと、conf/mime.typesが指定されているとみなされてしまうが、困ったことにCentOSでは保存場所が/etc/mime.typesに移動しているので、このサンプルにあるとおりの指定をしなければならないのであった…。まあ、魔法の呪文だと思って書き加えておいてやって欲しい。
ここでは、ドキュメントルートにCGIの実行権をつけてみた。よって、test.plを実行する場合は、 http://server/cgi-bin/test.pl としてアクセスしてみると、ブラウザに「JAM took a sailor blouse away. 」などとちょろっと表示されるはずである。
※CGIが実行できずに陥りやすい罠※
このblogではすでに述べたとおりCGIの中身については守備範囲外としている。が、一般的に陥りやすい問題を紹介しておくので、CGIが実行できない場合に参考にしてもらいたい。
チェックポイント1:CGIに実行権限が無い
CGIプログラム、あるいはCGIスクリプトに実行権限が無いことがよくある。一般的にApache(httpd)はnobodyやapacheアカウントで実行され、その権限でCGIプログラム、あるいはCGIスクリプトにアクセスしてくるので、ファイルのオーナーにだけ実行権限を付けているような場合は実行できないことが多い。
上記のように、「読み取り権」と「実行権」がきちんと付与されている事を確認する。
なお、間抜けな例としては、そもそもcgi-binディレクトリにアクセス権が無いなんてこともある。ディレクトリやファイルのパーミッションについてはよくチェックしておくように。
チェックポイント2:シェバングの記述が無いか間違っているか、またはそれが正確にファイルの「先頭」でない
「シェバング」とは、ファイルの先頭行に配置される、「#!」で始まる行のこと。実行されるファイルが何らかのスクリプトファイルである場合、そのスクリプトファイルを正しく理解できるコマンドが何であるかをシェルインタプリタに通知する役割を担っている。
たとえば、一般的なシェルスクリプトなら、シェバングは
とか、
とかいう具合になる。perlスクリプトであれば、
と書くのが「一般的」である。
「一般的」ではあるが、perlの場合、もしかしたら他のディレクトリにインストールされていることもたまにあるようなので、whichコマンドなどで正確な所在を確認しておく。
こんな具合に。
で、たとえばWindowsな環境で開発されたCGIをそのままUNIX/Linux環境に持ち込むと、このシェバングが「#!c:/perl/bin/perl」とか当たり前のように記述されていてUNIX/Lnux環境では実行できないことになる。ここを正しく修正する。
また、シェバングは『厳密にファイルの先頭』でなければならない。スクリプトの先頭にタイトルとかコピーライトとか誇らしげに書きたい気持ちは良くわかるが、そんなものを差し置いてとにかく最初にはシェバングから書き出さなければならないのであった。変な空白や改行もなしに、とにかく正しくシェバングを記述するように。
チェックポイント3:改行コードの変換がおかしくなっていないか?
UNIX/Linux上でviとか使ってガリガリCGIを書いている人にはあまり発生しない問題だが、Windows上のエディタを使い、ftpなどでファイルをサーバ上に配置している場合に生じる恐れがある問題。
CGIスクリプトは「テキストファイル」なので、WindowsとUNIX/Linuxとの間で文字コードや改行コードの変換を行う必要が生じる。ftpのモード設定が正しくない場合、これが正しく行われずに問題を引き起こすことがある。
チェックポイント4:「Content-type: text/html」の出力をしていない、タイプミスがある、出力直後の改行が1個しかない
先のCGIスクリプトのサンプルをよ~く見てもらうと判ると思うが、「print "Content-type: text/html\n\n";」と、「\n」(改行コード)が2個入っているところが重要。1個しかないとInternal Server Error等となったりする。空白の入れ方や記号の使い方等についても、1字1句間違えることなく指定しなければならない。
チェックポイント5:そもそもCGIにバグがある…
┐(´ー`)┌
なお、このblogではCGIプログラム、あるいはCGIスクリプトの作成については原則的に言及しない。なぜなら、そこまで責任を取れないからである。(大笑)
それでは、CGIを動かす設定について、解説を加える。
CGIを動かすことも、基本的にそれほど難しい訳ではない。ただ少しばかり直感的でないため、混乱しやすいだけなのである。まずは一番簡単な基本形の理解から入ろう。
手順1:CGIプログラム、あるいはCGIスクリプトを作成する
手順2:CGIプログラム、あるいはCGIスクリプトの配置場所を作成する
手順3:httpd.confに、「手順2」で作成した配置場所の指定を記述する
手順4:CGIを動作させたいディレクトリに、CGIの実行を許可する
手順5:実際にCGIが動作するかどうかチェックする
手順1:CGIプログラム、あるいはCGIスクリプトを作成する
なにはなくとも、CGIプログラムを作成するところから。テスト用CGIとして、ひとまずperlで以下のようなプログラムを作成し、これで実験することにする。
[root@kagami conf]# cat /tmp/test.pl #!/usr/bin/perl print "Content-type: text/html\n\n"; print "JAM took a sailor blouse away.\n";
「chmod +x /tmp/test.pl」で実行権を付けた状態でこれを実行すると…
[root@kagami conf]# /tmp/test.pl Content-type: text/html JAM took a sailor blouse away.
このような実行結果が出力されることになる。
手順2:CGIプログラム、あるいはCGIスクリプトの配置場所を作成する
CGIプログラムやCGIスクリプトは、一般的にはダウンロードさせたくないだろう。もともとサーバ側で実行するためのものであって、クライアントに用はないはず。そこで、ドキュメントルートの外側に、CGIを配置するディレクトリを作成する。(内側にあってもいいんだけどね…)
ここでは、とりあえず /var/www/cgi-bin ディレクトリにCGIを配置することにしよう。「mv /tmp/test.pl /var/www/cgi-bin/test.pl」とでも実行してCGIもそこに配置する。
[root@kagami conf]# ls -la /var/www/cgi-bin/ 合計 12 drwxr-xr-x 2 root root 4096 11月 27 16:30 . drwxr-xr-x 6 root root 4096 11月 20 12:06 .. -rwxr-xr-x 1 root root 96 11月 27 16:24 test.pl
これでよし。
手順3:httpd.confに、「手順2」で作成した配置場所の指定を記述する
cgi-binディレクトリの存在は、まだApacheが認識できていないので、これを認識させる必要がある。ここで登場するディレクティブは「ScriptAlias」である。一般的には、「ScriptAlias /cgi-bin/ /var/www/cgi-bin/」という記述になるだろう。
さらに、CGIを配置したディレクトリに対するアクセス許可の設定も必要となる。ドキュメントルートの外側に配置した場合、明示的なアクセス許可の設定をしなければ、ルートディレクトリに対して行った、アクセス拒否の設定が引き継がれてしまう。このために、「Directory」ディレクティブでCGIディレクトリに対する許可を別途作成することとなる。
<Directory /var/www/cgi-bin> Order Deny,Allow Allow from All </Directory>
このような設定を記述する。
手順4:CGIを動作させたいディレクトリに、CGIの実行を許可する
通常の状態では、CGIの動作は一切許可されない。そこで、CGIの実行許可を明示的に行う必要がある。このために使用するディレクティブは「Options」である。一般的には、「Options +ExecCGI」という記述になるだろう。(なお、ケースによっては「+」記号を省略しても構わない)
手順5:実際にCGIが動作するかどうかチェックする
それでは、実際のhttpd.confを見てみよう。なお、「その3」シリーズで記述を加えた認証まわりの設定はばっさり省略していることに注意されたし。また、モジュールの宣言も追加されていることにも注意。(ベースとなるhttpd.confは「その2」の末尾にあるものを使っている)
それから、今までに説明していないディレクティブ「TypesConfig」が登場している。これはmod_mimeモジュールが使用するファイル「mime.types」の保存場所を指定するのだが、デフォルトの状態(記述を省略した状態)だと、conf/mime.typesが指定されているとみなされてしまうが、困ったことにCentOSでは保存場所が/etc/mime.typesに移動しているので、このサンプルにあるとおりの指定をしなければならないのであった…。まあ、魔法の呪文だと思って書き加えておいてやって欲しい。
[root@kagami conf]# cat httpd.conf ServerRoot "/etc/httpd" PidFile run/httpd.pid Listen 80 User apache Group apache ServerName kagami.hiiragi.com:80 DocumentRoot "/var/www/html" LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_default_module modules/mod_authz_default.so LoadModule dir_module modules/mod_dir.so LoadModule mime_magic_module modules/mod_mime_magic.so LoadModule alias_module modules/mod_alias.so LoadModule cgi_module modules/mod_cgi.so LoadModule mime_module modules/mod_mime.so <Directory /> Order Allow,Deny Deny from All </Directory> <Directory /var/www/html> Order Deny,Allow Allow from All Options +ExecCGI </Directory> <Directory /var/www/cgi-bin> Order Deny,Allow Allow from All </Directory> <Files ~ "^\.ht"> Deny from All </Files> TypesConfig /etc/mime.types ScriptAlias /cgi-bin/ /var/www/cgi-bin/ DirectoryIndex index.html AddDefaultCharset off MimeMagicFile conf/magic
ここでは、ドキュメントルートにCGIの実行権をつけてみた。よって、test.plを実行する場合は、 http://server/cgi-bin/test.pl としてアクセスしてみると、ブラウザに「JAM took a sailor blouse away. 」などとちょろっと表示されるはずである。
※CGIが実行できずに陥りやすい罠※
このblogではすでに述べたとおりCGIの中身については守備範囲外としている。が、一般的に陥りやすい問題を紹介しておくので、CGIが実行できない場合に参考にしてもらいたい。
チェックポイント1:CGIに実行権限が無い
CGIプログラム、あるいはCGIスクリプトに実行権限が無いことがよくある。一般的にApache(httpd)はnobodyやapacheアカウントで実行され、その権限でCGIプログラム、あるいはCGIスクリプトにアクセスしてくるので、ファイルのオーナーにだけ実行権限を付けているような場合は実行できないことが多い。
[root@kagami conf]# ls -la /var/www/cgi-bin/ 合計 12 drwxr-xr-x 2 root root 4096 11月 27 16:30 . drwxr-xr-x 6 root root 4096 11月 20 12:06 .. -rwxr-xr-x 1 root root 96 11月 27 16:24 test.pl
上記のように、「読み取り権」と「実行権」がきちんと付与されている事を確認する。
なお、間抜けな例としては、そもそもcgi-binディレクトリにアクセス権が無いなんてこともある。ディレクトリやファイルのパーミッションについてはよくチェックしておくように。
チェックポイント2:シェバングの記述が無いか間違っているか、またはそれが正確にファイルの「先頭」でない
「シェバング」とは、ファイルの先頭行に配置される、「#!」で始まる行のこと。実行されるファイルが何らかのスクリプトファイルである場合、そのスクリプトファイルを正しく理解できるコマンドが何であるかをシェルインタプリタに通知する役割を担っている。
たとえば、一般的なシェルスクリプトなら、シェバングは
#!/bin/sh
とか、
#!/bin/bash
とかいう具合になる。perlスクリプトであれば、
#!/usr/bin/perl
と書くのが「一般的」である。
「一般的」ではあるが、perlの場合、もしかしたら他のディレクトリにインストールされていることもたまにあるようなので、whichコマンドなどで正確な所在を確認しておく。
[root@kagami conf]# which perl /usr/bin/perl
こんな具合に。
で、たとえばWindowsな環境で開発されたCGIをそのままUNIX/Linux環境に持ち込むと、このシェバングが「#!c:/perl/bin/perl」とか当たり前のように記述されていてUNIX/Lnux環境では実行できないことになる。ここを正しく修正する。
また、シェバングは『厳密にファイルの先頭』でなければならない。スクリプトの先頭にタイトルとかコピーライトとか誇らしげに書きたい気持ちは良くわかるが、そんなものを差し置いてとにかく最初にはシェバングから書き出さなければならないのであった。変な空白や改行もなしに、とにかく正しくシェバングを記述するように。
チェックポイント3:改行コードの変換がおかしくなっていないか?
UNIX/Linux上でviとか使ってガリガリCGIを書いている人にはあまり発生しない問題だが、Windows上のエディタを使い、ftpなどでファイルをサーバ上に配置している場合に生じる恐れがある問題。
CGIスクリプトは「テキストファイル」なので、WindowsとUNIX/Linuxとの間で文字コードや改行コードの変換を行う必要が生じる。ftpのモード設定が正しくない場合、これが正しく行われずに問題を引き起こすことがある。
チェックポイント4:「Content-type: text/html」の出力をしていない、タイプミスがある、出力直後の改行が1個しかない
先のCGIスクリプトのサンプルをよ~く見てもらうと判ると思うが、「print "Content-type: text/html\n\n";」と、「\n」(改行コード)が2個入っているところが重要。1個しかないとInternal Server Error等となったりする。空白の入れ方や記号の使い方等についても、1字1句間違えることなく指定しなければならない。
チェックポイント5:そもそもCGIにバグがある…
┐(´ー`)┌
コメント 0