DeleGateの動かし方・止め方

/*////////////////////////////////////////////////////////////////////////
Copyright (c) 1997 Yutaka Sato
Copyright (c) 1997 Electrotechnical Laboratry (ETL), AIST, MITI

Permission to use, copy, and distribute this material for any purpose and
without fee is hereby granted, provided that the above copyright notice
and this permission notice appear in all copies.
////////////////////////////////////////////////////////////////////////*/
--------------------------------------------------------------------------

    DeleGateの動かし方・止め方  -- サービスとしての実行方法

    97/12/10 Yutaka Sato 
    98/04/08 last update

--------------------------------------------------------------------------
この文書の改訂最新版は以下にあります。

-------------------------------------------------------------------------

ここでは、DeleGateを起動・再起動・終了するための方法について、UnixかWindows
か等によらない共通の方法と、UnixとWindowsのそれぞれ固有な方法(特にサービス
としての実行方法について)を解説します。


1. 端末からの起動と終了

DeleGateを起動する方法として、最も基本的でプラットフォームに依存しない方法
は、端末(窓)から手動でコマンドを投入して起動する方法です。この場合特に指定
しなければ、DeleGateは利用者が通常使用する形態で実行します。例えばDeleGate
を単に、

  delegated -P8080

と起動した時(*1)、各プラットフォーム上での実行形態は以下のようになります。

  各種Unix  -- バックグラウンドで実行
  OS/2+EMX  -- バックグラウンドで実行(たぶん)
  WindowsNT -- バックグラウンドでサービスとして実行(自動的に登録・開始)
  Windows95 -- フォアグラウンドで実行

バックグラウンドでの実行では、DeleGateサーバは特定の端末(窓)からの制御を受
け付けない状態で実行しており、従って端末の割り込みキー等でDeleGateサーバを
終了させることはできません(*2)。そこで、以下のように「-Fkill」により、"-P"
で指定したポートのDeleGateサーバを終了させられるようになっています(DeleGate/
4.4.0以降)。

  delegated -P8080 -Fkill

同様に、実行中のDeleGateサーバを再起動(再初期化や起動パラメタの読み込み)
させるには、以下のようにします。

  delegated -P8080 -Fkill-HUP

Unix では、ps コマンドでDeleGateプロセスを探して、直接的に kill コマンドで
そのプロセスを終了させたり一時停止させる方法も一般的に使われます。
WindowsNTで端末から起動されたDeleGateは、自動的に自分自身をサービスとし
て登録し、サービスとして実行を開始します(DeleGate/4.1.4以降)。その後はサー
ビス管理機能を用い、マウス操作でDeleGateサービスの開始・一時停止・終了を
行うことができます。
Windows95では、DeleGateは端末(窓)から起動し、フォアグラウンドでのみ実行し
ます(*3)。このように端末から起動されフォアグラウンドで実行しているDeleGate
サーバは、その端末上で割り込みキー(一般にはcontrol-C)を打つ事で終了させる
ことができます。


2. テスト・デバッグ時の起動

DeleGateのテストやデバッグを行う際には、DeleGateサーバをフォアグラウンドで
実行したり、実行状況のログを起動端末に表示したりすると便利です。そこで起動
時のオプションとして、以下のものが用意されています。

  -v  フォアグラウンドで実行し、動作ログを起動端末(標準エラー出力)へ
  -vv -v と同様。より詳細な動作ログを出力
  -1  単一プロセスとしてフォアグラウンドで実行し、動作ログを起動端末へ
  -f  フォアグラウンドで実行 (割り込みキーで終了可能)
  -w  Windows等のプラットフォーム依存のデバッグ情報を出力


3. Unix上で自動的に起動する

Unixでは、クライアントからのアクセスがあった時にオンデマンドで、対応する
サーバを起動する方法が、「inetd」サーバにより提供されています。この機能を
使用するには、一般に /etc/services(サービス名とポート番号の登録)および
/etc/inetd.conf(サービス要求時に起動するコマンドや実行モードの設定)と
いうファイルに、必要な設定を行います(これらはroot権限で行う必要があります)。
以下に、8080番ポートで HTTP-proxy として DeleGate を走らせる場合の設定例
を示します。

"/etc/services":
  http-proxy 8080/tcp

"/etc/inetd.conf":
  http-proxy stream tcp wait nobody /xxx/delegated.rc

"/xxx/delegate.rc":
  #!/bin/sh
  /xxx/delegated ¥
   SERVER=http ¥
   VARDIR=/var/delegate ¥
   MAXIMA=delegated:32 ¥
   ...

上記の設定の後、inetd プロセスに対して "kill -HUP" を行うと、これらの設定
が有効になり、DeleGateサーバが使用可能になります。上の inetd.conf の例では、
nobody というユーザの権限でDeleGateサーバを実行させるように指定しています。
HTTP 用のプロキシなど、起動頻度の高いものは、この例のように "wait" 状態で
起動することにより、delegated 自体に並列サーバプロセスの生成を管理させる
方法が、実行効率の面から推奨されます。また並列プロセスの総数を制限したい場合
には wait 状態で実行することが必須です。wait 状態で実行した場合に常駐する
ことになる delegated プロセスは、1. で示した方法で終了させたり、再起動させ
ることができます。一方、FTPやNNTPのプロキシなど、起動頻度が比較的低い場合
には nowait 状態で実行しても良いでしょう。

このように inetd から起動する場合、起動されたDeleGateサーバには既に特定ポー
トに束縛あるいは接続済みのソケットが渡され、それが使われますので、"-P"
オプションによるポート番号を指定する必要はありません(指定しても無効です)。
なお、VARDIRなどで指定する各種ディレクトリ/ファイルは、inetd.conf で指定
したユーザ権限(上の例ではnobody)で読み書きできるようにモードを設定して
置いて下さい。

複数のネットワークインターフェイスを持つホスト上で、特定のネットワークイン
ターフェイスに限定してDeleGateを実行することは、一般の Unix の inetd では
サポートされていません(たぶん)。そのような場合には、1. に示したように
手動で起動するか、あるいは /etc/rc などのシステム起動時の初期化ファイル
から起動するか、各ユーザの cronを使って定時的に起動するか、などの方法で
対処して下さい。
SEE ALSO: chmod(1), services(5), inetd.conf(5), inetd(8), cron(8)


4. WindowsNT上でサービスとして起動する

WindowsNT では、バックグラウンドに常駐して実行するサーバプログラムを「サー
ビス」という形でシステムに登録し、マウス操作で起動・一時停止・終了を行う
ことができます(これらはAdministratorの権限で行う必要があります)。また、
サーバ起動時に与えるべきパラメタや環境変数をレジストリに置き、レジストリ・
エディタで編集することができます(*4)。

DeleGate は WindowsNT 上で起動されると、自身をサービスとして実行するのに
必要な設定を自動的に行います。例えば、以下のようなコマンド行を投入すると、

  delegated -P8080 ADMIN=user@host.domain

以下のような操作が自動的に行われ、DeleGateサービスが利用可能になります。

 (1) サービスとして登録する(サービス名: DeleGate-P8080)
 (2) レジストリへ登録する(レジストリ名: HKEY_LOCAL_MACHINE¥SYSTEM¥
      CurrentControlSet¥Services¥DeleGate-P8080,
      起動パラメタ: Parameters, 環境変数: Environments)
 (3) DeleGate-8080 サービスを開始する

起動パラメタのレジストリ"Parameters"には、コマンド行全体が登録されます。
環境変数のレジストリ"Environments"には、delegated を起動した端末窓において
設定されているもののうち、以下のものが登録されます。

  USER, PATH, SHELL, COMSPEC, PATHEXT, PWD

この Parameters や Environments を、レジストリエディタ(regedt32等)を用
いて追加や変更を行い、サービス管理(「コントロールパネル」中の「サービス」)
によりサービスを停止・再開することにより、DeleGateサーバの設定を変更して
再起動することができます。
レジストリエディタの操作性が手に馴染まない場合には、起動パラメタを書き並べ
た parameters ファイルを作り、

  delegated +=parameters

のように起動しても良いでしょう(*5)。この parameters ファイルをお好みのテキスト
エディタなどで変更後、サービスの停止・再開を行えば、変更が反映されます。
起動パラメタだけでなく、再起動されるDeleGateサーバに与える環境変数も同様
にレジストリを使わずに変更するには、parameters ファイルの中に
「-eNAME=VALUE」のように書きます(DeleGate/4.4.0以降)。例えば
「PATHEXT=.exe という環境変数を与えたい(に変更したい)」場合には、
parameters ファイルに "-ePATHEXT=.exe" のような行を書き加えます(*6)。

ホストコンピュータの起動時に自動的にDeleGateサービスを起動するには、サー
ビス管理のウィンドウを開き、DeleGateサービスを選び、「スタートアップの
種類」として「自動」を選択します。

一方、DeleGateサービスを停止・削除する方法ですが、これは上記のように既に
サービスとして DeleGate が登録され(実行している)状況で、

  delegated -P8080

のように入力すればOKです。削除するか否かを尋ねてきますので、y (yes) と
答えて下さい。これにより、DeleGateサービスの(終了と)削除が行われます。

-------------------------------------------------------------------------
(*1) これはDeleGateを、HTTPプロキシとして(かつ上流DeleGate兼用サーバと
して)使用するための、最も単純な起動方法です。

(*2) バックグラウンドで実行しているDeleGateサーバを終了させるのは少し
面倒です。これは、一つのマシン上で複数のDeleGateサーバを実行している場合
が多く、また一つのDeleGateサーバも複数の並列実行プロセスとして動作する
ため、どのプロセスに終了シグナル(SIGTERM)を送れば良いかを判別するのが面倒
だからです。あるDeleGateサーバを停止させるのに、関連する全てのDeleGate
プロセスにSIGTERMを送る必要は無く、起動時に最初に産まれて「親玉」となって
いるプロセスにSIGTERMシグナルを送ればよい(そこから産まれたプロセスは全て
連鎖的に終了する)ようになっています。このような終了操作を簡便にするため
に、現在生きているDeleGateサーバは、それぞれに、親玉プロセスの番号をファ
イル上に記録しています。例えば、8080番ポート上で動作しているサーバの親玉
プロセスのプロセス番号は以下のようなファイルに記録されています。

  /tmp/delegate/pid/8080

(もしACTDIRパラメタが指定されていれば ACTDIR/pid/8080)。したがって、以下の
ようなコマンドで、8080番ポートのDeleGateサーバを終了させることができます。

  kill `cat /tmp/delegate/pid/8080`

"delegated -Fkill -P8080" ではこれと同等の操作を行っています。

(*3) このようにしているのは、Windows95 では WindowsNT のようなサービス
管理機能が標準装備されておらず、また端末窓から起動したバックグラウンドで
実行中のプログラムを調べたり停止したりする簡便な方法が、Windows95の標準
環境では提供されていないためです(だったような… -Fkill の導入で事情は
変わったかも。だけど、端末窓の生死から独立したプロセスは作れない?)。

(*4) Windowsのサービスとレジストリによるサーバ管理は、Unix に例えれば
/etc/rc で行うような初期設定機能に相当し、全てのサーバに対して統一的な
管理と対話的な設定変更を支援する機能を加えたようなものと言えるでしょう。

(*5) +=の右側はファイル名に限らず、パラメタデータが置かれているhttpやftp
のURLを指定することができます。例: +=http://server/delegate/parameters

(*6) DeleGateの特殊な起動パラメタ形式として -eNAME=VALUE という形式があ
り、これによってDeleGateサーバに対して「環境変数として NAME=VALUE を設定
させる」ことができます。これらは、DeleGate 自身が見る環境変数となると
ともに、DeleGateサーバから起動されるプログラム(CGIプログラムや外部フィル
タプログラム等)に対して引き継がれることになります。
-------------------------------------------------------------------------


                    @ @  
佐┬─┐─┬─┌   //\^^   ( - )
藤├─  │ │ / 876m\  _<   >_ 
豊┴── ┴ ┴──────────────────────────────┘