「#!/usr/bin/perl –」はFTP転送モードの問題? 実はFTPサーバ設定の問題

Perl のパス 「#!/usr/bin/perl -w」では正常に動くのに、「#!/usr/bin/perl」では「Internal Server Error」に。

cgiスクリプトの記述や設定が正しくなかったり、サーバ内部でエラーが発生した場合に返されるのが「Internal Server Error (HTTPステータスコード500)」。エラーがあるのは分かるが、原因がわからない、Webエンジニアにとって頭を悩ます「Internal Server Error」。

その原因も様々。原因が明らかにできなければ対策も解決もできない。Perl パスの問題かと思いきや、FTPの転送モードの問題?、実はFTP サーバ設定の問題というちょっと複雑。そんな問題に直面した備忘メモ。

現象

  1. FTP を使ってアスキーモードでファイルをアップロード
  2. Perl のパス 「#!/usr/bin/perl」 では cgi が 「Internal Server Error (HTTPステータスコード500)」に
  3. Perl のパス 「#!/usr/bin/perl -w」 または 「#!/usr/bin/perl --」 では正常に動作する
  4. 改行コードが問題と思ってファイルの改行コードを「LF」に変換
  5. 再度、FTP を使ってアスキーモードでファイルをアップロードしても同じ現象に
  6. 「あれれ」無限ループにはまる。

さらに突き詰めると、

シェル上でスクリプトを走らせると、

/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 サーバの設定も診てみよう。

関連サイト

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

最近の投稿

カテゴリー

アーカイブ