人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Apache 2.0.54で mod_perlを導入したところ、通常のCGIとしては正しく動いていたものが動かなくなりました。error_logには Premature end of script headers が出ます。mod_perl を Loadしなければ正しく動くので、改行コードがどうとかそういうよくある問題ではないです。また httpd.confでは
PerlOptions +ParseHeaders としています。
mod_perlは経験がないため、どのようなデバッグ方法があるかわかりません。誰か教えてください。

●質問者: tebukuro
●カテゴリ:ウェブ制作
✍キーワード:2.0 Apache CGI httpd mod_perl
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● redcherry
●50ポイント

http://sagittarius.dip.jp/~toshi/premature.html

Premature end of script headers

Apache2.0.X+mod_perlで Premature end of script headers が出た場合の解決方法がいくつか載ってます。


最初のURLにある1番

#! /usr/bin/perl --

を付けるとなぜか直る。


2番目のURLにある4番

httpd.confを確認


2番目のURLにある5番

ディレクトリのパーミッション

なんと!777 だと動かない!!

755 などにして試してみる。


などが怪しそうですね。

http://xiaoxia.exblog.jp/m2004-09-01/#1078664

女プログラマってどうよ?:2004年09月

◎質問者からの返答

ありがとうございます。いずれも試したけどダメでした。。


2 ● ootatmt
●0ポイント

http://www.din.or.jp/~bigstone/cgilab/cgitips/mod_perl.html

Apache+mod_perlでCGIを使うには?

URLのページの以下の部分を参考に httpd.cong を変更してみてはどうでしょうか。


3. Apache (httpd.conf) の設定

http://www.din.or.jp/~bigstone/cgilab/cgitips/mod_perl1.html

Apache+mod_perlでCGIを使うには?

◎質問者からの返答

そんなgoogleで上位に出てくるようなページは当然チェック済みです。


3 ● 浅倉卓司
●50ポイント

http://perl.apache.org/docs/2.0/user/config/config.html#C_SetupE...

mod_perl: mod_perl 2.0 Server Configuration

httpd.confのPerlOptions以外の設定がどうなっているかにもよるのですが、例えば下記のような設定ではいかがでしょうか?


----

PerlModule ModPerl::Registry

<Location /perl>

SetHandler perl-script

PerlResponseHandler ModPerl::Registry

Options +ExecCGI

</Location>

◎質問者からの返答

それって標準的な設定ですよね。。すみませんがあまり参考になりません。

Premature end of ... ってことは、スクリプトがヘッダを吐く際に想定外のものがhttpdに渡っていると思うのですが、非mod_perl下では何も出ないし、当然shell上で実行しても想定どおり Content-Type: 等のヘッダが出ます。mod_perl上で動作している時に、スクリプトが何を吐いているかを知る方法を教えてください。


4 ● 浅倉卓司
●0ポイント

http://perl.apache.org/docs/2.0/api/ModPerl/Registry.html#Debugg...

mod_perl: ModPerl::Registry - Run unaltered CGI scripts persistently under mod_perl

失礼しました。

(サンプルのスクリプトが動いているのかどうかすら分からなかったものですから)


参考URLにあるデバッグオプションを設定してはいかがでしょうか。

あるいはModPerl::Registryを継承したデバッグ用のハンドラを書くのが良いかと思います。

◎質問者からの返答

うーんちょっとよくわかりませんでしたが、ありがとうございます。


5 ● redcherry
●0ポイント

http://modperlbook.org/html/ch21_04.html

英語ですが、mod_perlによるデバッグトレースを表示させる方法です。

要約すると


perl Makefile.PL PERL_TRACE=1 でmod_perlをリコンパイルする


環境変数MOD_PERL_TRACEを適切に設定する。たとえばhttpd.confにて

PerlSetEnv MOD_PERL_TRACE all とかシェルから

export MOD_PERL_TRACE=all とか

setenv MOD_PERL_TRACE all など


httpdをデバッグモードで動かす。たとえば

./httpd -X


そうするとhttpdを起動したターミナルにデバッグトレースが出てきます。

それを追っていけば何かわかるかもしれません。


あと、これは設定の点で気になった部分なんですが、shell上で動かしたらContent-Type:?が出るということですが、httpd.confにてPerlSendHeader Onになってますよね?

老婆心ながら、少々気になったもので。

「当然チェック済み」であるならば、失礼をどうかお許しくださいませ。

◎質問者からの返答

商用UNIXでバイナリで提供されているmod_perlを使っているので、再コンパイルはむずかしいです。 -Xオプションもよくわかりませんでした。

PerlSendHeader On は、PerlOptions +ParseHeaders が相当していると思います。

が、

偶然、うまく動くようになりました!

$|++;

print ”Content-type: text/html¥n”;

print ”Pragma: no-cache¥n”;

print ”Cache-control: no-cache¥n¥n”;

としていたのですが、$|への代入を、ヘッダ出力の後に

もってくると正しく動作するようになりました。

これはこれで謎なのですが、あらためて質問してみます。

ありがとうございました。


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ