トップページ サービスご案内 お知らせ お申込み お問い合わせ コミュニティ サポート オンラインマニュアル

さくらウェブ

ヒント集








パーミッションの変更

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.(パスワードが違う)

  • ユーザー名またはパスワードが正しくない
  • メールボックスの容量が満杯








(C)Copyright 1996-2000, SRS SAKURA Internet Inc.