ぼろサーバ改め新サーバの作成-その6

■CGI(Perl)を動かす  なんとか、修理後、サーバは安定してきたので、引き続き、サーバの設定。今回はCGI(Perl)が動くようにしてみる。  PHPやJavaが主流の今日、CGI(Perl)は古めかしいが、一応未 … “ぼろサーバ改め新サーバの作成-その6” の続きを読む

■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、中のデータも同様にする。

Fedora10でのcgiの設定

Apacheが動くようになって、他のマシンからもHPが見えたので、つぎはCGIを使えるようにした。まず、geditなどでhttpd.confを開きCGIが実行できるようにする。 1.「Options ExcecCGI」  … “Fedora10でのcgiの設定” の続きを読む

Apacheが動くようになって、他のマシンからもHPが見えたので、つぎはCGIを使えるようにした。
まず、geditなどでhttpd.confを開きCGIが実行できるようにする。

1.「Options ExcecCGI」 を追加

2.CGI用のAddhandler を有効化

3.CGIの表示で文字化けがひどい場合は、WindowsからCGIのスクリプトをアップしている場合は、表示言語の指定をスクリプトの指定( META http-equiv=”Content-Type” content=”text/html; charset=Shift_JIS” など)に優先させるには「addDefaultcharset UTF-8」が有効になっていたら無効にしてみる。HPが文字化けする場合もこれを試す。

4.SELinuxの設定 「Allow CGI support」にチェックを入れる。

あとは、Apache(httpd)を再起動。

5.その他、CGI関連。
パールのパスを変えるcgiスクリプトの先頭行には、

#!/usr/bin/perl

と書いている場合は良いが、

#!/usr/local/bin/perl

と書いてある場合は、修正するか、

cgi用にこの記述でperlでcgiが記述できるようシンボリックリンクを張る。

ln -s  /usr/bin/perl   /usr/local/bin/perl

こうすると、どちらでもよくなる。

・CGI実行時にInternal Server Error(インターナルエラー)となる場合の対処法
Linuxでの改行はコード LF のみなので、DOS(Windows)上で作成したcgiスクリプトが動かないことの回避。

#!/usr/bin/perl  ← このあとにCR+LFが入ってエラーとなる。なので、

#!/usr/bin/perl --  ← を追加してオプション指定と勘違いさせると、うまく動く。

CGI実行のためのApache設定

Fedoraインストール後に、CGIを動かすための設定。 confファイル内では、 <Directory “/ver/www/cgi-bin”>    ….    Options Ex … “CGI実行のためのApache設定” の続きを読む

Fedoraインストール後に、CGIを動かすための設定。
confファイル内では、

<Directory “/ver/www/cgi-bin”>
   ….
   Options ExecCGI   ← この設定がない場合追加
   ….

AddHandler cgi-script .cgi  ← この設定を有効化

cgi用に/usr/local/bin/perlでcgiが記述できるようシンボリックリンクを張る。

ln -s /usr/bin/perl /usr/local/bin/perl

Linuxでの改行はコード LF のみなので、DOS(Windows)上で作成したcgiスクリプトが動かないことの回避。

# /usr/bin/perl ← このあとにCR+LFが入ってエラーとなる。なので、
# /usr/bin/perl – –  ← を追加してオプション指定と勘違いさせると、うまく動く。