2012年08月21日

perlでInternal Server Error 500が発生した場合の対処

【環境】OS:Linux系、Perl

最近また問い合わせがちょこちょこ来るのでメモ。

■ 原因1:改行コードが間違っている
Linux系の場合、行末の改行コードは「LF」にしなければならない。
しかし行末の改行コードが「CR+LF」になっているとエラーとなる。

なぜ「CR+LF」になってしまうのか?
Windowsの標準的なエディタで編集すると改行コードは「CR+LF」となる。そのままアップロードするとエラーとなる。

対応策としては、
A) 改行コードを変更できるエディタで編集し、FTPはバイナリモードでアップロードする。
B) エディタはそのまま編集し(CR+LF)、FTPソフトで変換してアップロードする。
C) サーバ上で変換する(ssh/telnetが出来る場合のみ可)

オススメはAです。なぜかというとFTPのソフトによって変な動きもあるから。

■ 原因2:先頭行のperlへのパスが間違っている
先頭行に「#!/usr/bin/perl」などと書いてあると思いますが、これはperlプログラムへのパスになりますのでサーバの環境によって変えなければきちんと動きません。
ssh/telnet可能な人はコマンドラインから
$ which perl
と実行するとperlへのパスが表示されるので正しく記載しましょう。
だいたいは「#!/usr/bin/perl」「#!/usr/local/bin/perl」のいずれかって感じですが。

■ 原因3:パーミッションが間違っている
cgiファイルのパーミッションは「755」です。
FTPソフトでパーミッションの確認・変更ができます。

■ 原因4:プログラムの文字コード
Perlのプログラムはまだ多くがEUCだったりしますので、文字コードがSJISやUTF8だと動かない場合があります。

やっぱりいちばん多いのは改行コードの間違いです。
「何も変えてないのに動かなくなった!」と言われた場合はこれが多いです。

サーバへSSH/Telnet接続出来る場合は「od」コマンドで改行コードを確認できます。
odコマンドはテキストファイルをダンプ出力するコマンドです。
# od -tcx test.cgi | more
0000000 # ! / u s r / b i n / p e r l \r
752f2123 622f7273 702f6e69 0d6c7265
0000020 \n \r \n $ e r r o r _ f l a g =
240a0d0a 6f727265 6c665f72 3d206761
一行目の末尾とニ行目の先頭に「\r」「\n」という文字が見えると思います。\rはCR、\nはLFのことです。ですので、このファイルの改行コードは「CR+LF」であることがわかります。

で、このファイルの改行コードをサーバ上で変換したい場合は以下のようにします。
$ perl -pe 's/¥n/¥r¥n/' < 元ファイル名 > 出力ファイル名


SSH/Telnet接続が可能であれば、サーバ上で正しく実行できるかどうかをチェックしたほうがいいです(実行するとDBを更新したりメールを送ったりする場合は注意)
posted by まきすけ at 16:52 | Comment(0) | TrackBack(0) | Linuxとか
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック