CodlessCode
Personal

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

こんにちわ!
今日はNginx と PHP CGI を Windows サービス として登録する方法をメモしておこうと思います。

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

  • Windowsサービスラッパーをダウンロード
  • Windowsサービス用のXMLファイル作成
  • サービスの起動確認

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

 

今回の環境

  • Windows 10 Pro 21H1 64ビット
  • パッケージ管理ツールは使いません
 

準備(オプション)

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

 

Nginx ダウンロード

  1. 環境に合わせてここからnginxをダウンロード
    Nginx 1.21.6 ダウンロード
  2. 解凍してフォルダを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 ダウンロード

  1. 環境に合わせてここからPHPをダウンロード
    PHP 8.1.3 ダウンロード
  2. 解凍してフォルダを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 を登録

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

  1. Windowsサービス一覧からNginxサービスを選択して「サービスを停止」を実行
  2. コマンドプロンプトから強制終了

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

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サービスとして登録することができました。
参考になれば幸いです!

お疲れ様でした👋