Perl のパス 「#!/usr/bin/perl -w」では正常に動くのに、「#!/usr/bin/perl」では「Internal Server Error」に。
cgiスクリプトの記述や設定が正しくなかったり、サーバ内部でエラーが発生した場合に返されるのが「Internal Server Error (HTTPステータスコード500)」。エラーがあるのは分かるが、原因がわからない、Webエンジニアにとって頭を悩ます「Internal Server Error」。
その原因も様々。原因が明らかにできなければ対策も解決もできない。Perl パスの問題かと思いきや、FTPの転送モードの問題?、実はFTP サーバ設定の問題というちょっと複雑。そんな問題に直面した備忘メモ。
現象
- FTP を使ってアスキーモードでファイルをアップロード
- Perl のパス 「#!/usr/bin/perl」 では cgi が 「Internal Server Error (HTTPステータスコード500)」に
- Perl のパス 「#!/usr/bin/perl -w」 または 「#!/usr/bin/perl --」 では正常に動作する
- 改行コードが問題と思ってファイルの改行コードを「LF」に変換
- 再度、FTP を使ってアスキーモードでファイルをアップロードしても同じ現象に
- 「あれれ」無限ループにはまる。
さらに突き詰めると、
シェル上でスクリプトを走らせると、
/usr/bin/perl^M: bad interpreter: No such file or directory
とエラーに
さらに突き詰めると、
FTP サーバに vsftpd を使っている
原因
FTP サーバ vsftpd では、ファイルの改行コードが変換されないこと。
解決
改行コードを「LF」に変換するだけという、単純なものではありません。
実際は、ファイルをアスキーモードでFTPアップロードしても、改行コード「LF」に変換されません。
それは、FTP サーバ vsftpd ではアスキーモードでのダウンロード・アップロードのデフォルト設定が無効になっているから。
ということで vsftpd の設定をしてみる。
1. vsftpd の設定をする
シェル上で vsftpd.conf を編集。
vi /etc/vsftpd/vsftpd.conf
設定内容を
ascii_download_enable=NO
ascii_upload_enable=NO
から
ascii_download_enable=YES
ascii_upload_enable=YES
に変更して有効に
2. vsftpdを再起動
service vsftpd restart
3. ファイルを再度アップロードする
4. 確認。Perl のパス「#!/usr/bin/perl」でうまく表示できた。
complete!!
教訓
FTPの転送間違えの他、視野を広げてFTP サーバの設定も診てみよう。