静的コンテンツのフロント エンド サーバーとして NGINX をセットアップし、その他のバックエンド サーバーとして Apache を使用しています。
nginx.exe
問題は、Windows システム サービス (Apache など)を作成できる論理的な答えが見つからないことです。
これに対する答えはありますか?
静的コンテンツのフロント エンド サーバーとして NGINX をセットアップし、その他のバックエンド サーバーとして Apache を使用しています。
nginx.exe
問題は、Windows システム サービス (Apache など)を作成できる論理的な答えが見つからないことです。
これに対する答えはありますか?
Windows Service Wrapperでそれを行う方法
(注: 現在のところ、より簡単な代替手段があります。以下で説明する解決策も参照してください。sunegによるチョコレート パッケージ マネージャーを使用し、 Adamyから直接NSSMを使用します)
winsw-*.exe
のような名前に変更しますnginxservice.exe
。
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>
nginxservice.exe install
。これで、nginx
サービスにサービスが追加されました! (起動時に自動的に開始するように設定されています。サーバーを開始する場合は、サービスを手動で開始する必要があります ( net start nginx
)。)
nginx を Windows サービスとして正しく設定する方法の詳細な説明: http://web.archive.org/web/20150819035021/http://misterdai.yougeezer.co.uk/posts/2009/10/16/nginx-windows-サービス/
上記のブログ投稿に含まれていない追加情報:
Windows Service Wrapper の最新バージョンは、次の Maven リポジトリからも見つけることができます: http://repo.jenkins-ci.org
Maven + Gradle の例:
<dependency>
<groupId>com.sun.winsw</groupId>
<artifactId>winsw</artifactId>
<version>2.2.0</version>
<classifier>bin</classifier>
<packaging>exe</packaging>
</dependency>
<repository>
<id>jenkinsci</id>
<name>jenkinsci-releases</name>
<url>http://repo.jenkins-ci.org/releases</url>
</repository>
compile "com.sun.winsw:winsw:2.2.0"
repositories {
mavenCentral()
maven { url http://repo.jenkins-ci.org/releases }
}
NSSM フォーム http://nssm.cc/downloadをダウンロードします。"%NSSM_HOME%\nssm.exe install "Nginx" を実行"
NSSM ダイアログで Nginx 実行可能ファイルを選択し、[OK] をクリックします。サービスに移動し、新しく作成されたサービス「Nginx」を開始します。
start.batとstop.batを使用して同じ効果を実現できます。
@ECHO OFF
REM Start Nginx
tasklist /FI "IMAGENAME eq nginx.exe" 2>NUL | find /I /N "nginx.exe">NUL
IF NOT "%ERRORLEVEL%"=="0" (
REM Nginx is NOT running, so start it
c:
cd \nginx
start nginx.exe
ECHO Nginx started.
) else (
ECHO Nginx is already running.
)
@ECHO OFF
REM Stop Nginx
tasklist /FI "IMAGENAME eq nginx.exe" 2>NUL | find /I /N "nginx.exe">NUL
IF "%ERRORLEVEL%"=="0" (
REM Nginx is currently running, so quit it
c:
cd \nginx
nginx.exe -s quit
ECHO Nginx quit issued.
) else (
ECHO Nginx is not currently running.
)
SC.EXE は、Windows サービス API を既にサポートしており、サービス コントロール マネージャー (SCM) からの要求の開始と停止に適切に応答できる実行可能ファイルに対してのみ機能します。特にサービスとして書かれていない他の通常のアプリケーションは、単に起動に失敗します (通常はエラー 1053 で)...
これらのexeには、「サービスラッパー」が必要です。これは、SCMからの開始/停止コマンドを受け入れ、それに応じてアプリケーションを実行/終了できる小さなユーティリティです。Microsoft はSrvany (無料ですが非常に基本的なもの) を提供していますが、他にもいくつかの無料の商用の代替手段があります。
ところで、Nginix をサービスとして実行する方法を示すこのガイド、特に Nginix を適切に停止する方法について説明しているステップ 7 をチェックしてください。すべてのラッパーがその機能をサポートしているわけではありません (Srvany はサポートしていません)...
nginxをサービスに変えたり、CMDを使用してプロセスを開始したりするのではなく、実際には機能していないようです. Powershell を使用すると、nginx を切り離されたプロセスとして簡単に起動できることがわかりました。nginx の起動と PHP を組み合わせました。以下は、「start-nginx.ps1」という名前のスクリプトです。
$fcgiPort = "127.0.0.1:9000"
$PHPini = "c:\php\php.ini"
$ErrorActionPreference = "SilentlyContinue"
function restart {
Push-Location /nginx
Stop-Process -Force -Name nginx
Start-Process ./nginx.exe -WindowStyle Hidden
Stop-Process -Force -Name php-cgi
Start-Process "c:\php\php-cgi.exe" -ArgumentList ("-b" + $fcgiPort + " -c " + $PHPini) -WindowStyle Hidden
Pop-Location
}
restart
このスクリプトは任意のディレクトリから実行できますが、nginx のインストール先に合わせてカスタマイズする必要があります。
このスクリプトには、両方を起動する前に、nginx と PHP をサイレント モードで強制終了する試みが含まれています。
Windows システムは、CMD プロンプトであっても、「.ps1」ファイルを powershell として認識するはずです。
実行中のプロセスを強制終了する別の小さなスクリプトを作成しました。これは、このファイルから「start-process」行を削除するだけです。
起動時に実行するために、win-R コマンドを使用してディレクトリ shell:startup に移動しました。
このディレクトリに起動スクリプトのショートカットを置くと、起動時にnginxが起動します!
Powershell には、タスクをスケジュールするはるかに高度な機能も含まれており、このスクリプトを起動時に実行するようにスケジュールすることもできます。このリンクを見る
記事から:
>powershell
$trigger = New-JobTrigger -AtStartup -RandomDelay 00:00:30
Register-ScheduledJob -Trigger $trigger -FilePath $HOME/start-nginx.ps1 -Name startNginx
組み合わせると、このアプローチにより、nginx Windows サービスから必要なものがすべて得られ、サードパーティのアプリケーションは必要ないと思います。