■CGI(Perl)を動かす
なんとか、修理後、サーバは安定してきたので、引き続き、サーバの設定。今回はCGI(Perl)が動くようにしてみる。
PHPやJavaが主流の今日、CGI(Perl)は古めかしいが、一応未だにあちこちでカウンターやらなんやらを使ってるので、ないとやっぱりちと困る。
まずは、Apacheのconfファイルをいじって、CGIの設定を行う。
1.Options にExecCGIを追加
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the realname directory are treated as applications and
# run by the server when requested rather than as documents sent to the client.
# The same rules about trailing “/” apply to ScriptAlias directives as to
# Alias.
#
ScriptAlias /cgi-bin/ “/var/www/cgi-bin/”
#
# “/var/www/cgi-bin\” should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory “/var/www/cgi-bin”>
AllowOverride None
Options ExecCGI <-ここを修正
Order allow,deny
Allow from all
</Directory>
2.CGIの表示で文字化けがひどい場合
WindowsからCGIのスクリプトをアップしている場合は、表示言語の指定をスクリプトの指定( META http-equiv=”Content-Type” content=”text/html; charset=Shift_JIS” など)に優先させるには「addDefaultcharset UTF-8」が有効になっていたら無効にしてみる。HPが文字化けする場合もこれを試す。
#
# Specify a default charset for all content served; this enables
# interpretation of all content as UTF-8 by default. To use the
# default browser choice (ISO-8859-1), or to allow the META tags
# in HTML content to override this choice, comment out this
# directive:
#
# AddDefaultCharset UTF-8 <-行の先頭に#をつけてコメント化し無効にする
3. AddHandler設定を有効化
AddHandler設定を有効化して、CGIスクリプトがハンドルされるようにする
#
# AddHandler allows you to map certain file extensions to “handlers”:
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
#
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add “ExecCGI” to the “Options” directive.)
#
AddHandler cgi-script .cgi <-ここの行の先頭の#をとる
4.シンボリックリンクを張る
cgi用に/usr/local/bin/perlでcgiが記述できるようシンボリックリンクを張る。一般的に配布されているCGIスクリプトは、perlの場所が、/usr/local/bin/perlで先頭行に書かれている事が多い。ここを修正してもいいが、そのまま使えるように、シンボリックリンクを張っておく。
コマンドラインで、
ln -s /usr/bin/perl /usr/local/bin/perl
を実行する。
5.CGI実行時Internal Errorが多発してうまく実行できない場合
主にこれは、WindowsとLinuxの行末の改行コードの違いによることが多い。サーバ上で、きちんと改行コードをLinuxに指定して保存しなおす。
または、Linuxでの改行はコード LF のみなので、DOS(Windows)上で作成したcgiスクリプトの先頭行の、
#!/usr/bin/perl ← このあとにCR+LFが入ってエラーとなる。なので、
#!/usr/bin/perl — ← を追加してオプション指定と勘違いさせると、うまく動くこともある
6.動作テスト
cgi-binに、次のPerlのテストスクリプトをおいてテスト。
#!/usr/bin/perl
##
## printenv — demo CGI program which just prints its environment
##
print “Content-type: text/plain; charset=iso-8859-1\n\n”;
foreach $var (sort(keys(%ENV))) {
$val = $ENV{$var};
$val =~ s|\n|\\n|g;
$val =~ s|”|\\”|g;
print “${var}=\”${val}\”\n”;
}
上記ファイルを、vi等で作成し、test.cgiなどのファイル名で保存。
実行権限(パーミッション)を与えておく
# chmod 755 /var/www/cgi-bin/test.cgi
LAN内の端末に移動し、ブラウザを起動、サーバのIPアドレスにつづけて/cgi-bin/test.cgiへアクセスしてみる。
DOCUMENT_ROOT=”/var/www/html”
GATEWAY_INTERFACE=”CGI/1.1″
HTTP_ACCEPT=”text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8″
HTTP_ACCEPT_ENCODING=”gzip,deflate,sdch”
HTTP_ACCEPT_LANGUAGE=”ja,en-US;q=0.8,en;q=0.6″
HTTP_CONNECTION=”keep-alive”
HTTP_COOKIE=”PHPSESSID=tijh4jn3dmo433un1kh49ievo0; wfvt_1999777401=5440b1d12f101″
HTTP_HOST=”www.ekbt.net”
HTTP_USER_AGENT=”Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36″
PATH=”/sbin:/usr/sbin:/bin:/usr/bin”
QUERY_STRING=””
以下略
などと、CGIスクリプトが実行され、結果が表示されればOK。
その他、日本語表示を含む時刻を表示するサンプルCGIスクリプト
#!/usr/bin/perl
##
## printenv — demo CGI program which just prints its environment
##
$time = time; # time関数は1970年1月1日0時0分0秒から現在までの秒数を返す
$jtime = localtime(time); # 日本時間のget
$gtime = gmtime(time); # グリニッジ標準時間のget(日本時間と9時間差)
print “Content-type: text/html; charset=utf-8\n\n”;
print “
testjp.cgi“;
print “1970年1月1日0時0分0秒からの現在までの秒数….$time
“;
print “<hr>”;
print “現在の日付時刻は
“;
print “日本時間:$jtime
“;
print “標準時間:$gtime
“;
print ““;
※Content-type: text/html; charset=utf-8は、サーバ本体で作成している場合。もしWindowsのShift_JISファイルをアップしたら Content-Type\” content=\”text/html; charset=Shift_JIS とする。
※cgiが実行できない場合、実行権限(パーミッション)の設定を確かめる。SELinuxを使用している場合、強制モードになっていたら、それを許容(SELinuxを切る、警告は表示される)にしてみる。
※許容でもダメなら、これはSELinuxのせいではない。ディレクトリやファイルのパーミッションやディレクトリ構造などをもう一度確認してみる。
※cgi実行時、cgiからのファイルの書き込みが出来ない場合がある。SELinuxを使っている場合、強制モードになっていたら、それを許容(SELinuxを切る、警告は表示される)にしてみると、書き込みOKとなる場合もある。
これで実行書き込みできれば、cgiよりの書き込みファイルがSELinuxの設定で書き込めない可能性がある。
cgi-binのディレクトリをhome以下に移動して、書き込まれるファイルのSELinuxの設定SELinux Contentをhttpd_user_rw_content_tにしてみる。
cgi格納フォルダーは、httpd_user_script_exec_tに
gifの画像データの格納フォルダーは、httpd_user_content_t、中のデータも同様にする。