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) | \r | Mac OS 9 |
LF(line feed) | \n | Unix |
CRLF | \r\n | Windows |
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/