□suexec process control
プロバイダーを運用していると、1台のサーバーで複数のユーザーを抱え
る事になり、しかもCGIをOKとかにしているとがんがん動かされて(アク
セスが集中すれば、の話)しまい、CPU負荷が鰻登りになって最終的には
サーバーがお亡くなりになります。
そのような状態を防ぐ為に、各ユーザーが起動出来るプロセス数を制限
しましょう。
基本的な仕組みとしては、CGIの実行要求があると、/proc を見て該当
ユーザーが実行しているプロセス数をカウントし、設定値以上の場合に
実行させないというものです。もっともこれができるのはユーザー権限
でCGIを動作させている場合ですが、「daemon:daemon」で運用している
場合やグループ別、またサーバー負荷に応じてという場合などにも応用
出来るかと思います。
Apache2 のソースパッケージを展開したディレクトリ内に ./supoort
というディレクトリが有り、その中に suexec.c があります。これに
「proccheck」というサブルーチンを main の前に追加します。下記の
場合には、ユーザーが起動出来る最大プロセス数を16個に制限して
います。エラー番号は適当です。ごめんなさい。(^^;
この改造はC言語と、Apache のCGI起動の仕組をある程度理解している
人が対象です。私もある程度しか理解していませんが、ある程度判って
いれば下記のソースを見れば判る筈です。
suexec.c の追加変更内容
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
:
:
#include <sys/dir.h> // T.Kabu for proccheck
:
:
#define MAXPROC 16 // T.Kabu for proccheck
:
:
//
// Process Check T.Kabu
//
// return …
//???? 0 … OK
//??? !0 … ERROR
//
int proccheck(int check_userid,int maxproc)
{
??? DIR *dir_p;
??? struct direct *dir;
??? struct stat filestat;
??? int proc_num = 0;
??? char filename[256];
???
??? //
??? // Open DIR
??? //
??? if ((dir_p = opendir(“/proc/”)) == NULL)
??? {
??????? fprintf(stderr, “cannot open /proc/ !?\n”);
??????? return(1);
??? }
???
??? //
??? // Read DIR
??? //
??? while ((dir = readdir(dir_p)) != NULL)
??? {
??????? if (dir->d_ino == 0)
??????? {
??????????? continue;
??????? }
??????? if ((dir->d_name[0] < 0x30) || (dir->d_name[0] > 0x39))
??????? {
??????????? continue;
??????? }
??????? if (strlen(dir->d_name) > 200)
??????? {
??????????? continue;
??????? }
???????
??????? sprintf(filename,”/proc/%s”,dir->d_name);
??????? stat(filename,&filestat);
??????? if (filestat.st_uid == check_userid)
??????? {
??????????? // printf(“%s\tis kabu\’s process!!\n”,filename);
??????????? if ((proc_num++) > maxproc)
??????????? {
??????????????? // printf(“Process over, %i.\n”,proc_num);
??????????????? return(1);
??????????? }
??????? }
??? }
??? closedir(dir_p);
??? return(0);
}
int main(int argc, char *argv[])
{
??? :
??? :
??? /*
???? * Error out if process is over count, MAXPROC T.Kabu
??? */
??? if (proccheck(uid,MAXPROC)) {
??????? log_err(“error: Process is over count!\n”);
??????? exit(199);
??? }
??? :
??? :
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
修整したら、
make suexec
cp suexec /usr/local/apache2-NORMAL/bin/suexec
chmod 4711 /usr/local/apache2-NORMAL/bin/suexec
でOKです。他のタイプのApacheも必要に応じて修正してください。
Apache-2 では「.cgi」がコメントアウトされている場合があるので
〜.cgiというファイル名で動作確認をする場合には注意すること。
>???? #
>???? # To use CGI scripts outside of ScriptAliased directories:
>???? # (You will also need to add “ExecCGI” to the “Options” directive.)
>???? #
>???? #AddHandler cgi-script .cgi?←有効にすること
〜.shtml もこの近くでコメントアウトされてます。(^^;
参考:UNIX−Cプログラミング他