使用頻度は低いが、常に可動させておきたいサービスをどう管理するか。使用頻度の低いサービスのデーモンをメモリに常駐させておくのはサーバのリソース効率が悪いというのは言うまでもないだろう。
そこでスーパーサーバ(代表的なものにxinted)というたぐいのものを使うことで、使用頻度の低いサービスの窓口のサービスのみ起動しておき、要求があったときだけ特定のサービスを起動させることが可能だ。
スーパーサーバを実際に触ってみたのでメモする。
スーパーサーバというと代表的なものにinetdとxinetdがあるが、
xinetdはinetdの拡張版で、アクセス制御などの機能を搭載しているとのことだったので、今回はxinetdを設定してみることにした。
1. 事前準備
試した環境
Vagrantで構築したCentOS 6.5(仮想環境のIPアドレスは192.168.33.10)
まずはスーパーサーバで管理するサービスを考えなければならない。
SSHとかhttpdは利用される頻度が非常に高いので、今回はFTPdにしてみることにした。
その他の候補だと、telnet、POP3などのサービスも検討していた。
※本来論でいうと複数のサービスをxinetdで管理対象とするからこそ意味があるので注意。
まずはxinetdとvsftpをインストール
$ sudo yum install xinetd vsftpd
xinetdどうこうの前に、ftp接続がきちんとできるか確認するのでサービスを起動。
$ sudo service vsftpd start
ローカルPCから接続できることを確認。
$ ftp 192.168.33.10
Connected to 192.168.33.10.
220 (vsFTPd 2.2.2)
Name (192.168.33.10:username):
2. xinetdの設定
xinetdの基本設定は/etc/xinetd.confにかかれており、
xinetdで管理する各サービスの設定は/etc/xinetd.d/配下に書く。
ftpの設定を以下の通りにした。
"service"のあとに書くサービス名称は/etc/servicesに定義されているものを記載する。
vsftpとか書いても動かないので注意。
$ sudo vim /etc/xinetd.d/ftp
service ftp
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_failure += USERID
}
設定項目については以下参照。
xinetd の設定
これでxinetdを起動
$ sudo service xinetd start
(補足) /etc/servicesってなにもの?
/etc/servicesがなにか気になったので一応調べると。
サービス名とそこで使われるポート番号、プロトコル(tcp/udp)との 対応関係を記述したファイルが /etc/services です。 このファイルは 単なるサービス名のデータベースで、それ自体では何の働きもありませ んが、netstat コマンドや次の inetd などで参照されます。 (http://www.wakhok.ac.jp/~kanayama/summer/02/site/node43.html)
3. xinetdを使ってFTPで接続してみる
xinetdが"起動している"ことと、vsftpdが"起動していない"ことを確認しておく。
$ sudo service xinetd status
xinetd (pid 3521) is running...
$ sudo service vsftpd status
vsftpd is stopped
ローカルPCからFTP接続をしてみるが、すぐにコネクションが切られた。
$ ftp 192.168.33.10
Connected to 192.168.33.10.
421 Service not available, remote server has closed connection.
syslogを確認してみると接続できているようだがその後すぐに切断されているようにみえる。vsftpd側の設定を疑ってみることにした。
$ sudo tail /var/log/message
Jan 1 15:07:25 server xinetd[3335]: START: ftp pid=3337 from=::ffff:192.168.33.1
Jan 1 15:07:28 server xinetd[3335]: EXIT: ftp status=1 pid=3337 duration=3(sec)
4. vsftpdの設定
vsftpd側で以下の設定をいじる必要があった。
$ sudo vim /etc/vsftpd/vsftpd.conf
listen=NO
vsftpdのlistenの設定は以下のとおり。
FTP コントロールポート (21) への接続要求を vsftpd 自身で見張るか。 YES の状態を「スタンドアローンモード」と呼ぶ。 inetd や後述の tcpserver を経由する場合は NO にする。 (http://www.asahi-net.or.jp/~aa4t-nngk/ftpd.html)
5. FTP接続の再チャレンジ
ローカルPCから再度FTP接続を試みる。
$ ftp 192.168.33.10
Connected to 192.168.33.10.
220 (vsFTPd 2.2.2)
Name (192.168.33.10:username):
無事につながった!
vsftpdサービスを停止しているのにftp接続ができる!
ftp接続前と接続中、接続後でプロセスを確認してみる。
> 接続前
$ ps -ef | grep ftp
vagrant 3552 2742 0 16:17 pts/0 00:00:00 grep ftp
> 接続中
> 接続中のみvsftpdのプロセスが立ち上がっている。
$ ps -ef | grep ftp
nobody 3555 3521 0 16:18 ? 00:00:00 vsftpd
vagrant 3557 3555 0 16:18 ? 00:00:00 vsftpd
vagrant 3559 2742 0 16:18 pts/0 00:00:00 grep ftp
> 接続終了後
$ ps -ef | grep ftp
vagrant 3552 2742 0 16:17 pts/0 00:00:00 grep ftp
プロセスツリーを見てみると、xinetdプロセスがvsftpdを起動していることがわかる。
> 接続前
$ pstree -p
init(1)-+-VBoxService(1003)-+-{VBoxService}(1004)
|
| (略)
|
`-xinetd(3521)
> 接続中
$ pstree -p
init(1)-+-VBoxService(1003)-+-{VBoxService}(1004)
|
| (略)
|
`-xinetd(3521)---vsftpd(3562)---vsftpd(3563)
サービスを起動しておかなくてもxinetd経由で起動できることが確認できた。
クラウド時代で言うサーバレスの概念の大本とも言える。