pgintro.net

CGI

作成日時:2019/03/28

更新日時:2019/03/28

スポンサーリンク

この記事の確認環境

サーバー

$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

$ apachectl -v
Server version: Apache/2.4.6 (CentOS)

$ file -v
file-5.11

$ perl -v
This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
(with 38 registered patches, see perl -V for more detail)

以下エラーがApacheのエラーログに表示される場合に確認する項目

ブラウザからCGIファイルにアクセスした際にブラウザに「Internal Server Error」と表示され、以下エラーログが出力されている場合。

AH01215: (2)No such file or directory: exec of '/var/www/html/perl.cgi' failed
End of script output before headers: perl.cgi

ファイル及びディレクトリが存在するか。

ファイル内の改行コードが環境に合っているか。

SELinuxが有効になっているか、有効の場合は適切にアクセス許可が設定されているか。

シェバン行が正しいかもこのエラー?

改行コード名称改行コードOS
CR(carriage return)\rMac OS 9
LF(line feed)\nUnix
CRLF\r\nWindows

Windowsで作成したファイルをUnixサーバーにアップロードした場合、ファイルの改行コードが「\r\n」のままとなっており、Unixサーバーの文字コード「\n」に修正する必要がある場合があります。

改行コードの確認方法

fileコマンド

以下のような結果が返ってきた場合は改行コードは「CRLF」になっているため、変換が必要です。

$ file /var/www/html/perl.cgi
/var/www/html/perl.cgi: UTF-8 Unicode text, with CRLF line terminators

以下のような結果が返ってきた場合は改行コードは問題ありません。

$ file /var/www/html/perl.cgi
/var/www/html/perl.cgi: Perl script, UTF-8 Unicode text executable

perlコマンドで改行コードの変換を行う場合は以下のようなコマンドで実行可能です。

Windowsで作成した(改行コードに\r\nが使用されている)ファイルをUnix用(改行コードに\nが使用されている)ファイルに変換する場合

「windows.txt」の部分には変換したいファイルを指定します。

「unix.txt」の部分には変換後のファイル名を指定します。

perl -pe 's/\r//' windows.txt > unix.txt

Unixで作成した(改行コードに\nが使用されている)ファイルをWindows用(改行コードに\r\nが使用されている)ファイルに変換する場合

「unix.txt」の部分には変換したいファイルを指定します。

「windows.txt」の部分には変換後のファイル名を指定します。

perl -pe 's/\n/\r\n/' unix.txt > windows.txt

確認する項目

シェバ行のパスが正しいか確認

Perl CGI

以下のようなエラーがApacheのエラーログ「/var/log/httpd/error_log」に出力されている場合

アクセスしたファイルがあるディレクトリのOptionsにExecCGIが設定されていない

Options ExecCGI is off in this directory: /var/www/html/

適切なパーミッションが設定されていない

AH01215: (13)Permission denied: exec of '/var/www/html/perl.cgi' failed
End of script output before headers: perl.cgi

または、パーミッションが適切なのにエラーが出る場合はSELinuxの設定がされていない可能性があります

コンテキストの設定ファイル

/etc/selinux/targeted/contexts/files/file_contexts

getenforceコマンドでSELinuxが有効か確認できます。

Enforcingと出力された場合は有効状態です。

$ getenforce
Enforcing

setenforceコマンドでSELinuxの有効無効化が行えます。

以下コマンドにて一時的に無効化し、エラーが解消されるようであればSELinuxが原因です。

# setenforce 0

アクセスしたファイルが読み込んでいるモジュールがインクルードパス内に存在しない

AH01215: Can't locate XXXX.pm in @INC (@INC contains: /perl .) at /var/www/html/perl.cgi line 1.
AH01215: BEGIN failed--compilation aborted at /var/www/html/perl.cgi line 1.
End of script output before headers: perl.cgi
/etc/selinux/targeted/contexts/files/file_contexts

「Can't locate CGI/Carp.pm」エラー

End of script output before headers: perl.cgi
AH01215: Can't locate CGI/Carp.pm in @INC (@INC contains: /perl .) at /var/www/html/perl.cgi line 1.
AH01215: BEGIN failed--compilation aborted at /var/www/html/perl.cgi line 1.
End of script output before headers: perl.cgi

yumコマンドの場合は以下でインストール

# yum install perl-CGI

「Can't locate LWP.pm」エラー

Can't locate LWP.pm in @INC (@INC contains: /perl .) at /var/www/html/perl.cgi line XXX.
BEGIN failed--compilation aborted at /var/www/html/perl.cgi line XXX.

「Can't locate Digest/MD5.pm」エラー

ブラウザ上の表示例

Software error:
Can't locate Digest/MD5.pm in @INC (@INC contains: /perl .) at /var/www/html/perl.cgi line XXX.
BEGIN failed--compilation aborted at /var/www/html/perl.cgi line XXX.

Apacheエラーログの表示例

perl.cgi: [Sun Jan  1 00:00:00 2019] perl.cgi: Can't locate Digest/MD5.pm in @INC (@INC contains: /perl .) at ./perl.cgi line XXX., referer: http://localhost/index.html
perl.cgi: [Sun Jan  1 00:00:00 2019] perl.cgi: BEGIN failed--compilation aborted at ./perl.cgi line XXX., referer: http://localhost/index.html
perl.cgi: Compilation failed in require at /var/www/html/perl.cgi line XXX., referer: http://localhost/index.html

原因

「perl-Digest-MD5」パッケージがインストールされていないため、以下コマンドにてインストール

# yum install perl-Digest-MD5

「Can't locate LWP/Simple.pm」エラー

ブラウザ上の表示例

Software error:
Can't locate LWP/Simple.pm in @INC (@INC contains: /perl .) at /var/www/html/perl.cgi line XXX.
BEGIN failed--compilation aborted at /var/www/html/perl.cgi line XXX.
For help, please send mail to the webmaster (root@localhost), giving this error message and the time and date of the error.

Apacheエラーログの表示例

AH01215: [Sun Jan  1 00:00:00 2019] perl.cgi: Can't locate LWP/Simple.pm in @INC (@INC contains: /perl .) at /var/www/html/index.cgi line XXX., referer: http://localhost/
AH01215: [Sun Jan  1 00:00:00 2019] perl.cgi: BEGIN failed--compilation aborted at /var/www/html/perl.cgi line XXX., referer: http://localhost/