前へ << RSA で暗号化してみよう (2) | inetdを利用してechoサーバを作ってみよう >> 次へ |
サーバとは特定のポートを見張っているプログラムのことです。 クライアントはサーバの動いているホストの(サーバが見張っているはずの) ポートに connect し、データのやりとりをします。 もしサーバがポートを見張っていない場合はクライアントは connect することはできません。
ですから、1つのコンピュータに WWW サーバ、FTP サーバ、SMTP サーバ、POP3 サーバを上げておく場合、 それぞれポート80、ポート21、ポート25、ポート110を見張っておく プロセスを実行しておかなければなりません (UNIX では現在実行中のプログラムのことをプロセスといいます)。
例えば FreeBSD だと標準設定では SMTP サーバ、FTP サーバなどが 自動的にインストールされています。では ps コマンドを使って ポート25(SMTP) を見張っているプロセスはどれなのか調べてみましょう。
% ps axww (Solarisなど、SystemV系UNIXなら ps -ef) 0 ?? DLs 0:00.14 (swapper) 1 ?? Is 0:00.03 /sbin/init -- 2 ?? DL 0:06.41 (pagedaemon) 3 ?? DL 0:00.00 (vmdaemon) 4 ?? DL 0:18.71 (update) 27 ?? Is 0:00.01 adjkerntz -i 55 ?? Is 0:00.82 routed -q 72 ?? Ss 0:00.58 syslogd 80 ?? Is 0:00.02 portmap 104 ?? Is 0:00.13 inetd 107 ?? Ss 0:00.73 cron 111 ?? Is 0:00.13 sendmail: accepting connections on port 25 (sendmail)最後の行のプロセス番号111番の sendmail がそうです (プロセス番号が111なのはたまたまそうだっただけです)。 ご丁寧にも「ポート25番へのアクセスを受け入れます」と書いてありますね。
ではポート21を見張っているはずの FTP サーバはどこにあるんでしょう。 psで見る限りではどこにもありませんね。実は inetd というものが FTP サーバの代わりをしているのです。
この役割を担っているのが inetd です。上の ps の例では、プロセス番号104となっています。 inetd の設定ファイルは /etc/inetd.conf です。以下に ftp の部分を引用します。
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -lこのように inetd がポート25を見張っていて (ポート25だけではありませんが)、 ポート25にクライアントからの接続要求があると、/usr/libexec/ftpd を実行します。あとは ftpd が FTP クライアントと通信するわけです。
では実際に確かめてみましょう。まず ftpd が起動していないことを 確認します。
% ps axww | grep ftpd何も出力されませんね? ということは現在 ftpd のプロセスは実行されていない ということです。では ftp を使って localhost の FTP サーバに アクセスしてください。次に、Ctrl-z を押してサスペンド(中断)して、 ps axww | grep ftpd とタイプしてください (あるいは別ウィンドウで ps axww|grep ftpd をタイプしてもいいです)。
% ftp localhost Connected to hoge.fuga.com 220 hoge.fuga.com FTP server (Version 6.00) ready. Name (localhost:user): ^Z Suspend % ps ax | grep ftpd 456 ?? Ss 0:00.05 ftpd: hoge.fuga.com: connected (ftpd)FTP クライアントがポート21に接続したら ftpd が出現しました。 では ftp を終了させましょう。fg でフォアグラウンドで再実行させて、 Ctrl-C で終了させてください。
% fg ftp localhost ^C再度ftpdを確認してみましょう。
% ps ax | grep ftpd何も表示されません。ということは FTP クライアントが 接続要求を出したときだけ ftpd が実行され、コネクションが 切断されると ftpd は終了してしまったということです。
ポートの監視を行い、接続要求があったときだけサーバ本体を起動すること。 これが inetd の役割です。これにより、たくさんのポートを監視するためだけに、 多くのプロセスを起動しなくてもすむわけです。
inetd は、その役割からスーパーサーバとも言われます。
また、簡単なサーバ、例えば後からサンプルとしてでてくる echo サーバなどは inetd の内部に組み込まれています。 /etc/inetd.conf に internal と書いてあるものは inetd の内部のサーバが起動されることを表しています。
inetd を使った場合はコネクションが終了すると、サーバプロセスも終了してしまいます。 上の例でも、ftpd はコネクションを切ると終了していましたよね?
ところが頻繁にアクセスがあるサーバの場合、inetd によるサーバの実行/終了に 時間がかかり、反応速度が遅くなってしまいます。「メモリを取るか、実行速度を取るか」 と考えた場合、sendmail や httpd は実行速度を重要視して、 素早く反応できるようにしてあるのです。
前へ << RSA で暗号化してみよう (2) | inetdを利用してechoサーバを作ってみよう >> 次へ |
ご意見・ご指摘は Twitter: @68user までお願いします。