こんにちわ!
今日はNginx と PHP CGI を Windows サービス として登録する方法をメモしておこうと思います。
具体的にやることは3つです。
NginxやPHPだけでなく他のアプリにも応用できるようになると思います😁
- Windowsサービスラッパーをダウンロード
- Windowsサービス用のXMLファイル作成
- サービスの起動確認
たまにやる操作って忘れがちですよね。
しかもUNIX系OSはコマンド操作の方が楽だったりするし、Windowsだとひと手間かかることもあったりして。
仕事ではMac、プライベートではWindowsを使っている私はたまにやる方法でして、頻繁にやらないので忘れちゃうんですよね……。
今回の環境
- Windows 10 Pro 21H1 64ビット
- パッケージ管理ツールは使いません
準備(オプション)
例としてNginxとPHP CGIをサービス登録するので、ダウンロードしておきます。
今回はパッケージ管理ツールは使わないでいきますね!
Nginx ダウンロード
- 環境に合わせてここからnginxをダウンロード
- 解凍してフォルダを1.21.6にリネームして以下のように配置
C:\Nginx\1.21.6 ├─conf ├─contrib ├─docs | ├─ ...省略... | └─ nginx.exe
2022/02/20時点の最新バージョンNginx v1.21.6を使用します。
nginx.exeまでのパスがC:\Nginx\1.21.6\nginx.exeとなるように配置しました。
PHP ダウンロード
- 環境に合わせてここからPHPをダウンロード
- 解凍してフォルダを8.1.3にリネームして以下のように配置
C:\Program Files\PHP\8.1.3 ├─dev ├─ext ├─extras | ├─ ...省略... | ├─ php.exe ├─ php.ini └─ php-cgi.exe
2022/02/20時点の最新バージョンPHP v8.1.3 Non Thread Safeを使用します。
php-cgi.exeまでのパスがC:\Program Files\PHP\8.1.3\php-cgi.exeとなるように配置しました。
Windows サービス登録
では、Windowsサービスを登録していきます。
Nginx を登録
- ここからWINSWバイナリWinSW-x64.exeをダウンロード(2022/02/20時点の最新の安定板はv2.11.0)
- WinSW-x64.exeをリネーム(例:nginx-service-1.21.6.exe)
- 同じ名前でxmlファイルを作成(例:nginx-service-1.21.6.xml)
- xmlファイルを以下のように修正
<service> <id>Nginx v1.21.6</id> <name>Nginx v1.21.6</name> <description>「nginx」でNginx v1.21.6を起動する。「nginx -s stop」で停止する。</description> <logpath>c:\Nginx\1.21.6\logs</logpath> <logmode>roll</logmode> <depend></depend> <executable>c:\Nginx\1.21.6\nginx.exe</executable> <startarguments></startarguments> <stoparguments>-s stop</stoparguments> </service>
- nginx-service-1.21.6.exe と nginx-service-1.21.6.xml をnginx.exeと同じ場所に配置
- (なければ)ログ用のディレクトリC:\Nginx\1.21.6\logsを作成
- C:\Nginx\1.21.6でコマンドプロンプト起動して以下を実行
nginx-service-1.21.6.exe install
WinSW-x64.exeの名前がWindowsサービスのイメージ名になります。
今回は「nginx-service-1.21.6.exe」とリネームしたので「nginx-service-1.21.6.exe」ですね!
これでWindowsサービスとして登録できました。
Windowsサービス一覧に「Nginx v1.21.6」ができていると思います。
PHP CGI を登録
手順はNginxと同じなので割愛します。 XMLファイルの中身は以下のようにします。
パスなどは適宜読み替えてください!
<service>
<id>PHP-CGI v8.1.3 Service</id>
<name>PHP-CGI v8.1.3 Service</name>
<description>「php-cgi -b 127.0.0.1:9000 -q」を実行する</description>
<logpath>c:\Program Files\PHP\8.1.3\logs</logpath>
<logmode>roll</logmode>
<depend></depend>
<executable>c:\Program Files\PHP\8.1.3\php-cgi.exe</executable>
<startarguments>-b 127.0.0.1:9000 -q</startarguments>
</service>
Windows サービス起動
Nginxを起動してみましょう。

Windowsサービス一覧から該当のサービスを選択し、起動してみましょう。
※XMLファイルの内容が間違っていた場合は、ここでエラーが出て起動しません。パスとか、スペルとか。
サービスが起動したら、起動したか確認するためにコマンドプロンプトで確認してみます。
TASKLIST /FI "IMAGENAME eq nginx*"
# Linuxの以下のコマンドと同じようなことができる
# ps aux | grep nginx
出力結果は以下のようになりました。
さっき登録したNginxが起動していますね。
イメージ名 PID セッション名 セッション# メモリ使用量
========================= ======== ================ =========== ============
nginx-service-1.21.6.exe 15972 Services 0 27,404 K
nginx.exe 6328 Services 0 9,092 K
nginx.exe 13720 Services 0 9,684 K
Nginxはマスタープロセスとワーカープロセスが存在するので「nginx.exe」は2ついます。
2つのプロセスを管理しているのがnginx-service-1.21.6.exeです。
Windows サービス停止
先ほど起動したNginxを止めます。 方法は2あります。
- Windowsサービス一覧からNginxサービスを選択して「サービスを停止」を実行
- コマンドプロンプトから強制終了
②の方法をやってみます。
コマンドプロンプトを管理者として実行し、以下のコマンドを入力します。
TASKKILL /F /T /IM nginx-service*
# これでもOK👍
TASKKILL /F /IM nginx*
# 文法はこんな感じ👇
TASKKILL /F /T /IM サービスのイメージ名(ワイルドカード*使用可)
# Linuxでいうと以下のコマンドと同じようなことができる
# sudo pkill プロセス名
実行したらTASKLIST /FI “IMAGENAME eq nginx*”でN、ginxが起動していないことを確認してみましょう。
PHP CGIも手順は同じなので割愛します!
まとめ
こちらのWindowsサービスラッパーを使うことで、任意のアプリをWindowsサービスとして登録することができました。
参考になれば幸いです!
お疲れ様でした👋