secretbase.log

.NET/C#/Pythonなど

nginx を Windows サービスとしてインストールする

はじめに

常時動作しているWindowsマシンがあり、 nginx と Webアプリケーション(nodejsまたはGoやPythonで記述)の組み合わせて提供することができそうで環境構築をしたのでメモします。

nginx は Windows の場合コマンドラインアプリケーションとして動作させることができます。しかしサービス化は、将来の予定にはあるようですが、現時点ではまだ提供されていません。

winswを使って実現しているblogがいくつかありましたので、最新のバージョンの手順です。

  • nginx 1.11.10 (現時点のmainlineバージョン)
  • winsw 2.0.2.0 (現時点の最新)

f:id:cointoss1973:20170306124538p:plain

nginx のインストールと動作確認

まずは、単体アプリケーションとして起動を確認します。

  1. 公式サイトから zip をダウンロードして、C:\nginx に展開します
  2. コマンドプロンプトを開きます。
  3. start nginx にて起動します
  4. Windows セキュリティの重要な警告 ダイアログが表示されますので「アクセスを許可する(A)」を選択します

f:id:cointoss1973:20170306123939p:plain

  1. http://localhost をブラウザで開いてWelcome to nginx! ページが表示されることを確認します

f:id:cointoss1973:20170306123923p:plain

正しくインストールされていることを確認できました。

Windowsサービス化

次に、Windowsサービス化をします。

サービス化には、任意のプロセスをサービス化することができる winsw を利用します。

  1. WinSW をダウンロードします

    • WinSW 2.x系は、.NET Framework 2系(~3.5) と、 .NET Framework 4系が提供されています
    • 現時点では、 V2.0.2 が 最新です
  2. ダウンロードした WinSW.exe を nginxsvc.exe にリネームします。(この名前は好きな名前で良いです)

  3. exe と同じ名前の xml を作成します (ここでは nginxsvc.xml を作成します)

<service>
  <id>nginx</id>
  <name>nginx</name>
  <description>nginx</description>
  <executable>c:\nginx\nginx.exe</executable>
  <logpath>c:\nginx\</logpath>
  <logmode>roll</logmode>
  <depend></depend>
  <startargument>-p c:\nginx</startargument>
  <stopargument>-p c:\nginx -s stop</stopargument>
</service>
  1. 管理者のコマンドプロンプトを開きます

  2. C:\nginx\nginxsvc.exe install を実行します

起動

f:id:cointoss1973:20170306123956p:plain

  • nginx がサービスとして登録されていますので右クリックして起動します

エラー

あれ、エラーになりました。

nginxsvc.err.log にエラーが出力されていますので、中身を確認します。

nginx: [alert] could not open error log file: CreateFile() " c:\nginx/logs/error.log" failed (123: The filename, directory name, or volume label syntax is incorrect)
2017/03/06 09:35:40 [emerg] 10528#10192: CreateFile() " c:\nginx/conf/nginx.conf" failed (123: The filename, directory name, or volume label syntax is incorrect)

ファイル、ディレクトリ名が不正のようです。

起動オプションの修正

nginxsvc.xml の定義にて、nginx を起動時の引数として -p オプションで指定しているのですが、このあたりが影響してそうです。 削除して試してみます。

C:\nginx\nginxsvc.exe uninstall にて、一度アンインストールします。

<service>
  <id>nginx</id>
  <name>nginx</name>
  <description>nginx (powered by WinSW)</description>
  <executable>c:\nginx\nginx.exe</executable>
  <logpath>c:\nginx\</logpath>
  <logmode>roll</logmode>
  <depend></depend>
  <startarguments></startarguments>
  <stoparguments>-s stop</stoparguments>
</service>

xmlファイル修正 【2017/3/6 15時追記】

  • startarguments 、 stoparguments (複数形にする)必要があります
    • これにしておかないと Windowsサービスが停止できない状況が発生します

実行

C:/nginx/nginxsvc.exe install を再度実行します。

うまく起動しました。 ブラウザで http://localhost を開いてみます。

logs\access.log にもアクセス記録が追記されていますので、 conf フォルダや logs フォルダにもアクセスできています。

参考

nginx

winsw