添加 nginx.exe 作为 Windows 系统服务(如 Apache)?

Posted

技术标签:

【中文标题】添加 nginx.exe 作为 Windows 系统服务(如 Apache)?【英文标题】:Add nginx.exe as Windows system service (like Apache)? 【发布时间】:2012-04-21 02:48:02 【问题描述】:

我将 nginx 设置为静态内容的前端服务器,我使用 Apache 作为其他东西的后端服务器。

问题是我找不到一个合乎逻辑的答案让我将nginx.exe 设为 Windows 系统服务(如我的 Apache)。

有没有人回答这个问题?

【问题讨论】:

misterdai.wordpress.com/2009/10/16/nginx-windows-service 问题属于SF 【参考方案1】:

如何使用 Windows Service Wrapper

(注意:现在有更简单的替代方案 - 另请参阅下面描述的解决方案 using chocolatey package manager suneg 和 using NSSM directly 来自 Adamy)

    通过github 或nuget 下载最新版本的Windows Service Wrapper。 撰写本文时的当前版本是 v2.2.0 由于 .NET2.0 和 .NET4.0 的 v2.x 可执行文件可用 - 其他仅按需提供。winsw-*.exe 重命名为nginxservice.exe这是为拥有您的 nginx 进程的进程显示的名称。

    在具有相同基本名称的 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 和 an installation guide。 以管理员身份运行命令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-service/

以上博文中未包含的其他信息:

您也可以通过此 Maven 存储库找到最新版本的 Windows Service Wrapper: 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 

【讨论】:

注意,似乎有一个新的repo for WinSW 和newer binaries 可用。 @Phrogz 感谢更新。 请注意,必须放置 2 个停止参数(在 1.18 中测试):-sstop 在 nginxservice.xml 我需要从 -p 之后删除空格字符才能正确加载。 -pc:\nginx。在 1.8.0 和 1.9.5 上试过 我更新了 xml,因为 nginx 进程没有停止,我不得不用 taskkill /F /IM nginx.exe 手动杀死它们。 Windows Service Wrapper 日志说我缺少 stopexecutable xml 配置。所以我删除了停止参数标签并将其替换为:&lt;stopexecutable&gt;c:\nginx\nginx.exe&lt;/stopexecutable&gt; &lt;stopargument&gt;-s&lt;/stopargument&gt; &lt;stopargument&gt;stop&lt;/stopargument&gt;【参考方案2】:

下载 NSSM 表格 http://nssm.cc/download 。 "运行 %NSSM_HOME%\nssm.exe 安装“Nginx”"

在 NSSM 对话框中选择 Nginx 可执行文件,然后确定。 转到服务并启动新创建的服务“Nginx”,完成。

【讨论】:

花了几个小时尝试用 winsw 做同样的事情(因为你知道,答案有更多的赞成票,所以必须先尝试),在失败后用 NSSM 在几分钟内完成。非常感谢!! 谢谢,下次我会用你的解决方案试试!该工具看起来非常简单,并且有一个好名字;-) 很好的解决方案!工作完美!谢谢! 这个解决方案的缺点是 nginx 命令行命令,例如nginx.exe -s reload 将不再起作用:如果更改配置,则必须重新启动服务。作为解决方法,我读到您必须以管理员组中的用户身份运行 nginx,这样您的用户(也在管理员组中)将能够运行命令。 @firepol 你可以使用 sysinternal 的psexec 来以SERVICE 运行进程。唯一的问题是当您不在 psexec 目录中时它不会运行。这会导致 nginx 出错,因为它找不到配置。解决方案是创建bat文件来做cd c:\progra~1\nginx &amp; nginx.exe -s reload并通过psexec运行这个bat。【参考方案3】:

您可以使用 start.batstop.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.
)

【讨论】:

以上方法均无效。该服务已“成功”启动,但 nginx.exe 仍未运行。这种方法很简单,不需要额外的软件,可以在启动时自动调用,并且始终有效。谢谢。【参考方案4】:

SC.EXE 仅适用于已经支持 Windows 服务 API 并且可以正确响应来自服务控制管理器 (SCM) 的启动和停止请求的可执行文件。其他常规应用程序,未专门编写为服务,将无法启动(通常出现错误 1053)...

对于这些 exe,您需要一个“服务包装器”——一个可以接受来自 SCM 的启动/停止命令并相应地运行/终止您的应用程序的小型实用程序。 Microsoft 提供了Srvany(免费但非常基本),但还有其他几种免费和商业替代方案。

顺便说一句,你应该看看这个guide showing how to run Nginix as a service,尤其是第 7 步,它讨论了如何正确停止 Nginix。并非每个包装器都支持该功能(Srvany 不支持)...

【讨论】:

SC.EXE will only work for executables that already support the Windows Services API 我不认为这种说法是正确的,除非它可能与特定版本的 Windows 有关。我使用 sc.exe 来运行非服务二进制文件。 See here for an example【参考方案5】:

我发现的最简单的方法是使用 Chocolatey 包管理器。

安装 Chocolatey 后,打开管理提示符并键入:

choco install nginx

您现在有一个名为“nginx”的 Windows 服务正在运行。

【讨论】:

这将在撰写本文时安装 nginx v1.6.2 我知道这是旧的,但请改用choco install nginx 因为我们现在有 2017 年 6 月,而 nginx 的巧克力版本仍然是 1.6.2,它是在 2014 年 9 月 16 日发布的,我不会在生产中使用它(即使是 Debian 也更多日期! )。无论如何,我需要一种快速的方法来测试我的开发机器上的 web 服务器的打包程序配置,所以我会去的! 这是 2017 年 7 月,chocolatey 将安装 nginx 1.12。 不幸的是,2019 年 1 月,这显然不再创建服务。【参考方案6】:

NSSM 是将 Nginx 作为服务运行的最佳工具。 如果您不想使用任何外部第三方软件,那么您可以实现这两种方法中的任何一种。

Windows 任务计划程序 Windows 启动快捷方式

Windows 任务计划程序

如this answer 中所述,准备一个 start.bat 文件。 将此文件放在 nginx.exe 所在的位置。 打开 Windows 任务计划程序并按照this answer 中的说明设置任务以无限期地运行它。 不要忘记以系统帐户的最高权限运行此任务,更多详细信息可以找到here。 让任务每天定时启动,通过bat文件检查服务是否已经运行,避免创建多个nginx.exe实例。 如果由于某种原因 Nginx 关闭,将在 5 分钟内启动。

Windows 启动快捷方式

创建一个nginx.exe的快捷方式,放到Windows的启动文件夹中。

关注this answer 查找您的启动位置。

Nginx 将在您登录系统时自动运行。 这是最简单的。但是,它取决于用户配置文件,即如果您在服务器上运行 Nginx,它只会为您的用户帐户运行,当您注销时它会停止。 这是开发环境的理想选择。

【讨论】:

【参考方案7】:

从here下载zip文件。

winginx\build 中提取nginx-service.exe 并运行它。

【讨论】:

【参考方案8】:

而不是把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 提示符下也是如此。

我创建了另一个小脚本来终止正在运行的进程,它只是从这个文件中删除了“start-process”行。

为了在启动时运行,我使用了 win-R 命令导航到目录 shell:startup

在这个目录下放置启动脚本的快捷方式,nginx在开机时启动!

Powershell 还包括更复杂的任务调度功能,可以安排此脚本在启动时运行。 See This Link

来自文章:

 >powershell

 $trigger = New-JobTrigger -AtStartup -RandomDelay 00:00:30
 Register-ScheduledJob -Trigger $trigger -FilePath $HOME/start-nginx.ps1 -Name startNginx

综合起来,我认为这种方法可以从 nginx windows 服务中获得所需的一切,并且不需要任何第三方应用程序。

【讨论】:

【参考方案9】:

官方nginx wiki为此参考winginx。它在linux环境下构建exe-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 中指定它们。

【讨论】:

仅供参考:Linux != Windows。 @A.Grandt 这是一个 linux 工具,用于为 windows 制作一个 exe 安装程序。然后你复制这个安装程序,将它安装在你的 windows 服务器上,它作为服务运行。

以上是关于添加 nginx.exe 作为 Windows 系统服务(如 Apache)?的主要内容,如果未能解决你的问题,请参考以下文章

windows服务中添加n g i n x 服务开机为啥没自动启动

windows下启动nginx为啥会有两个nginx.exe进程

windows环境下操作nginx

windows nginx 服务搭建

Nginx 作为静态资源服务器

Nginx-命令-Windows