将Nginx作为Windows服务运行

48

我正在尝试将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>
(我有一个名为nginx的文件夹在c:下,其中包含nginx.exe,因此路径是正确的。) 现在问题是服务已经创建了,但我似乎无法启动它,每次尝试启动时都会弹出一个窗口,显示:
Error 1053: The service didn't respond to the start or control request in a timely fashion

有人知道如何解决这个问题或以不同的方式将Nginx作为Windows服务运行吗?


1
这是该问题的明显重复:https://dev59.com/gWkw5IYBdhLWcg3wNXz2 - JJP
1
可能与此问题重复:如何将nginx.exe添加为Windows系统服务(类似于Apache)? - Davide Pizzolato
@jjp那个问题是关于如何运行它的,我的问题则是关于一个具体的错误。在我的问题中,我字面上使用了那个问题解决方案的代码,但显然它不起作用。除了标题之外,我真的不明白这怎么能被认为是重复的问题,但好吧。 - John Doe
@Davide Pizzolato,和上面一样,因为我只能标记一个用户。 - John Doe
6个回答

90

刚刚偶然发现了这个免费开源的替代品并成功运行:https://nssm.cc/

它基本上只是一个 GUI,帮助你创建服务。我使用的步骤如下:

  1. 下载 NGinx (http://nginx.org/en/download.html) 并解压到 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 选项卡上,在输入框中输入 "start nginx"。可选择在输出和错误栏中设置 C:\foobar\nginx\logs\service.out.log 和 C:\foobar\nginx\logs\service.err.log。
  7. 点击 "install service"。转到服务,启动 "nginx"。访问 http://localhost:80,您应该会得到 Nginx 登录界面。关闭服务,禁用浏览器缓存并刷新,屏幕现在应该加载失败。

从此以后,您可以正常使用了。


3
注意:如果您正在使用Windows 10创作者更新,则需要安装更高版本的NSSM。我遇到了一个问题,之前NSSM运行正常,但在Windows更新后我无法运行 nssm start nginx。我以为问题出在我的nginx配置上,但实际上是NSSM没有正确工作。 - seangwright
NSSM也可以通过Chocolatey进行安装,使用choco install nssm命令即可。在撰写本文时,安装的版本比NSSM网页上提供的版本要新得多(来自2018年1月16日的版本)。 - joanlofe
顺便说一下,Chocolatey 的最新版本不能按预期工作。我使用 2.24 版本使其正常工作。 - joanlofe
2
最近似乎 choco install nginx 命令会自动安装 NSSM 并为您进行配置。 - Charles Wood
1
2019年12月24日。这份指南仍适用于Windows 10,Nginx 1.16.1和NSSM 2.24,并为我节省了时间! - Sergio Belevskij
显示剩余5条评论

36

1
我认为这也是最佳答案。我会在我的服务器上尝试。 - paulz
17
我认为这个方法行不通。据我所知,你不能将任何exe文件作为Microsoft Windows服务运行。当我尝试用nginx做这件事时,我遇到了错误信息:"Windows无法在本地计算机上启动nginx服务。错误1053:该服务未能及时响应启动或控制请求。" - Mark
2
我遇到了和@Mark一样的问题 - 这在nginx上工作得不好。 - CuriousDeveloper
1
这不会起作用,因为Windows服务需要特殊的exe。 - Actimele
2
使用这个代码针对nginx.exe将无法生效。 - ATX
显示剩余3条评论

5
如其他答案中所述,NSSM是运行Nginx作为服务的最佳工具。
如果你不想使用任何外部第三方软件,那么你可以实现以下两种方法。
  • Windows任务计划程序
  • Windows启动快捷方式

Windows任务计划程序

  • 这个答案所述,准备一个start.bat文件。
  • 将此文件放在nginx.exe所在的位置。
  • 打开Windows任务计划程序,并按照这个答案中描述的方式设置任务以无限运行。
  • 不要忘记使用系统账户以最高权限运行此任务,更多细节可以在这里找到。
  • 使任务每日在特定时间启动,通过bat文件检查是否已经运行该服务以避免创建多个nginx.exe实例。
  • 如果由于某些原因Nginx关闭,则在5分钟内将重新启动。

Windows启动快捷方式

  • 创建nginx.exe的快捷方式并将其放置在Windows的启动文件夹中。

  • 按照这个答案中的方法找到你的启动位置。

  • 无论何时你登录系统,Nginx都会自动运行。
  • 这是最简单的方法,但依赖于用户配置文件,即如果你在服务器上运行Nginx,则仅对你的用户帐户运行,当你注销后它就会停止。
  • 这适用于开发环境。

1
NSSM将避免使用nginx -s reload。这样会更好。 - ws_
1
NSSM将避免使用nginx -s reload。这样会更好。 - undefined

1

你需要这个来使用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>

你需要一个可执行文件<executable>,假设你正在使用nginx.conf,则不需要任何启动参数,还需要一个<stopexecutable><stopargument>(以模拟nginx -s stop)。

0

nginxctl - 基于Caucho Resin源代码模块\csharp\src\resin

在Nginx.cs中更改工作目录

startInfo.WorkingDirectory = "C:\\nginx\\";

构建

msbuild /p:Configuration=Release Nginx.csproj

注册服务

sc create nginx binpath= C:\nginx\nginxctl.exe

0

我发现了你的问题。 你使用了stopargument而不是stoparguments。 请使用以下代码:

    <executable>"%BASE%\nginx.exe"</executable>
    <!--arguments></arguments-->
    <startarguments></startarguments>

    <stopexecutable>"%BASE%\nginx.exe"</stopexecutable>
    <stoparguments>-s stop</stoparguments>

这正在我的服务器上运行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接