web-dev-qa-db-ja.com

Windowsサービスとしてnginxを実行する

ユーザーが接続していない場合でもリクエストをプロキシできるように、nginx(リバースプロキシ)をWindowsサービスとして実行しようとしています。

いろいろ調べてみたところ、 winsw が.exeファイル(nginxなど)からサービスを作成できることがわかりました。

次のように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>

(私はcの下のnginxと呼ばれるフォルダーにnginx.exeを持っています:oパスは正しいです)。

今問題は、サービスが作成されますが、私はそれを開始しようとすることができないようです、私はそれを開始しようとするたびに、ウィンドウがポップアップ表示されます

Error 1053: The service didn't respond to the start or control request in a timely fashion

これを修正する方法や、nginxをウィンドウサービスとして実行する別の方法をどのように修正できますか?

9
John Smith

私は見つけました [〜#〜] nssm [〜#〜] (Non-Sucking Service Manager):私が望むことを正確に行うプログラムで、セットアップがはるかに簡単です。

4
John Smith

ただここにつまずいて、この無料のオープンソースの選択肢で物事を動作させることができました: https://nssm.cc/

基本的には、サービスの作成に役立つGUIにすぎません。私が使用した手順:

  1. NGinx( http://nginx.org/en/download.html )をダウンロードし、uzipをC:\ foobar\nginxにダウンロードします
  2. Nssmをダウンロード( https://nssm.cc/
  3. コマンドラインから「nssm install nginx」を実行します
  4. NSSM guiで次を実行します。
  5. アプリケーションタブで、パスをC:\ foobar\nginx\nginx.exeに設定し、スタートアップディレクトリをC:\ foorbar\nginxに設定します
  6. [I/O]タブで、[Input slow]に「start nginx」と入力します。オプションで、出力スロットとエラースロットにC:\ foobar\nginx\logs\service.out.logおよびC:\ foobar\nginx\logs\service.err.logを設定します。
  7. 「サービスのインストール」をクリックします。サービスに移動し、「nginx」を開始します。 http:// localhost:8 を押すと、nginxログオンが取得されます。サービスをオフにし、ブラウザのキャッシュを無効にして更新すると、画面の読み込みに失敗するはずです。

あなたはそれから行くのが良いはずです。

26
Dave

[〜#〜] nssm [〜#〜] 以外のソリューションが見つかりました。それはWindows Service Wrapperであり、次の指示があります。

  1. github を使用して、Windows Service Wrapperの最新バージョンをダウンロードします。

    • このドキュメントの執筆時点での現在のバージョンはv2.1.2です(.NET2.0および.NET4.0のv2.x実行可能ファイルが利用可能なため、他はオンデマンドでのみです。)
  2. Winsw-xxxx.exeの名前をnginxservice.exeなどに変更します。

    • これは、Nginxプロセスを所有するプロセスに表示される名前です。
  3. 同じベース名を持つexeの横にXMLファイルを配置します。 nginxservice.xml。内容は次のようになります(nginxの場所を確認してください)。

<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</startargument> <startargument>c:\nginx</startargument> <stopexecutable>c:\nginx\nginx.exe</stopexecutable> <stopargument>-p</stopargument> <stopargument>c:\nginx</stopargument> <stopargument>-s</stopargument> <stopargument>stop</stopargument> </service>

  • config GitHub page とすべての可能なオプションを示す一般的な例 here で設定に関する最新の詳細を見つけることができます。

    1. コマンドnginxservice.exe installを実行します。
      • これで、サービスにNginxサービスが追加されました! (ブート時に自動的に開始するように設定されています。サーバーを開始する場合は、サービスを手動で開始する必要があります(net start Nginx)。)

上記の回答は、 post から取られました。

2
Sam G

他の回答で述べたように、NSSMはNginxをサービスとして実行するのに最適なツールです。
外部のサードパーティソフトウェアを使用しない場合、これら2つの方法のいずれかを実装できます。

  • Windowsタスクスケジューラ
  • Windowsスタートアップショートカット

Windowsタスクスケジューラ

  • この回答 で述べたように、start.batファイルを1つ準備します。
  • Nginx.exeが存在する場所にこのファイルを配置します。
  • Windowsタスクスケジューラを開き、 この回答 の説明に従ってタスクを設定して、無期限に実行します。
  • このタスクをシステムアカウントで最高の特権として実行することを忘れないでください。詳細は here にあります。
  • 特定の時刻に毎日開始するタスクを作成し、batファイルを介して、複数のnginx.exeインスタンスを作成しないように、サービスが既に実行されているかどうかを確認します。
  • 何らかの理由でNginxがシャットダウンした場合、5分以内に起動します。

Windowsスタートアップショートカット

  • Nginx.exeのショートカットを1つ作成し、Windowsのスタートアップフォルダーに配置します。

  • この回答 に従って、起動場所を見つけます。

  • Nginxは、システムにログインするたびに自動的に実行されます。
  • これが一番簡単です。ただし、ユーザープロファイルに依存しています。つまり、サーバーでNginxを実行している場合、ログオフすると停止するユーザーアカウントに対してのみ実行されます。
  • これは開発環境に最適です。
1
Soumendra

これはwinswに必要です

   <service>
        <id>nginx</id>
        <name>nginx</name>
        <description>nginx</description>
        <executable>c:\...\nginx.exe</executable>
        <logpath>...</logpath>
        <logmode>roll</logmode>
        <stopexecutable>c:\nginx\nginx-1.14.0\nginx.exe</stopexecutable>
        <stopargument>-s</stopargument>
        <stopargument>stop</stopargument>
    </service>

Nginx.confを使用していると仮定すると、<executable>が必要です。したがって、起動引数も必要ありません。また、<stopexecutable>および<stopargument>s(nginx -s stopをエミュレートするため)

0
tmjee