ヒント集
パーミッションの変更
CGIはsuexecという機能により、お客様のユーザー権限で動作します。(一般的にはnobodyなど)
ディレクトリやCGIファイルのパーミッションは 755 以上の権限を設定しないでください。フリーソフトなどで配布されているCGIには
777 と設定するよう指示されているものもありますが、755 で問題なく動作します。
CGIのファイルには実行属性(パーミッション)が付いていないと正しく動作しません。
FTPソフトによってはパーミッションの変更ができるようになっているものもあります。

これは WS_FTP での例です。
パーミッションを変更するファイルを選択し、右クリックメニューから"chmod"を選択します。出てきたウィンドウから"Owner"の"Execute"にチェックを付けてください。
TELNETでログインしてからは chmod コマンドを使って変更します。
(こちらはUNIXに関してある程度知識のある人向けです)
% chmod +x test.cgi ←属性の変更コマンド
% ls -l test.cgi ←ファイル一覧表示コマンド
-rwxr-xr-x 1 username users 4760 Jun 1 00:00 test.cgi
↑ ここに「x」が表示されていれば実行属性が付いています。 |
掲示板やカウンタCGIでのファイルロック
CGIが同時に動作するとデータファイルを二重アクセスしてしまうことがあります。
もし同時にファイルを書き込んでしまうと、データファイルが破損してしまうことがあります。
通常、これを回避するため、ロックファイルを作って順々に処理されるようにします。
flock 関数を使った、ロック開始とロック終了の処理の例
int lock(char* fname) ←ファイル名を与えると、そのファイルをロックしてファイルハンドルを返す。すでに他からロックされていたときはブロックする。
{
int fd;
if (
(fd = open(fname, O_WRONLY)) < 0 &&
(fd = open(fname, O_CREAT|O_WRONLY,0664)) < 0
) {
return -1;
}
flock( fd, LOCK_EX );
seek( fd, 0, SEEK_END );
return fd;
}
int unlock( int fd ) ←ロックしたときのファイルハンドルを与えると、ロックが解除される。この処理を行わなくてもプログラム終了時に自動的に解除されます。
{
flock( fd, LOCK_UN );
return close( fd );
} |
ここで、lock()に与えるファイル名は、データファイルの名前以外にするよう注意してください。(CGI中からデータファイル自体が開けなくなってしまうため)
※ 一般的に、 link / unlink や open 関数を使って疑似的なロック処理を行われているCGIがありますが、全く同時に
link , open したときなどは、処理が固まってしまうことがあるためおすすめできません。
flock関数はこのために用意されている関数で、弊社のサーバ(OSはFreeBSD)で問題なく使用可能です。
パスワードを付けたアクセス制限
.htaccess ファイルを使い、アカウント名とパスワードを求めるウィンドウを出す形式のアクセス制限をするときのパスワードファイルの作成の仕方の例です。
.htaccess ファイルの例
AuthUserFile /home/アカウント名/www/password.dat AuthGroupFile /dev/null AuthName "type your password"
AuthType Basic Require valid-user |
パスワードファイルの作成
サーバーへTELNETでログインしてから htpasswd コマンドを使ってパスワードファイルを作成します。
(TELNETの方法はオンラインマニュアルをご参照ください)
% htpasswd -c password.dat アカウント名 ←新しくファイルを作る場合
(または ``/www/bin/htpasswd -c password.dat アカウント名'' か ``/usr/local/bin/htpasswd -c password.dat アカウント名'' )
Adding password for test.
New password: パスワード ←パスワードを入力
Re-type new password: パスワード ←確認のためもう一度
% htpasswd password.dat アカウント名 ←すでにあるファイルにユーザーを追加する場合
Adding password for test.
New password: パスワード ←パスワードを入力
Re-type new password: パスワード ←確認のためもう一度 |
この設定をして、Internal Server Errorが出る場合は.htaccessの書式や文字コードを確認してください。
パスワード入力の画面は出るが次へ進めない場合はAuthUserFileのパス指定が間違ってないか、またはパスワードの生成方法が間違ってないか確認してください。
詳しくは各種書籍やホームページなどをご参照ください。
ホスト名によるアクセス制限
.htaccess ファイルを使い、ホスト名またはIPアドレスによって制限をかける方法です。
hogehoge.jp からのアクセスを拒否する場合 の .htaccess ファイルの例
order allow,deny allow from all deny from .hogehoge.jp |
hogehoge.jp からのアクセスのみ許可する場合 の .htaccess ファイルの例
order deny,allow deny from all allow from .hogehoge.jp |
ファイルの一覧を表示させないようにする
そのディレクトリに index.html が無かった場合に default.html を表示するという方法を採ります。
それには以下のようにdefault.htmlおよび.htaccessを作成します。
/home/(アカウント名)/www/default.html
<HTML>
<TITLE>表示できません</TITLE>
<BODY>
ファイルの一覧は管理者により表示できないように設定されております。
</BODY>
</HTML> |
/home/(アカウント名)/.htaccess
DirectoryIndex index.html http://ホームドメイン/default.html |
注意 .htaccessにOptionsの表記はできません。
動作不良をおこしたCGIの強制終了
動作不良をおこしてしまいサーバ上で動作したままとなったCGIやプログラムを放っておくと、BUSYメッセージなどが出て他のCGIも動作しなくなります。
弊社に対応をお申し付けいただいてもけっこうですが、手っ取り早く自分でこれらのCGIやプログラムを強制終了させることができます。
まずTelnetによりサーバへ接続した状態で、「ps」コマンドで動作しているプロセスの一覧を見ます。
% ps -aux |
USER | PID | %CPU | %MEM | VSZ | RSS | TT | STAT | STARTED | TIME | COMMAND |
root | 123 | 0.0 | 0.2 | 208 | 296 | ?? | Is | 23Jun00 | 0:48.42 | inetd |
root | 216 | 0.0 | 0.3 | 620 | 616 | ?? | Ss | 23Jun00 | 6:56.51 | /usr/libexec/httpd |
admin | 30 | 10.0 | 0.0 | 448 | 12 | v0 | Is+ | 23Jun00 | 0:00.14 | -csh(csh) |
root | 901 | 0.0 | 0.3 | 620 | 492 | ?? | Is | 23Jun00 | 0:53.21 | sendmail:accepting con |
username | 7498 | 0.0 | 0.3 | 1200 | 576 | ?? | I | 11:38AM | 0:00.40 | /usr/bin/perl/board.cgi |
username | 7568 | 0.0 | 0.3 | 1200 | 576 | ?? | I | 11:40AM | 0:00.41 | /usr/bin/perl/board.cgi |
username | 7579 | 0.0 | 0.3 | 1200 | 576 | ?? | I | 11:40AM | 0:00.41 | /usr/bin/perl/board.cgi |
nobody | 11319 | 0.0 | 0.3 | 740 | 528 | ?? | I | 23Jun00 | 0:01.84 | /usr/libexec/httpd |
nobody | 12609 | 0.0 | 0.3 | 640 | 532 | ?? | I | 23Jun00 | 0:00.43 | /usr/libexec/httpd |
username | 12735 | 0.0 | 0.3 | 816 | 548 | ?? | I | 12:14AM | 0:00.16 | /usr/bin/perl/board.cgi |
username | 12977 | 0.0 | 0.3 | 816 | 548 | ?? | I | 12:15AM | 0:00.17 | /usr/bin/perl/board.cgi |
いろいろと表示されると思いますが、行頭に自分のアカウント名が表示されている行が自分のCGIなどのプロセスです。
行末は動作しているCGIの名前などが表示されます。
行末近くの「STARTED」と書かれた列は、そのCGIが動作を開始した 時間になります。この時間が古いものについて怪しいと判断できます。
動作不良のCGIなどのプロセスは「kill」コマンドで強制終了できます。
アカウント名の次に表示されている番号(PID)を指定して、次のようなコマンドを入力します。
% kill 7498 7568 7579 12735 12977 |
また「ps」コマンドで見て、動作しているCGIがなくなっていれば完了です。
(なお、kill コマンドは自分のプロセスしか操作できません)
エラーメッセージと原因診断
エラーメッセージにより、そのエラーの原因をある程度まで突き止めることができます。
(Web) 404 Not Found
- URLが間違っている(誤字・脱字など)
- ファイルが存在しない(大文字/小文字の区別があります、漢字は使用できません)
(Web) 500 Internal Server Error
- .htaccessの書式が異常
- CGIが正しく動作していない(CGIプログラム内のエラー)
- 改行コード(LFのみ)または漢字コードが異常
(Web) 403 Forbidden
- .htaccessによるアクセス制限がかかっている
- HTMLファイルやディレクトリのパーミッションが異常
(Web) 401 Authorization Required
- パスワード認証のためのアカウント名またはパスワードが正しくない
- パスワードファイルが見つからない(.htaccessの書式)
- パスワードファイルの書式が異常
(Web) 503 Service Temporarily Unavailable
(Web) CGI Execute BUSY!!
(Web) Document contains no data(ドキュメントにデータが含まれていない)
- アクセスしたファイルが空(0バイト)
- CGIが正しく動作していない(CGIプログラム内のエラー)
- CGIの動作が重すぎる
(Web) directory is writable by others
(Web) file is writable by others
- ディレクトリ/ファイルに、otherユーザーの書込属性が付いている
(パーミッションは755などに指定してください)
(メール) -ERR Password supplied for "***" is incorrect.(パスワードが違う)
- アカウント名またはパスワードが正しくない
- メールボックスの容量が満杯
|