NginxとPHP CGIをWindowsサービスに登録する

目次

NginxとPHP CGIをWindowsサービス として登録する方法をメモしておこうと思います。

具体的にやることは3つです。
NginxやPHPだけでなく他のアプリにも応用できるようになると思います。

たまにやる操作って忘れがちですよね。
しかもUNIX系OSはコマンド操作の方が楽だったりするし、Windowsだとひと手間かかることもあったりして。
仕事ではMac、プライベートではWindowsを使っている私はたまにやる方法でして、頻繁にやらないので忘れちゃうんですよね。

今回の環境

準備

例としてNginxとPHP CGIをサービス登録するので、ダウンロードしておきます。
今回はパッケージ管理ツールは使わないでいきます。

Nginx ダウンロード

  1. 環境に合わせてここからnginxをダウンロード
    2022/02/20時点の最新バージョンはNginx v1.21.6でした。
  2. 解凍してフォルダを「1.21.6」にリネームして以下のように配置
    nginx.exeまでのパスがC:\Nginx\1.21.6\nginx.exeとなるように配置しました。
    C:\Nginx\1.21.6
        ├─conf
        ├─contrib
        ├─docs
        ├─ ...省略...
        └─ nginx.exe
    

PHP ダウンロード

  1. 環境に合わせてここからPHPをダウンロード
    2022/02/20時点の最新バージョンは8.1.3だったので PHP v8.1.3 Non Thread Safeにしてます。
  2. 解凍してフォルダを「8.1.3」にリネームして以下のように配置
    C:\Program Files\PHP\8.1.3
        ├─dev
        ├─ext
        ├─extras
        ├─ ...省略...
        ├─ php.exe
        ├─ php.ini
        └─ php-cgi.exe

Windows サービス登録

では、Windowsサービスを登録していきます。

Nginx を登録

  1. ここ からWINSWバイナリWinSW-x64.exeをダウンロード(2022/02/20時点の最新の安定板はv2.11.0)
  2. WinSW-x64.exeをリネーム(例:nginx-service-1.21.6.exe)
  3. 同じ名前でxmlファイルを作成(例:nginx-service-1.21.6.xml)
  4. 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>
  5. nginx-service-1.21.6.exe と nginx-service-1.21.6.xml をnginx.exeと同じ場所に配置
  6. (なければ)ログ用のディレクトリC:\Nginx\1.21.6\logsを作成
  7. 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サービス

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あります。

2つめの方法をやってみます。
コマンドプロンプトを管理者として実行し、以下のコマンドを入力します。

TASKKILL /F /T /IM nginx-service*
# これでもOK👍
TASKKILL /F /IM nginx*

# 文法はこんな感じ👇
TASKKILL /F /T /IM サービスのイメージ名(ワイルドカード*使用可)

# Linuxでいうと以下のコマンドと同じようなことができる
# sudo pkill プロセス名

実行したらTASKLIST /FI "IMAGENAME eq nginx*"でNginxが起動していないことを確認してみましょう。
PHP CGIも手順は同じなので割愛します。

まとめ

こちらのWindowsサービスラッパーを使うことで、任意のアプリをWindowsサービスとして登録することができました。
参考になれば幸いです。