このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

Unix マシン上でcgiを動作させるための設定

発言者:とりうみあきこ
( Date Monday, May 10, 1999 16:24:15 )


はじめまして。

Unix上で、cgiを動作させるために必要な設定について調べています。
perlで簡単なcgiを作成し、サーバー上で動作させています。
telnetで
/url/local/bin/perl test.cgi
とすると、正しく動作しているのですが、
test.cgi
とすると、動作しません。
ksh: test.cgi 見つかりません
というメッセージが表示されます。
さらに、ブラウザ上からこのcgiを動作させようとした場合も
エラーがでます。
パーミッションの設定は755にしてありますので、動作すると思う
のですが・・・

サーバーはUnixで、CERN httpdを使っています。

別のサーバーでは、上記の動作はすべて正常です。

サーバーの管理側での設定の問題かと思ったりもするのですが、
サーバーの管理はしたことがないため、よくわからないのです。

もし、ご存知の方がいらっしゃいましたら教えていただけないでしょうか。
よろしくお願いいたします。

#この会議室の主旨からはずれていたら申し訳ありません。

usui , seiichi さんからのコメント
( Monday, May 10, 1999 17:11:07 )

CGIとは関係ないところだけについてです。

>とすると、正しく動作しているのですが、
>test.cgi
>とすると、動作しません。

 ./test.cgi
 でしょうか?

今井真人 さんからのコメント
( Friday, May 14, 1999 07:29:59 )

 まず、man httpdとしてマニュアルを見ます。

/usr/local/etc/httpd/conf/mime.typesというファイルが見えたら、
(上記のディレクトリとは違うかもしれません)

その内容をviでスーバーユーザから修正します。

application/x-httpd-cgi    cgi pl

という行をそれらしいところへ、追加します。前後の関係から
判断してください。

これで、httpdからcgiとして、.cgi .plというファイル名が認識
されるはずです。Unixマシンを再起動します。

 動かない場合は、もう一度、詳細に環境を報告してください。

佐藤 貴浩 さんからのコメント
( Tuesday, September 07, 1999 21:24:52 )

はじめまして。
僕は、最近UNIXに興味を持って、自分でサーバーを構築しようと勉強しているのですが、ApacheをインストールしてCGIをやろうとしてるのですが、なかなかうまく動作しません。
ここでのコメントを参考に(といっても全部は見てないのですが)設定を試みましたが、いざCGIを実行させてみると、「Internal Server Error」とか言われてしまい悩んでいます。

/usr/local/www/cgi-bin にHello.plというファイルを作り、実行させて、httpd-error.logを見てみると、
access to /usr/local/www/cgi-bin/Hello.pl failed for 192.168.10.7, reason: Premature end of script headers
とか言ってます。

ド素人の僕には意味がさっぱりわかりません。
こんな説明で分かる方がいらしたら、教えてください。

今井真人 さんからのコメント
( Wednesday, September 08, 1999 19:15:55 )

 よくあるのが、改行コードがCR(マックの改行コード)のままってのが多いです。
LF(Unixの改行コード)に変換してください。

今井真人 さんからのコメント
( Wednesday, September 08, 1999 19:17:01 )

 TELNETから、Hello.plをcat Hello.plで表示させてみると
改行コードの間違いは簡単に判断できます。

今井真人 さんからのコメント
( Wednesday, March 29, 2000 18:23:51 )

 今日、自分も同じように動かなくなってしまいました。

 結局、httpd.confの設定が問題でして、

#
# UserDir: The name of the directory which is appended onto a user's home
# directory if a ~user request is received.
#
UserDir public_html

#
# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
#
#<Directory /home/*/public_html>
#    AllowOverride FileInfo AuthConfig Limit
#    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#    <Limit GET POST OPTIONS PROPFIND>
#        Order allow,deny
#        Allow from all
#    </Limit>
#    <Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
#        Order deny,allow
#        Deny from all
#    </Limit>
#</Directory>

 のあたりが問題になっています。ここを以下のように書き直すとOKです。

<Directory /home/*/public_html>
    AllowOverride FileInfo AuthConfig Limit
    Options MultiViews Indexes SymLinksIfOwnerMatch ExecCGI
    <Limit GET POST OPTIONS PROPFIND>
        Order allow,deny
        Allow from all
    </Limit>
    <Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
        Order deny,allow
        Deny from all
    </Limit>
</Directory>

また、tail /var/log/httpd/error_log
などを参照すれば、より理解が深まると思います。

今井真人 さんからのコメント
( Wednesday, March 29, 2000 19:04:34 )

 もう一つありました。Perlなどのスクリプト言語を使う場合、最初の
行に次のように書かなければなりませんが、これがずれているとうまく
動作しない原因になります。

#! /usr/bin/perl

ですから、which perlなどでパスを調べて書き直すことも必要です。

MARo さんからのコメント
( Thursday, March 30, 2000 07:31:37 )

cgiとして実行させる前に、文法チェックは行っておきたいですね(^-^;
コマンドラインから、

 perl -c cgiファイル名

これでエラーが出ないようなら、fileのパーミッションかオーナー設定を
疑ってみるべきでしょうか。

UNIXマシンのperl cgiの設定って……httpdの初期設定以外はほとんどするべき
ものがなかったような……(^-^;;

ただし、上記インストールの話に絡むのですが、httpdのインストール時の
設定の影響で、cgiファイルのオーナー名を特定のユーザー名に設定しておく
必要のあるケースもありました。

ご自分でhttpdから何からインストールしたのでなければ、管理者に聞いてみる
のがよいのではないでしょうか。

# Linux上でChipmunk BASICのcgiを動かして、basicによるcgiに目覚めて
# しまいました(^-^;; Mac版のChipmunk BASICもかなり処理速度は速いので
# Chipmunk BASICによるCGIも……あながち冗談として一笑に付するものでも
# ないんじゃないかと思ってみたり……

今井真人 さんからのコメント
( Thursday, March 30, 2000 08:12:19 )

 Perlだと次のような書き方ができるので、BASICと比べると楽ができます。
HTMLそのものが記入できるので大変使いやすいと思います。BASICにこの
ような書法があればいいのですが。

  print <<END;
  <HTML>
    <HEAD>
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=Shift_JIS">
      <TITLE>タイトル</TITLE>
      <SCRIPT LANGUAGE="JavaScript">  

      function checkIt1(form) {
END

今井真人 さんからのコメント
( Thursday, March 30, 2000 08:15:39 )

ちなみにEND行だけは、行の先頭にないとエラーになってしまいます。

MARo さんからのコメント
( Friday, March 31, 2000 03:33:06 )

(当初の質問から脱線してごめんなさい、でもあえて脱線しちゃいます^−^;)

>BASICにこのような書法があればいいのですが。
ないですよねー(^−^; HTMLを出力するのも各行にprint文を入れることに
……。

ただし、AppleScriptとChipmunk BASICの処理速度を比べると、ダントツに
Chipmunk BASICの方が高速です(インタプリタなのに)。

しかも、彼は他のアプリの制御もできます。もっと注目されてもいいんじゃないか
などと考える今日このごろです(^−^;;