■さくらウェブ
ヒント集
パーミッションの変更
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);
lseek(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 /~(アカウント名)/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 301 0.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!!
- アクセスが多すぎる(ビジー)
- CGIが異常動作をしている
(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.(パスワードが違う)
- ユーザー名またはパスワードが正しくない
- メールボックスの容量が満杯
|