
Ubuntu日本語フォーラム
ログインしていません。
お世話になっております。
まだUbuntuを使い始めて数ヶ月なのですが、先日スクリプトの動作がおかしく原因が全くわからないので力を貸してください。
新規でユーザーを作成しホームディレクトリ以下のpublic_htmlをWebサーバーの公開ディレクトリとしていますが、Perl、php、python、rubyなどをpublic_html内で使用できるように設定しています。(cgi-binなどのスクリプト専用のディレクトリは使用していません。)
殆どのユーザーをヴァーチャルドメイン(サブドメイン)でアクセスしているためにhttp://www.example.com/~userというようなチルダを使ったURLでアクセスしたことがなかったのですが、例えばhttp://www.example.com/~user/test.cgiのような形でアクセスするとパーミッション755を必要とする実行ファイルは軒並みエラーになってしまいます。しかし、サブドメインや通常のドメインでhttp://user.example.com/test.cgiのように同ファイルにアクセスするときちんと走ります。同様にオリジナルドメインなどでアクセスしてもスクリプトはきちんと動きます。
プログラム内では特にパスを必要としたものはなく最終的に、
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "hogehoge\n";
exit;
みたいなものでさえエラーになってしまったので、たぶんスクリプト上の問題ではないようです。
現在Apache2を使用していますが、ここら辺りのエラーを回避するにはどうしたらよいでしょうか?
もし同様の経験のある方、あるいは詳しい方がいらしたらご教授願います!
オフライン
エラーって 500 ですか?具体的な内容は?
ユーザ別ディレクトリの方のドメインでアクセスした場合の設定はきちんと書かれていますか?
などなど、これだけだとちょっとよく分からないので、設定状況や、エラーログの内容などの詳細をお願いします。
---
http://www.apache.jp/manual/howto/public_html.html
を参考に手元で試したところ、
UserDir public_html
<Directory /home/*/public_html>
Options ExecCGI
SetHandler cgi-script .cgi
</Directory>
で動いたようですけど、そちらの設定はどんな感じでしょうか?
オフライン
epiiさんありがとうございます!返信遅くなりました。
エラーの種類は、500 Internal Server Errorです。
ログを見ると、Premature end of script headers: test.pl, referer: http://<僕のドメイン>/~<ユーザー名>/
となっています。test.plだけではなく、test.rbやtest_py.cgi(Python)も同様のエラーになります。(PHPだけ正常に動きます。)
userdirの設定はしてあります。しかし、AddHandlerの設定はconf.d以下に別ファイルを作って拡張子の指定をしています。
いろいろ調べてみたらsuexeで動くサーバーで時々出るエラーらしいのですが、そこら辺りの原因が詳しく載っている情報がなかなか得られませんでした。僕のサーバーでもsuexecを使用しています。
suexecを外してみたら、Pythonだけが正常に動きました。perlとrbが今度は500エラーではなくダウンロードされる状態になってしまいました。
バーチャルドメインからの接続ではPerlもrubyもPythonも普通に動きます。
何かしらおかしな設定をしている…という部分があるでしょか?
オフライン
追伸::
suexecを無効にするとpythonは正常に動きますが、有効にするとInternal Server Errorとなります。Perlとrubyは以前としてsuexecに関係なく動かない状態です。
http://<自分のドメイン>/~<ユーザー名>でアクセスしていましたが、http://www.<自分のドメイン>/~<ユーザー名>という風にwwwでアクセスするとsuexecを無効にしている場合は、すべてのスクリプトが正常起動しました。
どうやらsuexecの仕業らしいです。
suexecでは、apache2の設定ディレクトリ以下のwww-dataというファイルに/home/*/public_htmlを設定しています。/home/*にしてみたり/home/*/public_htmlにしてみたりいろいろやってみましたが、実行ファイルはエラーになってしましました。。。
スクリプトで生成したファイルのオーナーがwww-dataになってしまうと何かと不便だったので先日suexecを入れたばかりです。もしかしたらこのモジュールの使い方が間違っているのかもしれません。。。
オフライン
<Directory /home/*/public_html> Options ExecCGI SetHandler cgi-script .cgi </Directory>
SetHandler ではなく、 AddHandler でしたね。
すみません (_ _)
1) suexec 無効 の下で Perl, ruby が動かない件について
AddHandler cgi-script .cgi
とかしていませんか?
この設定だと .pl, .rb という拡張子のファイルが CGI として動作しません。
AddHandler cgi-script .cgi .pl .rb
などとするか、拡張子を .cgi に変更すると動くと思います。
2) suexec 環境下で CGI が動かない件について
いつも PHP を使っているので、suEXEC はやったことがなかったのですが(!!)、ググりつつ導入してみましたらできたので報告します。
以下手順。
i) apache2-suexec-custom のインストール
$ sudo aptitude install apache2-suexec-custom
で普通にインストールします。
ii) suEXEC を有効化するディレクトリの設定 (だと思う)
上のインストールが完了すると、
/etc/apache2/suexec/www-data
というファイルができているので、このファイルに、
public_html
を一行追加する。
iii) suEXEC モジュールの有効化
(自分の環境では)suEXEC が有効化されていなかったので有効化する。
$ sudo a2enmod suexec
簡単に切り替えできて便利。
iv) CGI スクリプトの作成
whoami でどのユーザで動いているかを簡単に確認できるので、シェルスクリプトで。
$ vi ~/public_html/test.cgi #!/bin/sh echo "Content-type: text/plain" echo "" echo `whoami`
v) パーミッションの設定
所有者以外に書き込み権限があるとエラーになるらしい。
$ chmod 755 test.cgi
700 とかでももちろん動くみたい。
そこら辺は状況に合わせて設定してください。
vi) 動作確認。
http://localhost:8080/~epii/test.cgi にアクセス。
無事「epii」とだけ表示された。
という感じでできました。
途中いろいろ弄っていたため、いくつか設定が抜けてるかも…。
オフライン
epiiさん、大変詳しい情報ありがとうございます!!
たぶん原因がはっきりしているのは、
suexecがONの場合は、
・http://xxxxx.com/~user/test.cgi みたいな感じでチルダを使ったアクセスが500エラーに。
・この場合、http://user.xxxxx.com/test.cgiだと動きます。サブドメインの設定やオリジナルのドメインでの接続には問題なしです。
suexecがOFFの場合は、
・全部正常起動。
となると、何だかドメインの問題のような気がしないでもないのですが、ドメインは最終的にはIPアドレスになっちゃうわけだからあんまり関係ないような気がしないでもありません。
しかし、OFFにするとすべてのスクリプトは正常に起動します。
suexecの設定方法は、epiiさんと全く同様の方法で行いました。完璧にすべて同じです。
whoaimからのユーザー名取得も正常です。
suexecを設定したのは、imagemagickなんかで画像処理をした際に外からFTPでダウンロードしようとしたらオーナーがwww-dataになっていていろいろと不便を感じたからです。
巷では、perlのパスの設定で
#!/user/bin/perl --
のようにハイフンをつけると動くようになる…とか、コンテントヘッダーの最後の\n\nをたくさんつけてみる…とかいろいろありましたが、どれもダメです。。。
どうしてepiiさんのマシンでは正常に起動するんでしょう(汗)?
オフライン
suexecがOFFの場合は、
・全部正常起動。
Perl とか Ruby が suEXEC 環境下で無くとも動かない問題は直ったんですか?
whoaimからのユーザー名取得も正常です。
動いてるということでは…?
ii) suEXEC を有効化するディレクトリの設定 (だと思う)
上のインストールが完了すると、
/etc/apache2/suexec/www-data
というファイルができているので、このファイルに、
public_html
を一行追加する。
↑で、「public_html」を末尾に追加するとダメみたいなので、コメントの後に追加している場合には、一行目に持って行ってみてください。
それと、ログが /var/log/apache2/suexec.log あたりに吐かれているかもしれないので、そちらも参考に。
#どうしてもダメならスクリプトから chown するとかですかね…。
オフライン
epiiさんありがとうございます。何度もお世話になります。
説明の仕方がわかりにくくてすみんせん。
suexecがOFFの場合はスクリプトが正常起動するのですが、ONにするとhttp://<僕のドメイン>/~<ユーザー名>/test.cgiで500エラーになってしまうようです。(ですが、ONの場合、http://<ユーザー名>.<僕のドメイン>/test.cgiとサブドメインでアクセスすると正常に動くのです。)
www-dataの設定も一行目に書いてあったのでここは問題ないと思います。
ログが、これまですべてのログが、
[2009-08-25 11:19:26]: userdir suffix disabled in /etc/apache2/suexec/www-data
というものでした。末尾についている何かがおかしい…というようなメッセージだと思うんですが、www-dataにはpublic_html以外に何も記述していない状態です。
なんかかなりハマってしまってます。
オフライン
$ man suexec より抜粋。
If suexec is called by a user with name 'username', it will look into /etc/apache2/suexec/username for configuration. If the file does not exist, suexec will abort. By creating several config files, you can allow several different apache run users to use suexec.
The first line in the file is used as the document root (/var/www in the standard suexec) and the second line in the file is used as the suffix that is appended to users' home directories (public_html in standard suexec).
If any of the lines is commented out (with #), suexec will refuse the corresponding type of request. It is recommended to comment out the userdir suffix if you don't need it.
マニュアルぐらい読んでから投稿しろよ、俺。
オフライン
何度もアドバイスありがとうございます。
僕もman読むのすっかり忘れてました。
suexecはユーザー名(つまりはユーザー)によって呼び出されるわけで、それは/etc/apache2/suexec/usernameというパスを見てconfしています。このファイルがない場合は、suexecは実行しないです。いくらかのconfファイルを作ることでapacheの実行ユーザー(www-data)とは違うsuexecしたユーザーで実行することが許可されます。
このファイルの一行目はドキュメントルートとして使われるsuexecではスタンダードなパス、/var/wwwと二行目にはユーザーのホームディレクトリとして一般的に使われるpublic_htmlが付加的に添えられてあります。
コメントアウト(#)しておけば、suexecはそのコメントアウト部分は拒否してくれます。必要なかったらコメントアウトしておいてください。
ということが書いてあると思うのですが、
suexecはこのmanどおり設定してみました。
これはユーザーごとにファイルを設定しなくちゃいけないみたいですね。
仮にexampleuserというユーザーに対してsuexecするとなると、
/etc/apache2/suexec/exampleuser というファイルを作って
/home/exampleuser/public_html
と書いておく…ということなんでしゅうか?
一応試してみてepiiさんのおしえて頂いた、whoaimでユーザーを確認すると、きちんと動いているみたいです。
しかしながら、
http://example.com/~exampleuser/test.pl とか、test.cgiとかは軒並みエラーです…。。。とほほ。
a2dismod suexecすると正常に動きます。
スクリプトが生成したファイルのオーナーがwww-dataになってしまうのでとても不便なのですが、suexecするとバーチャルドメイン(サブドメインやドメイン)からは正常に動くのですが、~をつかって元々のURLにアクセスするとCGIは軒並みエラーです。。。
とりあえずは、chownでユーザーに戻してしまえばいいわけですから、問題ないんですが、以前にsuexecしていたので何だか不便ですね。
皆様はここら辺りはどうしているのでしょうか?
オフライン
もう少しがんばって訳すとこんな感じだと思いますがー
'username' という名前のユーザから suexec が呼び出された場合には、 /etc/apache2/suexec/username という設定ファイルを読み込みます。もしこのファイルが存在しなかった場合には suexec の実行は中止されます。設定ファイルを複数作ることにより、いくつかの異なる apache の実行ユーザが suexec を利用できるようにすることができます。
設定ファイルの一行目はドキュメント・ルート (通常の suexec では /var/www が利用されます) を指定します。二行目はユーザのホームディレクトリのサフィックスとして利用されます (通常の suexec では public_html が利用されます)。
これら二行のうちのいずれかが (# により) コメントアウトされていた場合には、 suexec は対応するリクエストを拒否します。必要がない場合には(二行目の)ユーザディレクトリ・サフィックスはコメントアウトすることが推奨されます。
suexec は User ディレクティブで指定されたユーザ名を見に行く…らしいので、特に変更していない場合には編集するファイルは、
/etc/apache2/suexec/www-data
です。
一行目はドキュメント・ルートなので、例えば、
/var/www
などを指定します。
二行目はホームディレクトリ以下のどの場所で suexec するかなので、
public_html
などとしてください。
あとはファイルの所有者やパーミッションに気をつければできると思うんですけど…。
# どうしてもできないなら perl から chown するとかじゃダメですかね…。
オフライン
わかりました!ここまでわかるのにかなり時間がかかりました(汗)。
…PHPをCGIインタプリタとしてインストールすると、ApacheのsuEXEC機能を利用することにより、複数のPHPプロセスを個別の仮想ホストのもとにおいて別々のユーザIDで実行することが可能になる。しかし、この方法でインストールされたPHPは十分な動作速度を実現できない場合があり、また、設定を誤ると数々のリスクを抱え込むおそれがある。その代わりとして選択可能なのがPHPをApacheモジュールとしてインストールする方法であり…
という説明を見つけました。Ubuntuでもたぶんそうだと思うのですが、僕の場合おもいっきりモジュールとして組み込んでしまってます。epiiさんはどんな風にインストールしてますか?インタープリタでインストールするとsuEXECは普通に動くみたいです。
いろいろ勉強になりました。Apache奥が深いです。
オフライン
aptitude から php5 パッケージを入れて使っています。モジュールです。
やったことないけど CGI + PHP5 は、$ sudo aptitude install php5-cgi で環境は一通りそろうと思いますよ。
# php5-cli とかもあるけど、PHP を HTML を出力する以外の使い方している人っているのだろうか…?
オフライン
いろいろと貴重な情報ありがとうございます。
今のところ未解決なのですが、シェルでオーナーを変えたり、Perlでやったりでしのいでます。
オフライン