
Ubuntu日本語フォーラム

ログインしていません。
いつも参考にさせて頂いております。感謝m(_ _)m
素人でubuntu 10.10 で自宅サーバーを構築開始して数週間になります。
諸先輩たちのブログや、こちらを拝読しています。
目的は複数ドメインを使いレンタルサーバースペース的な環境の構築を目指しております。
どうしても、cgiの動作がうまくいきません。
と、いうより、理解をしていません。
環境は、PC本体とUSB-HDDです。
USB-HDDは、ext2で /var/www2/ にマウントしています。
ディレクトリの構成は、
/var/www2/cgi-bin/ [755]
/var/www2/domain1.com/ [755]
/var/www2/domain2.com/ [755]
/var/www2/domain1.com/ には、user1ユーザーがFTPでファイル転送が可能。
/var/www2/domain2.com/ には、user2ユーザーがFTPでファイル転送が可能。
http://domain1.com で公開できています。
http://domain2.com で公開できています。
http://domain1.com/hello.cgi [755] にアクセスすると、
以下のエラーメッセージが出力されます。
-----------------------------------------------------------------
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, [no address given] and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
Apache/2.2.16 (Ubuntu) Server at eriskywalker.com Port 80
/etc/apache2/sites-enabled/000-default の内容は
-----------------------------------------------------------------
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www2
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www2/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /var/www2/cgi-bin/
<Directory "/var/www2/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
素人質問で申し訳ありません、ヒントなどいただけないでしょうか?
よろしくお願いします。
オフライン
自己レスですが、調べ進んだところ、
ひとつは、階層の指定の問題のような気がしてきました。
https://forums.ubuntulinux.jp/viewtopic.php?id=9389
↑が参考になりそうです。
オフライン
メッセージ内には、
More information about this error may be available in the server error log.
と表示されていますから、それにしたがって、error.logの内容を確認してみてください。まずは、その内容を見て見ましょう。
いまの情報だと、cgiが間違えているのか、設定が間違えているのかも、判断ができないような気がします。
なお、もし、外部に公開するのであれば、納得して、理解して、自分で「よし、これから大丈夫」と判断できてからにすることをお勧めします。
自身にもリスクがありますが、そのリスクを他者にも振りまくことになります。
(ミスなく完璧な設定でなければならない ということではないです。が、「完璧なつもり」と言えるか、「現状のリスクの程度が判断できる」あたりまでは、知識を身につけてからでも遅くはないです。外部に公開した状態で数日放置して、access.logとか見ると、何でこんなに(不正な目的の)アクセスが・・・と思うほどに、アクセスログがたまったりします・・・)
オフライン
・どのディレクトリに格納したcgiファイルにアクセスしたいのでしょうか?
・/etc/apache2/配下のファイルのうち、編集したファイルや作成したファイルなどを提示してみてください。
設定の全体像が見えないと、何ともよく分からないです。
ご返答ありがとうございます。m(_ _)m
調べていたら、/cgi-bin/ 以下におかれたものは、cgiと無条件にみなすと。
で、自分で /cgi-bin/と指定している。…ので、/cgi-bin/以下においていないのに、
実行できるわけは無いと><;
ですが、実行したいのは、以下↓
/var/www2/domain1.com/test1.cgi
/var/www2/domain2.com/test2.cgi
エラーが以下、2つ。
(8)Exec format error: exec of ’/var/www2/domain1.com/test1.cgi’ failed
Premature end of script headers: test1.cgi
レンタルサーバースペースの場合、どこに置いても、パーミッション755にしたら、実行できるので、
てっきりOKだと思っていたのですが、上記なように、ユーザーディレクトリ以下、どこでも実行できるようにできますか?
オフライン
サーバの構成とか、とりあえずおいといて、エラーメッセージだけ見て判断すると、
「test1.cgiが実行できるファイルではない」
というふうに見えます。
(Ubuntu(Unix)では、コンパイルして生成したバイナリファイルも、「#!」で始まるスクリプトファイルも、等しく実行可能なファイル」です。通常、cgiは後者になります)
test1.cgiの内容を確認してみてください。必要であれば、端末で実行して動作することを確認してください(Formを受け取るCGIだとちょっと大変ですが・・・)。また、より単純化した、確実に動作するスクリプトで動作の確認を行ってみてください。たとえば、以下のような単純な感じの(すいません、動作未確認です。)
#!/usr/bin/csh echo "Content-type: text/plain" echo "" echo "OK" exit 0
なお、2行目のエラーメッセージは、そのcgiを実行した結果もしくは実行しようとした結果、出力された内容が、正しくない(http headerから始る形式に合ってない)場合に表示されます。意図しないメッセージ(たとえば標準出力に表示されるエラーメッセージ)がhttp headerよりも前に出力されていたり、エラーで中断してheaderすらもなかったり、そもそも、http headerの出力を忘れた/間違えた場合に表示されます(要は、原因はものすごく多岐にわたります。)。同じタイムスタンプで他のエラーも発生している場合には、そのエラーに付随している可能性が他ないので、とりあえず1行目のエラーの解決を目指す で間違いないです。
(ブラウザからは、500 Internal Errorにしか見えないので、500 Internal Errorだけわかっても、調べようがないです(可能性が多岐にわたりすぎる)。)
付記。
もしかして、ASCII/BINARYを間違えてFTPで転送したとか、FTPのオプションで不必要/間違った文字コードの変換をしてしまった・・とかでしょうか?(FTPの話が出ていたので、ひょっとして と)
オフライン
やりたい事は「ScriptAlias ディレクトリ外の CGI」ってやつですね?
STGSAGWAN による投稿:
やりたい事は「ScriptAlias ディレクトリ外の CGI」ってやつですね?
まさにそのとおりです。
みなさんの参考にさせて頂いて、エラーは出なくなりました。(FAVICON.ICOが無いっていうのも含めてw)
リンクを検索しまして、「apache の説明ページ」に飛んだのですが、
まだ、私の頭が悪いので、
さて、どうやって直していいものか…。
なんです><;
ただ、段々と確信にせまってきましたので、まだ、勉強しています。
例などのページやサンプルなどありましたら、お願いします。
お手数をおかけします m(__)m
オフライン
お世話になります。
経過報告なのですが、
SSHコンソールから、
test1.cgi
---------------------
#!/usr/bin/perl
print "Hello World!\n";
---------------------
SSHでログインし、
# perl /var/www2/domain1.com/test1.cgi [Enter]
を実行すると、
Hello World!
と表示され、/var/log/apache2/error.logにエラーも出ないのですが、
ブラウザから
http://domain1.com/test1.cgi
を実行すると、
500 Internal Server Errorになり、
/var/log/apache2/error.logに、
(8)Exec format error: exec of '/var/www/domain1.com/test.cgi' failed
Premature end of script headers: hello.cgi
とエラーが帰ります。
むむむ…(~_~;)
オフライン
eriskywalker さんの投稿 (#9):
test1.cgi
---------------------
#!/usr/bin/perl
print "Hello World!\n";
---------------------
CGI プログラムの出力は、以下のように並んでいる必要があります
(ヘッダー)
空行
ボディ
ところが #9 のプログラムでは、以下のようになっています
ヘッダーが省略されている
空行がない
ボディ ="Hello World!\n"
まずは、少なくとも空行を一行、"Hello World!\n" の前に出力するようにして試しましょう
またヘッダーとして最低限 "Content-type: text/plain; charset=utf-8;"、または "Content-type: text/html; charset=utf-8;" など (charset の値は文字コードに合わせて適切に設定すること) を出力する方がいいでしょう
オフライン
#!/usr/bin/perl
[改行]
print "Content-type: text/plain; charset=utf-8;";
[改行]
print "Hello World!\n";
ありがとうございます。
上記のコード、そのほかのコードでチェックしても、同じでした><;
テキストエディタはEmediter で保存のときは、UTF-8 , 改行(LF)にて保存。
FFFTPで転送。
SSHでの実行はエラー出ず。
ブラウザからの実行は以前同じでした。
う~ん;;; パーミッションは755だし。
ほか、確認を要するところはありますか?
本当に申し訳ありません。。。
オフライン
sshで実行した際の結果を、「そのまま」掲載してみてはいかがでしょうか。
あなたが正しいと思っている、表示された内容が、cgiとしては正しくないという可能性があります(今出ているエラーはそういうエラーです。)
その際には、空行も空白文字も重要な意味を持ちますから(つまり、それらの差だけでも動くかどうかに影響します)、明確にわかるように掲載する必要があります。
また、何で編集してどう転送しようと、最後に動作するかどうかは、最終的にアップロードしたファイルが正しいかどうかが重要になります。正しいかどうか、od等を利用して確認しておけば、それら可能性を切り分けることが可能です。いろいろなところに可能性を抱えたまま、数撃ってやみくもに試すのは、(当たれば早いですが)数撃つ内容が思いつかなくなってきたら、別の方法に切り替える必要があります(つまり、1つ1つ積み重ねて絞り込んでゆく方法。うまく行かなくても次の1手につながります。)
※外部への公開は、ある程度知識を身につけてからをお勧めします。
オフライン
eriskywalker さんの投稿 (#11):
#!/usr/bin/perl
[改行]
print "Content-type: text/plain; charset=utf-8;";
[改行]
print "Hello World!\n";ありがとうございます。
上記のコード、そのほかのコードでチェックしても、同じでした><;
プログラムを実行して出力された結果が以下のように、ヘッダーと本文の間に空行が一行 必ず入っていなくてはなりません (ヘッダーは省略可能だが、その場合でも本文の前に空行が一行必要)
複数行のヘッダー<改行> <改行> 複数行の本文
プログラムにいくら改行が入っていても全く関係ありません
あくまでもプログラムを実行したときの出力がどうなっているかです
オフライン
#!/usr/bin/perl[改行]
[改行]
print "Content-type: text/plain; charset=utf-8;";[改行]
[改行]
print "Hello World!\n";[改行]
ry様、ありがとうございます。
申し訳ありません、端折っていました。
正式には↑のように各改行を入れています。
オフライン
外してたらごめんなさい。
CGIがらみでInternal Server Erorr の時、いくつかチェックするポイントがあります。
簡単に検索してみたところ、futomi's CGI Cafe - CGIセッティングの7ヶ条というサイトがヒットしました。
よく引っかかるポイントとして、ASCIIモードでのファイルの取り扱いがあります。
クライアント側は皆さん気づきやすいのですが、FTPサーバー側でもASCIIでのアップロードを許可する設定をしないといけません。
といっても、vsftpしか知りませんが。
ascii_upload_enable=YES
vsftpd.confの確認をされてみてください。
オフライン
eriskywalker さんの投稿 (#14):
#!/usr/bin/perl[改行]
[改行]
print "Content-type: text/plain; charset=utf-8;";[改行]
[改行]
print "Hello World!\n";[改行]ry様、ありがとうございます。
申し訳ありません、端折っていました。
正式には↑のように各改行を入れています。
CGI プログラムを実行した結果、上記のように出力されるのですか?
だとしたら CGI プログラムの中で「#!/usr/bin/perl」という文字列を出力 (print) していることになり、それが出力の一行目ということになります
CGI プログラムの出力の一行目はヘッダーか、ヘッダーを省略したときの空行のどちらかでなくてはならず、「#!/usr/bin/perl」という文字列ではそれを受け取った Apache がエラーになるのは当然です
オフライン
ご回答くださった皆様、ありがとうございました。
やっと、実行することができました。
幾度の再インストールやら、FFFTPの設定(UTF-8Nに設定)、emediterの設定(保存時のエンコードの選択)やら、見直しまして。
一応、CGIが実行できるようになりました。
素人ですが、また行き詰った際、見つけましたら
ご指導お願いします。
m(_ _)m
オフライン
eriskywalker さんの投稿 (#17):
幾度の再インストールやら、FFFTPの設定(UTF-8Nに設定)、emediterの設定(保存時のエンコードの選択)やら、見直しまして。
一応、CGIが実行できるようになりました。
見直した結果、どこをどのように修正したのかを開示してください
不特定多数の人が見ることのできるフォーラムなので、今後同じような問題に遭遇した人にとって、有用な解決の場になるようにご協力ください
オフライン
妥協ですが、取り急ぎひとつのドメインの構築で進めることにしました。
/var/www/cgi-bin/ (CGI用のディレクトリ)
/var/www/index.html (ホームディレクトリ)
基本設定で、参考にさせて頂いたページ
(命名意外は、↓の設定しました。)
暁闇様のページ
ProFTPDの設定
http://darkdawn.exblog.jp/13275583
Perlの設定
http://darkdawn.exblog.jp/13372376/
【Perlの編集】
EmEditor Free 6.00.4 を使用しました。
※保存時
ファイルの種類…Perl
エンコード…UTF-8
UniCodeサイン(BOM)をつける…チェックを外す。
改行方法…UNIX(LFのみ)
【転送】
FFFTP Version 1.97bを使用しました。
※設定
=ホストの設定=
[拡張]タブ…PASVモードを使うをチェック
[文字コード]タブの、[ファイル名の漢字コード]オプションは「UTF-8N」を選択
[高度]タブのLISTコマンドでファイルの一覧を取得にチェック
オフライン