お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2010-08-27 20:53:00

merrow
メンバ
登録日: 2010-08-27

apache2でのCGI実行環境設定について

apache2のCGIが実行できずに困っております。
apacheのドキュメントを参照しながら設定を行いましたが、
CGIのページの応答が返却できていません。

apache2のエラーログには、該当のCGIへのリクエスト時に以下のようなエラーが出力されます(IPアドレス部をマスク、日時の出力箇所削除)。
---[ /var/log/apache2/error.log ]-------
[error] (13)Permission denied: exec of '/var/www/test.cgi' failed
[error] [client XXX.XXX.XXX.XXX] Premature end of script headers: test.cgi
--------------------------------------


実行しようとしているCGIは以下のファイルです。
---[ /var/www/test.cgi ]---------------
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.\n";
--------------------------------------

「/var/www/test.cgi」として保存しており、実行権も付与しています。
また、直接コマンド実行すれば正しく動作します。
--------------------------------------
# ls -l /var/www/test.cgi
-rwxr-xr-x 1 root root 79 2010-08-27 18:22 /var/www/test.cgi

# /var/www/test.cgi
Content-type: text/html

Hello, World.
--------------------------------------



CGIを動作させる設定として、以下の設定を行っています。
1.「~.cgi」のファイルをcgi-scriptハンドラへマッピング。
---[ /etc/apache2/mods-enabled/mime.conf ]----
AddHandler cgi-script .cgi         ←コメントアウトを解除
------------------------------------------------

2.「/var/www/」配下でのCGIスクリプトの実行を許可。
---[ /etc/apache2/sites-enabled/000-default ] ---
        <Directory /var/www/>
                Options ExecCGI Indexes FollowSymLinks MultiViews    ←ExecCGIを追加
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
------------------------------------------------

上記2点の設定でCGIが実行できると考えていたのですが、
ブラウザからリクエストを投げても、500 Internal Server Errorとなってしまいます。

設定の誤りや不足など教えていただけないでしょうか。
また、情報に不足がありましたら追加でコメントいたします。

オフライン

 

#2 2010-08-27 21:12:28

merrow
メンバ
登録日: 2010-08-27

Re: apache2でのCGI実行環境設定について

バージョン情報を載せるのを失念しておりました。
バージョン情報は以下のとおりです。
apache2は「apt-get install apache2」でインストールしています。

Ubunts 9.04
Apache/2.2.11


設定は以下のサイトを参考にしました。
http://httpd.apache.org/docs/2.2/howto/cgi.html

suexecは使用していないと思います。
「apache2 -V」の結果で表示されたSUEXEC_BINのパスにはsuexecのファイルは存在していませんでした。

#マニュアル上は「apachectl」となっていますが、
#バージョンが変わってバイナリ名が変更になったんでしょうか?

オフライン

 

#3 2010-08-28 00:01:05

STGSAGWAN
ゲスト

Re: apache2でのCGI実行環境設定について

merrow による投稿:

ブラウザからリクエストを投げても、500 Internal Server Errorとなってしまいます。

リクエストURLは何ですか?

 

#4 2010-08-28 01:26:48

merrow
メンバ
登録日: 2010-08-27

Re: apache2でのCGI実行環境設定について

リクエストアドレスは以下です。
別のhttpサーバがポート80で起動しているので、
リッスンポートを8080に変更しています。

http://[ホスト名]:8080/test.cgi

オフライン

 

#5 2010-08-28 01:49:22

merrow
メンバ
登録日: 2010-08-27

Re: apache2でのCGI実行環境設定について

サイトの設定の全内容です。

---[ /etc/apache2/sites-enabled/000-default ] ---
<VirtualHost *:8080>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www

        <Directory /var/www/>
                Options ExecCGI Indexes FollowSymLinks MultiViews
                #Options All
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined

</VirtualHost>
------------------------------------------

オフライン

 

#6 2010-08-28 02:57:15

zagan
メンバ
登録日: 2008-08-12

Re: apache2でのCGI実行環境設定について

こんな感じで、cgiファイルに実行権を与えてやると動いたですよ。

DocumentRoot /var/www/
<directory />
Options FollowSymLinks
AllowOverride None
< /directory>
<directory /var/www/>
Options Includes ExecCGI FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</directory>

ErrorLog /var/log/apache2/error.log

DocumentRoot直下にcgiファイルを置かないといけないのですか?

オフライン

 

#7 2010-08-28 07:34:04

merrow
メンバ
登録日: 2010-08-27

Re: apache2でのCGI実行環境設定について

zaganさん による投稿:

こんな感じで、cgiファイルに実行権を与えてやると動いたですよ。

その内容で以下の場所の設定を全部書き換えました。
<VirtualHost *:8080>
~ ←この箇所に設定
</VirtualHost>

/var/www/test.cgiを/usr/lib/cgi-bin/test.cgiにコピーして以下の2つを試しました。
(/usr/lib/cgi-bin/test.cgiのパーミッションも755にしています。)

http://[ホスト名]:8080/test.cgi             ←/var/www/test.cgiへのリクエスト
http://[ホスト名]:8080/cgi-bin/test.cgi   ←/usr/lib/cgi-bin/test.cgiへのリクエスト

どちらのアクセスも状況がかわらず、apacheのエラーログには同じエラーが出力され、
ブラウザには500 Internal Server Errorが返却されてしまいます。
apache2.conf等で余計な設定が入っているんでしょうか。。。


zaganさん による投稿:

DocumentRoot直下にcgiファイルを置かないといけないのですか?

DocumentRoot直下にcgiファイルを置く必要はないのですが、cgi以外のリソース(.css、.js等)も
cgiを配置するディレクトリに混在させて配置させたいと思っています。

オフライン

 

#8 2010-08-28 23:01:25

petitbootang
メンバ
From: 東京都
登録日: 2009-02-12

Re: apache2でのCGI実行環境設定について

ScriptAlias を指定してないから、ということではないですよね・・・。
どうも、Ubuntu の apache2 は、CGI を実行させたいディレクトリに、明示的に ScriptAlias ディレクティブを指定してやらないとなんだかうまく動かないみたい・・・。
大嘘書いてたらごめんなさいなのですが。

例えば、/var/www/ 直下に CGI を設置して、 http://www.example.com/test.cgi で実行させるには、

ScriptAlias / /var/www/
    <Directory /var/www/>
        Options +ExecCGI FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

のような感じに書いてやらないと、上手く動かないようですね。
ん〜、でも、500 Internal Server Error なんですよね。
私のところでは、403 Forbidden なんですが・・・。

あと、CGI の実行はデフォルトのようですので、mime.conf を特別いじらなくても良いようです。
私の環境では、mime.conf の AddHandler cgi-script .cgi のコメントアウトはしていません。

それと、ちょっと気になるのが、/etc/apache2/sites-enabled/000-default を直接編集しているようですが、これが原因と言うことはないですよね・・・。
/etc/apache2/sites-enabled/000-default は、/etc/apache2/sites-enabled/default のシンボリックリンクですので、これを直接に編集するのは望ましくありません。
/etc/apache2/sites-enabled/default の方を編集して、
$ sudo a2ensite default コマンドを実行して、
$ sudo service apache2 restart して反映させます。

なお、/etc/apache2/sites-enabled/default はオリジナルファイルなので、出来れば、
$ sudo cp /etc/apache2/sites-enabled/default /etc/apache2/sites-enabled/hoge
などとしてコピーを作り、
$ sudo a2dissite default
$ sudo a2ensite hoge
$ sudo service apache2 restart
として、コピーしたファイルの方を有効にさせたほうが良いかも知れません。

オフライン

 

#9 2010-08-29 06:45:40

ry
メンバ
登録日: 2008-07-30

Re: apache2でのCGI実行環境設定について

petitbootang さんの投稿 (#8):

それと、ちょっと気になるのが、/etc/apache2/sites-enabled/000-default を直接編集しているようですが、これが原因と言うことはないですよね・・・。
/etc/apache2/sites-enabled/000-default は、/etc/apache2/sites-enabled/default のシンボリックリンクですので、これを直接に編集するのは望ましくありません。

シンボリックリンクを編集したときは、素直にシンボリックリンクが指す実体のファイルを編集することになるだけです
ですから、シンボリックリンクだろうが、その実体だろうがどちらを編集しても、全く同じであり区別する必要はありません

なお、/etc/apache2/sites-enabled/default はオリジナルファイルなので、出来れば、
$ sudo cp /etc/apache2/sites-enabled/default /etc/apache2/sites-enabled/hoge
などとしてコピーを作り、
$ sudo a2dissite default
$ sudo a2ensite hoge
$ sudo service apache2 restart
として、コピーしたファイルの方を有効にさせたほうが良いかも知れません。

シンボリックリンクとその実体ファイルの関係はともかく、上のようにオリジナルのコピーを作り、それを編集する方が何かあったとき (パッケージのアップグレードでオリジナルが修正更新されたときなど) に、予想しない不具合が発生しにくくなると思うので、上の方法には賛成します

# 若干オフトピ気味ですが

オフライン

 

#10 2010-08-29 11:24:19

petitbootang
メンバ
From: 東京都
登録日: 2009-02-12

Re: apache2でのCGI実行環境設定について

シンボリックリンクを編集したときは、素直にシンボリックリンクが指す実体のファイルを編集することになるだけです
ですから、シンボリックリンクだろうが、その実体だろうがどちらを編集しても、全く同じであり区別する必要はありません

ry さん、教えていただいてありがとうございました。

あと、訂正一つ。
#8 の

私の環境では、mime.conf の AddHandler cgi-script .cgi のコメントアウトはしていません。

は、

私の環境では、mime.conf の AddHandler cgi-script .cgi のコメントアウトははずしていません。

の間違いでした。

オフライン

 

#11 2010-08-29 12:04:00

merrow
メンバ
登録日: 2010-08-27

Re: apache2でのCGI実行環境設定について

a2dissite/a2ensiteのコマンドは知りませんでした。ありがとうございます。


とりあえずdefaultをa2dissiteして、
hogeでa2ensiteしました。内容は教えていただいた以下のとおりです。
a2dissite/a2ensiteの際に「/etc/init.d/apache2 reload」を実行しろっていわれたので実行しています。

ScriptAlias / /var/www/
    <Directory /var/www/>
        Options +ExecCGI FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

この状態でも状況が変わりません。
また、ScriptAliasで/var/wwwを指定しているので、
/var/www配下の非CGIファイル(index.html)を表示する際に、
CGIとして実行しようとして同じ様なエラーログになっています。

[error] (13)Permission denied: exec of '/var/www/test.cgi' failed
[error] [client XXX.XXX.XXX.XXX] Premature end of script headers: test.cgi
[error] (13)Permission denied: exec of '/var/www/index.html' failed
[error] [client XXX.XXX.XXX.XXX] Premature end of script headers: index.html

オフライン

 

#12 2010-08-29 14:54:35

petitbootang
メンバ
From: 東京都
登録日: 2009-02-12

Re: apache2でのCGI実行環境設定について

そうですか、状況変わらずですか・・・。
そうか、でも考えてみると、500 Internal Server Error ですから、
CGI を実行しようとしたけどエラーになったと言うことですよね、いまさらですが。
CGI が動かない原因の一番多くは、Perl パスが間違っているというのだと思いますが、これは合ってますものね。
あと、もうひとつ多いのが改行コードが間違っているケースですが・・・。
念のためエディタで改行コードが間違ってないか確認してみると良いかも。
あと、こんなページを見つけたのですが、
http://sagittarius.dip.jp/toshi/premature.php
#! /usr/bin/perl --
と言う具合に、-- をつけると直ったとかいう報告もあったりして。
理由はちょっと良く分からないですけど。

オフライン

 

#13 2010-08-29 16:23:58

zagan
メンバ
登録日: 2008-08-12

Re: apache2でのCGI実行環境設定について

.htaccess が用意されてるとか。。。

オフライン

 

#14 2010-08-29 18:22:30

petitbootang
メンバ
From: 東京都
登録日: 2009-02-12

Re: apache2でのCGI実行環境設定について

zagan による投稿:

.htaccess が用意されてるとか。。。

あぁー、それもありすね。
merrow さん、.htaccess を使用していて、その中身の記述に問題があると、やはり 500 Internal Server Error になりますよ。

オフライン

 

#15 2010-08-29 23:48:15

merrow
メンバ
登録日: 2010-08-27

Re: apache2でのCGI実行環境設定について

.htaccessは該当のディレクトリ配下にってことですよね?
今回の例であれば、「/var/www」にtest.cgiを配置していますが、「/var/www」には.htaccessはありませんでした。

念のためapache2.confを確認しましたが以下の設定の状態で、特にファイル名の設定変更などはされていません。

AccessFileName .htaccess

実行対象のcgiも改行コードLFで問題ないと思います。

オフライン

 

#16 2010-08-29 23:50:05

merrow
メンバ
登録日: 2010-08-27

Re: apache2でのCGI実行環境設定について

petitbootangさん による投稿:

あと、こんなページを見つけたのですが、
http://sagittarius.dip.jp/toshi/premature.php
#! /usr/bin/perl --
と言う具合に、-- をつけると直ったとかいう報告もあったりして。
理由はちょっと良く分からないですけど。

試してみましたが、状況変わらずでした。

オフライン

 

#17 2010-08-30 01:54:54

petitbootang
メンバ
From: 東京都
登録日: 2009-02-12

Re: apache2でのCGI実行環境設定について

う〜ん、そですか・・・。
色々調べてみていますが、やはり、パーミッションの設定がおかしいのでは無いでしょうかね。
疑っているわけではないのですが、本当に 755 になっているでしょうか?
私の環境で例えば 644 とかにすると、待望の Internal Server Error になりました。
chmod a+x でやってみるとどうでしょうか?

オフライン

 

#18 2010-08-30 03:56:32

merrow
メンバ
登録日: 2010-08-27

Re: apache2でのCGI実行環境設定について

パーミッションは755でも777にしても状況が変わらず。
オーナー/グループをAPACHE_RUN_USER/APACHE_RUN_GROUPのwww-data/www-dataに変更してみても状況変わらず。
apache2を再度インストールしなおして実施しましたが状況変わらず。。。。

もう少し色々調べて見ます。

オフライン

 

#19 2010-08-30 14:43:08

petitbootang
メンバ
From: 東京都
登録日: 2009-02-12

Re: apache2でのCGI実行環境設定について

CGI を設置しているディレクトリのパーミッションに問題があるケースもあるので、
$ sudo chmod 755 /var/www
してみるとどうでしょうか?

オフライン

 

#20 2010-08-30 15:04:16

einundzwanzighundertsechs
メンバ
登録日: 2008-12-28

Re: apache2でのCGI実行環境設定について

私も petitbootang さんと同じく,ディレクトリのパーミッションを疑います.

Apache はインストールしたことがないので詳しくありませんが,ソースを眺める限り,

merrow さん による投稿:

[error] (13)Permission denied: exec of '/var/www/test.cgi' failed

のエラー文字列を吐く部分は,execve 系のシステムコールが失敗したときに実行されるコードに有るので,
Apache が .htaccess 等の仕組みでスクリプトの実行をブロックしているのでは無く,
本当に実行(exec)しようとして Permission denied になっていると思われます.

そこで,

merrow さん による投稿:

「/var/www/test.cgi」として保存しており、実行権も付与しています。
また、直接コマンド実行すれば正しく動作します。
--------------------------------------
# ls -l /var/www/test.cgi
-rwxr-xr-x 1 root root 79 2010-08-27 18:22 /var/www/test.cgi

# /var/www/test.cgi
Content-type: text/html

Hello, World.
--------------------------------------

コマンドの先頭が # になっていますが,このテストは root でログインして実行しているのでしょうか?

一般ユーザや www-data として実行したらどうなるのでしょう?

以下参考までに,あまりに強力な root で日常的に作業していると,パーミッションの感覚が麻痺してしまいます.

/tmp/www/test.cgi に投稿内容をコピペし,ディレクトリとファイルのオーナー/グループを www-data に,
パーミッションは test.cgi の u=x 以外は全て不許可に設定しました.
以下の実行例では敢えて sudo su しています.

コード:

# ls -ld /tmp/www
d--------- 2 www-data www-data 60 2010-08-30 13:56 /tmp/www
# ls -l /tmp/www/test.cgi 
---x------ 1 www-data www-data 78 2010-08-30 13:55 /tmp/www/test.cgi

この状態でも root は test.cgi を実行可能です.

コード:

# /tmp/www/test.cgi
Content-type: text/html

Hello, World.

ディレクトリに u=x,ファイルに u=rx のパーミッションを与えて,
ようやく所有者 www-data が実行できます.

オフライン

 

#21 2010-08-31 12:20:14

merrow
メンバ
登録日: 2010-08-27

Re: apache2でのCGI実行環境設定について

実行環境が手元になく、まだ試せていません。
今日か明日ぐらいに確認してみます。

オフライン

 

#22 2010-09-01 03:54:53

merrow
メンバ
登録日: 2010-08-27

Re: apache2でのCGI実行環境設定について

そもそもwww-dataや一般ユーザへsu、直接ログインができませんでした。
おそらくこれが原因だと思います。

コード:

# su - www-data
Cannot execute /bin/sh: Permission denied

まだログインできない理由まで確認できていないので、本来のCGI実行確認まで至っていません。

www-dataのホームディレクトリまでの各階層や/bin/shのパーミッションを確認しましたがすべて755で問題ないのですが。。。

オフライン

 

#23 2010-09-01 08:20:49

zagan
メンバ
登録日: 2008-08-12

Re: apache2でのCGI実行環境設定について

merrowさん による投稿:

コード:

# su - www-data
Cannot execute /bin/sh: Permission denied

コード:

$ sudo su - www-data

で可能です。

オフライン

 

#24 2010-09-02 14:01:18

chinajunk
メンバ
From: 越中
登録日: 2009-06-15

Re: apache2でのCGI実行環境設定について

apache の設定は /etc/apache2/sites-enabled/000-default の <Directory /var/www/> セクションにおいて

コード:

- Options Indexes FollowSymLinks MultiViews
+ Options Indexes FollowSymLinks MultiViews ExecCGI
+ AddHandler cgi-script .cgi

他を変更する必要はありません
スクリプトのオーナーは root:root、パーミッションは 0755 でかまいません

オフライン

 

#25 2010-09-04 01:24:25

merrow
メンバ
登録日: 2010-08-27

Re: apache2でのCGI実行環境設定について

一般ユーザでのログインができずに、本件について進展していない状況です。

>zaganさん
suのpermission deniedではなくて、ログインシェルがNGなんです。

>chinajunk
一般ユーザやwww-dataでのログインができるようになったら試します。

オフライン

 

Board footer

Powered by FluxBB