Windowsで任意のアプリをサービス化するには
(これはまだ完成していない。)
NSSM ( the Non-Sucking Service Manager) を使う。NSSMを使うと、任意のアプリケーションをサービスとして実行できる。
これまで
Windows Server 2003 Resource Kit Toolsに含まれる、srvany.exeおよびinstsrv.exeなんかを使っていた。けど、これはちょっと問題があったりする。サービスとして実行したアプリが死んだ時、自動的に再起動してくれなかったりとか。インストール時におけるOSのバージョン制限があったりとか。srvany.exeだけダウンロードできなかったりとか。いろいろです。
その辺りのケアもしてくれるのが、NSSM。上記の制限がなく、ついでに設定だってGUIでできちゃったりする (コンソールがまったく要らなくなるわけではないんだけどね)。
とりあえずソースも公開されているので、必要なら改造だってできるはず (ライセンスはパブリックドメインですよ)。
NSSM自体のインストール
NSSMそのものは、適当なフォルダにおけばいい。しかし、CLIでのコマンドによる操作が必要になるので、環境変数PATH
に含まれるフォルダにおいておくと便利です。
各サービスのインストール
C:\> nssm install service_name
とすると、service_name
という名前でサービスがインストールされる。この名前はいろいろ使うので、ちゃんと覚えておくと捗ります。
そうすると、設定用GUIが起動する。
サービスの設定
(TBD)
各サービスのアンインストール
C:\> nssm remove service_name
とする。確認ダイアログがでるので、「Yes」と答えればアンインストール実行。
NSSM自体のアンインストール
単純に消せばOK。ただし、NSSMを使ってインストールしたサービスは先に削除しておくこと。そうでないと、色々大変になる可能性が高い (サービスが起動できない! ってログがたくさん残ってしまう)。
使い方の例
外部Webサーバをリバースプロクシにした上で、内部でWebアプリケーション・サーバを複数動かすような構成を考える。
このとき、ThinをWebアプリケーション・サーバとしたRailsアプリを動作させたいとする。
Linuxなんかではごく普通に構成できるこの組み合わせだけど、Windows環境下においてはいろいろ面倒なことがおこる。ThinはWindows上でのデーモン化 (Windows語でいうならサービス化だ) をサポートしていないからだ。
もちろん、手動で起動してがんばる手もあるんだけど、Windows Updateなんかによる自動再起動が有効になっていた場合など、ちょっといろいろ面倒。手動で更新してる場合でも、再起動ごとに忘れずにThinを起動しないとサービス不能になっちゃうし。
こんな時、NSSMをつかってプロセスをサービス化してしまえば、OSの再起動にも負けないサービス提供ができるようになる。RubyやRailsの生産性・既存資産を使いたいんだけど、どうしてもWindows環境を使わざるを得ない制約があるとき、NSSMはとても有効な解になる。
(TBD)