2012年12月4日火曜日

PerlのCGIでよくお目見えするInternal Server Error 解決法


PerlのCGIでフォームからpostでデータ取得するサンプルです。
とりあえずhttpdをインストールするあたりから記載していますが、
必要なところから参考にしていただければ。

Amazon Linux の場合、CGI.pmがないのでインストールする手順も記載していますが、
CentOSならおそらくデフォルトインストールされているのでその手順は不要です。

Internal Server Error を発生させその解決法も併せて記載しています。

■構成情報
・OS: Amazon Linux AMI release 2012.09(64bit)
・Perl: 5.10.1


■httpdインストール
[root@ip-10-77-30-12 ~]# yum -y install httpd
(中略)
===========================================================================
 Package              Arch       Version              Repository      Size
===========================================================================
Installing:
 httpd                x86_64     2.2.23-1.25.amzn1    amzn-updates   1.2 M
Installing for dependencies:
 apr                  x86_64     1.4.6-1.10.amzn1     amzn-main      110 k
 apr-util             x86_64     1.4.1-4.13.amzn1     amzn-main       87 k
 apr-util-ldap        x86_64     1.4.1-4.13.amzn1     amzn-main       17 k
 generic-logos        noarch     16.0.0-1.4.amzn1     amzn-main      588 k
 httpd-tools          x86_64     2.2.23-1.25.amzn1    amzn-updates    75 k

Transaction Summary
===========================================================================
(省略)

■CGI動作設定
[root@ip-10-77-30-12 ~]# cd /etc/httpd/conf/
[root@ip-10-77-30-12 conf]# cp -p httpd.conf httpd.conf.org
[root@ip-10-77-30-12 conf]# vi httpd.conf
[root@ip-10-77-30-12 conf]# diff httpd.conf httpd.conf.org
797c797
< AddHandler cgi-script .cgi
---
> #AddHandler cgi-script .cgi
[root@ip-10-77-30-12 conf]#

■サンプルhtml(radio.html)作成
htmlプログラムは表示上の都合のため画像でご勘弁を。

■サンプルcgi(radio.cgi)プログラム作成
[root@ip-10-77-30-12 ~]# vi /var/www/cgi-bin/radio.cgi
[root@ip-10-77-30-12 ~]# cat /var/www/cgi-bin/radio.cgi
#!/usr/bin/perl

use CGI;
$form_data = new CGI;

$goods = $form_data->param('goods');

print "Content-type: text/html\n\n";
print "\n";
print "$goods が購入されました。\n";
print "\n";
[root@ip-10-77-30-12 ~]#

■cgiプログラムテスト実行
[root@ip-10-77-30-12 ~]# perl /var/www/cgi-bin/radio.cgi
Can't locate CGI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /var/www/cgi-bin/radio.cgi line 3.
BEGIN failed--compilation aborted at /var/www/cgi-bin/radio.cgi line 3.
[root@ip-10-77-30-12 ~]#
エラー発生。
perlモジュールとしてCGI.pmがインストールされているか調査
[root@ip-10-77-30-12 ~]# find `perl -e 'print "@INC"'` -name '*.pm' -print | grep CGI
find: `/usr/local/lib64/perl5': No such file or directory
find: `/usr/local/share/perl5': No such file or directory
[root@ip-10-77-30-12 ~]#
ないのね…。

■CGI.pmインストール
[root@ip-10-77-30-12 ~]# yum -y install perl-CGI
(中略)
 Package        Arch         Version               Repository     Size
=======================================================================
Installing:
 perl-CGI       x86_64       3.51-127.15.amzn1     amzn-main     216 k

Transaction Summary
=======================================================================
Install       1 Package(s)

Total download size: 216 k
Installed size: 434 k
Downloading Packages:
perl-CGI-3.51-127.15.amzn1.x86_64.rpm                | 216 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : perl-CGI-3.51-127.15.amzn1.x86_64                    1/1
  Verifying  : perl-CGI-3.51-127.15.amzn1.x86_64                    1/1

Installed:
  perl-CGI.x86_64 0:3.51-127.15.amzn1

Complete!
[root@ip-10-77-30-12 ~]#

■cgiプログラム再テスト
[root@ip-10-77-30-12 ~]# perl /var/www/cgi-bin/radio.cgi
Content-type: text/html

<body>
 が購入されました。
</body>
[root@ip-10-77-30-12 ~]#
エラーは解消。

■ブラウザで動作確認
CGIを実行させると…、
Internal Server Error キター!(T-T)
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

------------------------------------------------------------------------

Apache/2.2.23 (Amazon) Server at 54.xxx.xxx.xxx Port 80
原因はradio.cgiファイルに実行権がないためです。

■実行権追加
[root@ip-10-77-30-12 ~]# chmod 755 /var/www/cgi-bin/radio.cgi
もう一度ブラウザから同じようにCGIを実行させると・・・、
上記のように正しく表示されました。

■ Content-type: text/htmlも大事
下記のように「Content-type: text/html」を出力し忘れたcgiプログラムを作成すると、
[root@ip-10-77-30-12 ~]# vi /var/www/cgi-bin/radio.cgi
[root@ip-10-77-30-12 ~]# cat /var/www/cgi-bin/radio.cgi
#!/usr/bin/perl

use CGI;
$form_data = new CGI;

$goods = $form_data->param('goods');

print "\n";
print "$goods が購入されました。\n";
print "\n";
[root@ip-10-77-30-12 ~]#
期待通り?Internal Server Errorが出現しますのでお忘れなく。

0 件のコメント:

コメントを投稿