添加nginx.exe作为Windows系统服务(如Apache)?
我将NGINX设置为静态内容的前端服务器,并使用Apache作为其他事物的后端服务器。
事情是我无法find一个合乎逻辑的答案,让我做nginx.exe
一个Windows系统服务(如我的Apache)。
任何遇到这个答案?
概述(取自博客文章):
- 通过github或nuget下载最新版本的Windows Service Wrapper 。
- 当前版本是v2.0.3
- 由于用于.NET2.0和.NET4.0的v2.x可执行文件可用,其他文件仅在需要时才可用。
- 将
winsw-1.xx-bin.exe
重命名为nginxservice.exe
。- 这是拥有你的nginx进程的进程显示的名字。
-
将一个XML文件放在具有相同基本名称的exe旁边,例如
nginxservice.xml
。 内容应该像下面(validation你的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页面find关于configuration的最新细节,以及一个在这里显示所有可能选项的通用示例 。
- 运行命令
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-服务/
以上博文中未包含的其他信息:
你也可以通过这个Maven Repositoryfind最新版本的Windows Service Wrapper: http : //repo.jenkins-ci.org
例:
<dependency> <groupId>com.sun.winsw</groupId> <artifactId>winsw</artifactId> <version>1.17</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>
下载NSSM表格http://nssm.cc/download 。 “运行%NSSM_HOME%\ nssm.exe安装”Nginx“”
在NSSM对话框中selectNginx可执行文件,然后确定。 转到服务,并开始新的服务“Nginx”,完成。
SC.EXE只适用于已经支持Windows Services API的可执行文件,并且可以正确响应以启动和停止来自服务控制pipe理器(SCM)的请求。 其他常规应用程序,不是专门作为服务写入的,将无法启动(通常是错误1053)…
对于那些exe文件,你需要一个“服务包装器” – 一个小的实用程序,它可以接受来自SCM的启动/停止命令,并相应地运行/终止你的应用程序。 微软提供了Srvany (这是免费的,但非常基本),但还有其他几个免费和商业的select。
顺便说一句,你应该看看这个指南显示如何运行Nginx作为服务 ,特别是第7步,讨论如何正确地停止Nginix。 不是每个包装都会支持这个function(Srvany不会)…
我发现的最简单的方法是使用Chocolatey包pipe理器。
一旦安装了Chocolatey,您将打开一个pipe理提示符并键入:
choco install nginx
您现在有一个名为'nginx'的Windows服务正在运行。
你可以使用start.bat和stop.bat来实现相同的效果。
的start.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. )
stop.bat且
@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. )
从这里下载zip文件。
从winginx\build
提取nginx-service.exe
并运行它。
正式nginx维基为这个目的参考winginx 。 它在linux环境下构buildexe-installer。 过程如下所示:
sudo apt-get install nsis make wget https://github.com/InvGate/winginx/archive/master.zip unzip master.zip cd winginx-master/ make ls -lh ./build/nginx-service.exe
要获得实际的版本,你应该在Makefile
指定它们。
而不是把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系统应该将“.ps1”文件识别为PowerShell,即使在CMD提示符下也是如此。
我创build了另一个小脚本来杀死正在运行的进程,它只是从该文件中删除“启动进程”行。
要在启动时运行,我使用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服务中获得所需的一切,而且不需要任何第三方应用程序。