萬由無事覚書

不知物故萬由無事覚書仕候也。

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に含まれるフォルダにおいておくと便利です。

各サービスのインストール

ここからCLIを使う。まずはコマンドプロンプトを起動して、

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の再起動にも負けないサービス提供ができるようになる。RubyRailsの生産性・既存資産を使いたいんだけど、どうしてもWindows環境を使わざるを得ない制約があるとき、NSSMはとても有効な解になる。

(TBD)