ApacheのCGI設定について教えてください

このQ&Aのポイント
  • 古いパソコンにfedora core 4をインストールしてローカルのテスト用サーバーにしようとしていますが、ユーザーのホームディレクトリに設置したperl CGIがinternal server errorになってしまいます。
  • httpd.confの設定では、UserDirをdisableにしており、ユーザーのpublic_htmlディレクトリにはAllowOverride All、Options Includes ExecCGI FollowSymLinks、SetHandler cgi-scriptの設定がされています。
  • エラーログにはPremature end of script headersというエラーメッセージが表示されており、/var/www/htmlディレクトリでは問題なく動作するため、Apacheの設定の問題である可能性があります。
回答を見る
  • ベストアンサー

apacheのCGI設定について教えてください。

CGIの勉強のために、古いパソコンに fedora core 4 をインストールしてapache でローカルのテスト用サーバーにしようとしています。 /var/www/html に設置した簡単な perl CGI は動くのですが、同じものをユーザーのホームディレクトリに設置すると、internal server error になってしまいます。 ***** 以下 httpd.confの抜粋です。***** #UserDir disable UserDir public_html <Directory /home/*/public_html> AllowOverride All Options Includes ExecCGI FollowSymLinks SetHandler cgi-script </Directory> AddHandler cgi-script .cgi .pl ************************************** サーバーのエラーログを見ると Premature end of script headers: test.cgi となっています。htmlをprintしているだけのスクリプトで、/var/www/html では動くので、apache の設定の問題かと思っています。 ちょっとカテゴリーが違うかもしれませんが、よろしくお願いします。

  • g_p_
  • お礼率78% (26/33)
  • Perl
  • 回答数5
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

たとえば ユーザー tarou でディレクトリが/home/tarou/public_htmlなら root権限で # chown tarou:tarou /home/tarou/public_html/*.cgi として .cgiファイルの所有者を、そのユーザーディレクトリに合わせてください。 #1さんの書かれたようにsuexecが原因だと思いますが そのままコピーしたのならfileの所有者が問題になります。 その他にはsuexecの場合、、、 ## .cgiフアイルのパーミッションは 700 でOKです。   755や705でも動きますが777や707ではエラーになります ## .cgiを置くディレクトリのパーミッションは 701で OK   755や、、以下同上 ### 要するにsuexecの場合 1. cgiの所有者がユーザーディレクトリと一致しないと駄目 2. cgiやそのディレクトリに他の人が書き込み権限があると駄目 3. 今回は該当しませんが ユーザーのドキュメントディレクトリを勝手にpublic_html以外にしてもエラーになります    (↑設定変更してApacheのコンパイルしなおさない限りは)

g_p_
質問者

補足

ご指摘ありがとうございます。 別な急ぎの仕事が入ってしまって、試してみる時間が取れなくなってしまいました。 判りやすく指摘していただいて、感謝いたします。 ただ、上記のような状況ですので、結果はしばらくお待ち下さい。

その他の回答 (4)

回答No.5

しつこいですが、更に付けたし 最初の質問である .cgiにアクセスして500errorになる件と SetHandler cgi-script によって普通の.htmlでエラーになる件は別の原因かと思います .cgiにアクセスしてエラーになる原因が #2にて書いたような事であれば logs/suexec.logに 原因が記録されているはずです。 バージョンによって多少の文言は違いますが ・ .cgiファイルの所有者とディレクトリが違う場合    target uid/gid (***/***) mismatch with directory (***/***) or program (0/0) ・  ディレクトリや.cgiに他者の書き込み権限がある場合     file is writable by others: (/home/tarou/public_html/test1/hoge.cgi) ・  コンパイルし直しせずにpublic_html 以外をユーザードキュメントディレクトリにした場合    cannot get docroot information ##そうじゃなくて .htaccessの記述に問題がある場合は .htmlのと .cgiのエラーの原因は同じですが、 その場合は logs/error_log に .htaccess に問題がある旨、記録されます 例えば、有効な .htaccesに test と記述すると test という構文は有りませんので 中略/.htaccess: Invalid command 'test', perhaps mis-spelled などと成ります。 また文法的には問題なくてもAllowOverrideで許可されていない記述をするとエラーになりますが 質問者さんの場合は AllowOverride All と全許可してますので、こちらの可能性は低いですね

g_p_
質問者

お礼

umasikajiro 様、遅くなって申し訳ありません。 ご指摘のように所有者等の条件をそろえて、SetHandler cgi-script の行を削除したら、うまく動作するようになりました。 少しだけApacheの理解が深まりました。今後も精進いたします。 理解しやすいご指摘と回答に感謝いたします。 本当にありがとうございました。

回答No.4

見落としてました、、、 >SetHandler cgi-script これを記述しちゃうと、該当ディレクトリ中のfileは .txt や .gifだろうと .htm だろうとCGIとして扱われます ですので中身が普通のHTMLのままの .htmlファイルにアクセスすれば当然500errorになります

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.3

httpd.confや.htaccessの記述(構文等)に間違いがあると 無条件にエラーになる場合があります。 修正した個所等の再チェックをお勧めします。

g_p_
質問者

お礼

ご指摘ありがとうございます。 私自身も不安になってきたので、httpd.conf のバックアップを戻して 最初からやり直してみました。

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.1

suEXEC機能でそのユーザーの権限で実行しているのが原因だと思います。 suEXECを無効にして動作するなら間違いないと思いますので、 以下の行があればコメントアウトして確認してみてはどうでしょう? LoadModule suexec_module modules/mod_suexec.so

g_p_
質問者

お礼

早速ありがとうございます!。 教えて頂いた箇所をコメントアウトして、httpd restart してやってみたんですが、うまくいきませんでした。同じ結果です。 suEXEC機能について知らないので、今から調べてみます。 今更で申し訳ないんですが、なんと、CGI じゃない HTML のドキュメントも同じ Internal Server Error がでます。 何か根本的なところが間違っているんでしょうか? もう少し悪あがきしてみます。もし、初心者が陥りやすい事等、気がついた事がありましたら、ご指摘いただけたらありがたいです。

関連するQ&A

  • apacheのCGI設定

     pc9821にFreeBSD(98)をいれapache1.3を起動させています。cgiはlight.cgiというソフトをつかっています。なかなかcgiがうまくいきません。参考ページには public_html / index.html (トップページ) | +-- bbs / light.cgi [755] | admin.cgi [755] ・・・・(省略) +-- lock [777] / | +-- past [777] / 0001.cgi [666] とかかれていますが、実際に私のサーバーにはpublic_htmlというフォルダは存在していなくて /usr/local/www/cgi-binにbbsというフォルダをつくり あとは上のようにしています。またindex.htmlは/usr/local/www/dataのなかにいれて表示してWebサーバーとしてはたらいています。またapacheの/usr/local/etc/apacheのhttpd.confは 関係ありそうな行だけあげると ServerRoot "/usr/local" DocumentRoot "/usr/local/www/cgi-bin" <Directory "/usr/local/www/cgi-bin/bbs"> Options Indexes FollowSymLinks MultiViews <location "/cgi-bin/"> Options ExecCGI AllowOverride AuthConfig Limit Order allow ,deny Allow from all </Location> <IfModule mod_mime.c> TypesConfig /usr/local/etc/apache/mime.types ADDHandler cgi-script .cgi </IfModule> ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin/" <Directory "/usr/local/www/cgi-bin/bbs"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> AddHandler cgi-script .cgi どこがおかしいのかおしえていただけないでしょうか?

    • ベストアンサー
    • CGI
  • Apach2.0 ホームディレクトリでCGIが

    こんにちは。 CGIの勉強をしています。 わかる方がいらっしゃいましたら、おしえてください。 ソースは、poderosaでつないでviにて作成。 ブラウザからのアクセス http://XXX.XXX.XXX.XXX/~admin/cgi-bin/test.cgi (test.cgi)755 #!/usr/bin/perl print "Content-type: text/html\n\n"; print "Hello\n"; ./test.cgi にて、Helloと表示される (httpd.confに追加したもの) UserDir public_html <Directory /home/*/public_html> AllowOverride All Options IncludesNoExec ExecCGI FollowSymLinks <Limit GET POST OPTIONS> Order allow,deny Allow from all </Limit> <LimitExcept GET POST OPTIONS> Order deny,allow Deny from all </LimitExcept> </Directory> 以下を追加したこともあり↓ <Directory /home/*/public_html/cgi-bin/> AllowOverride None Options ExecCGI SetHandler cgi-script Order allow,deny Allow from all AddHandler cgi-script .cgi </Directory> よろしくおねがいします。

  • RedHatLinux9でCGIがうまく動きません。

    RedHatLinux9でApache2x系なのですが、CGIがうまく動きません。 Server error! The server encountered an internal error and was unable to complete your request. Error message: Premature end of script headers: test.cgi error 500 が出てしまいます。 行った作業としては、 # UserDir public_html の#をはずす #AddHandler cgi-script .cgi の # を外す. # <Directory /home/*/public_html> <略> # Options MultiViews .... <略> # </Directory> の3カ所の # を外し,Options に ExecCGI を追加. /usr/sbin/suexec を削除 という、こちらの掲示板に書いてあった作業を行いました。cgiがまず動くのかどうか確かめるために /var/www/cgi-bin/ にtest.cgi(ほかのサーバで検証したcgiです)を送りましたが見れなかったです。 http://サーバのIP/cgi-bin/test.cgi でよいんですよね、上のcgiを確かめるパス。 これが間違ってたら。。。動かしたいのは一般ユーザの中でcgiが動くようにしたいのです。 パーミッションも問題なかったです。お願いいたします。

  • ユーザー毎のディレクトリでCGIを設置

    ユーザー毎のディレクトリでCGIを設置可能にしようとしているのですが、うまくいきません。 教えて下さい。 【環境】 Apache/2.0.40 Red Hat Linux 8.0 【httpd.confの設定抜粋】 DocumentRoot "/home/homepage/public_html" <Directory /home/homepage/public_html> Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> <IfModule mod_userdir.c> UserDir public_html </IfModule> <Directory /home/*/public_html> Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> #ScriptAlias /cgi-bin/ "/home/homepage/public_html/cgi-bin/" 【.htaccessの設定】 AddHandler cgi-script .cgi Options +ExecCGI 以上のような設定で #!/usr/bin/perl print "Content-type: text/html\n\n"; print "hello"; こんなCGIをつくって実行してみました。 /home/homepage/public_html/cgi-bin/においたものはうまくいくのですが /home/user/public_html/cgi-bin/においたものはエラーになってしまいます。 エラーの内容は↓のとおりです。 Server error! The server encountered an internal error and was unable to complete your request. Error message: Premature end of script headers: hello.cgi If you think this is a server error, please contact the webmaster Error 500 perlのパスは間違ってないし、パーミッションも755にしてあります。 どうすればいいのか分からず困っています。 どこを調べれみればいいのかだけでも教えていただけると助かります。 よろしくお願いします。

  • apache でバイナリのCGIを動かすには

    apache でバイナリのCGIを動かすにはどうすればよいのでしょうか? (なお、プログラム自体に問題は決してありません。『HTTPD』を使うと問題なく動作します) OS:WIN98 C++バイナリのCGIを呼び出すと下記エラーとなります。 Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please .... the error. More ... log. - Apache/1.3.12 Server at http://127.0.0.2/ Port 80 最終アクセスログ 127.0.0.1 - - [12/Mar/2001:23:20:27 +0900] "GET /ab.cgi HTTP/1.1" 500 610 最終エラーログ [Mon Mar 12 23:20:25 2001] [error] [client 127.0.0.1] Premature end of script headers: e:/www.homepage/kokucho81/ab.cgi apache の httpd.conf と httpd.conf.default との比較 ** httpd.conf ServerName http://127.0.0.2/ ** httpd.conf.default #ServerName new.host.name ** httpd.conf DocumentRoot "E:/WWW.HOMEPAGE/KOKUCHO81" ** httpd.conf.default DocumentRoot "C:/Apache/htdocs" ** httpd.conf <Directory /> Options FollowSymLinks ExecCGI AllowOverride None ** httpd.conf.default <Directory /> Options FollowSymLinks AllowOverride None ** httpd.conf <Directory "E:/WWW.HOMEPAGE/KOKUCHO81"> ** httpd.conf.default <Directory "C:/Apache/htdocs"> ** httpd.conf Options Indexes FollowSymLinks ExecCGI ** httpd.conf.default Options Indexes FollowSymLinks MultiViews ** httpd.conf AddHandler cgi-script .cgi ** httpd.conf.default #AddHandler cgi-script .cgi そもそも、設定が足りてないんでしょうか? apacheを良く使う方、よろしくお願いします。m(_ _)m

  • apache2.2の設定について

    あるディレクトリでsite_available中のファイルの設定が <Directory /var/hogehoge> Options ExecCGI -FollowSymLinks MultiViews AllowOverride All Order allow,deny Allow from all </Directory> となっているのですが、現在このhogehoge中のディレクトリでimageというディレクトリに置かれたgifファイル(すなわちvar/hogehoge/image/○○○.gif)をcgiとして認識されています。 これを回避するためにimage以下の場合はcgiではなくgifで認識させるようにしたいのですが、どうすればよいのでしょうか? apacheはdebian系のapache2.2系です。 宜しくお願い致します。

  • apacheとCGIの設定(httpd.conf)について

    Apache/1.3.26を使用しています。 CGIの定義の中に Alias /cgi-bin/ /usr/lib/cgi-bin <Directory /usr/lib/cgi-bin/> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> があるのですがこれは何を定義しているのでしょうか? また、ある指定のフォルダ /var/www/cgi-bin だけ CGI設置可能にするにはどうすればよいでしょうか?

  • httpd.confを添削してください!!(長文)

    こんにちわ いろいろと調べながらhttpd.confを自分の理想の動作を得るたねに設定したつもりです。 添削をお願いします。 /_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ DocumentRoot /var/www/html <Directory /> Options FollowSymLinks AllowOverride All </Directory> <Directory "/var/www/html"> #←home Options FollowSymLinks Includes AllowOverride All Order allow,deny Allow from all </Directory> #.htaccessを許可、cgiは不可、ssiは許可、シンボリックリンク許可 Order~略 <IfModule mod_userdir.c> UserDir public_html </IfModule> <Directory /home/*/public_html> AllowOverride AuthConfig Limit Options +ExecCGI +Includes </Directory> #ユーザー領域では.htaccessで認証、アクセス元などで制御の許可。 それ以外は不可。 homeでcgiが不可ですがここでは許可したいので+を付けた。 <Directory "/var/www/cgi-bin"> AllowOverride All Options ExecCGI Order allow,deny Allow from all AddHandler image .gif .jpg AddHandler text/html .htm .html </Directory> /_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ こんな感じなんですがどこかおかしいでしょうか?

  • Linux7.2のApacheのCGIについて

    CGIを作成してアクセスしたところInternalServerErrorとなってしまいました エラーログを参照したところ Premature end of script headers; /home/tenchan/public_html/cgi-bin/test.cgi となっていました。 原因がわからず困っておりますもしおわかりの方いらっしゃいましたら教えてください。 アパッチの設定は以下の点を修正しました AddHandler cgi-script .cgiのコメントをはずしました <Directory "/home/*/public_html/cgi-bin"> Options ExecCGI </Directory> test.cgiの内容は #!/usr/bin/perl print "Contetnt-type: text/html\n\n"; print "<HTML><BODY>Hello</BODY></HTML>"; です コンソールで実行した際には「Hello」と表示されたので test.cgiには問題はないと思います また、Linux上で作成しましたので改行コードなどの問題はないと思うのですが 何か参考になるようなアドバイスありましたらよろしくお願いします。

  • Redhat9のHTTPDでCGIがつかえない

    まずやりたい事はユーザーごとにWEBができるようにして、CGIをpublic_html以下のどこにでもCGIが使えるようにしたい思っています。 いろんなサイトを見てhttpd.confをいじってますが、どうしてもCGIを実行しても500エラーがでます。perlの場所はあっているんですが。 httpd.confのいじった所は、 <IfModule mod_userdir.c> UserDir public_html </IfModule> と <Directory /home/*/public_html> AllowOverride FileInfo AuthConfig Limit Options IncludesNoExec ExecCGI FollowSymLinks <Limit GET POST OPTIONS> Order allow,deny Allow from all </Limit> <LimitExcept GET POST OPTIONS> Order deny,allow Deny from all </LimitExcept> </Directory> と ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"をコメントアウトしました。もしよろしければご指導のほどよろしくおねがいします。