运行nginx作为Windows服务

时间:2016-11-28 14:12:18

标签: windows nginx service

我正在尝试将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的文件夹中将nginx.exe放在c:o路径正确的位置)。

现在的问题是服务已经创建,但我似乎无法启动它,每次我尝试启动它时都会弹出一个窗口

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

有谁知道如何解决此问题或以不同方式运行nginx作为窗口服务?

6 个答案:

答案 0 :(得分:23)

在这里偶然发现并设法使用这个免费的开源替代方案: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选项卡上,输入slow上的“start nginx”。 (可选)在输出和错误槽中设置C:\ foobar \ nginx \ logs \ service.out.log和C:\ foobar \ nginx \ logs \ service.err.log。
  7. 点击“安装服务”。转到服务,启动“nginx”。点击http://localhost:80,您应该获得nginx登录。关闭服务,禁用浏览器缓存并刷新,屏幕现在应该无法加载。
  8. 从那时起你应该好好继续。

答案 1 :(得分:3)

我找到了NSSM(非吸吮服务经理):一个完全符合我想要的程序,设置起来要容易得多。

答案 2 :(得分:2)

我找到了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位置)。
  4.   

    <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

答案 3 :(得分:1)

As told in other answers NSSM is the best tool to run Nginx as a service.
If you do not want to use any external 3rd party software then you can implement any of these two methods.

  • Windows Task Scheduler
  • Windows startup shortcut

Windows Task Scheduler

  • As mentioned in this answer prepare one start.bat file.
  • Put this file where nginx.exe is present.
  • Open windows task scheduler and set up the task as described in this answer to run it indefinitely.
  • Do not forget to run this task as the highest privilege with the system account, more details can be found here.
  • Make the task to start daily at a certain time, through the bat file it will check whether the service is already running to avoid creating multiple nginx.exe instances.
  • If due to some reason Nginx shuts down, within 5 minutes it will start.

Windows Startup shortcut

  • Create one shortcut of nginx.exe and put it in the startup folder of Windows.

  • Follow this answer to find your startup location.

  • Nginx will run automatically whenever you log in to the system.
  • This one is the easiest. However, it is dependent on user profile i.e. if you are running Nginx on a server, it will run only for your user account, when you log off it stops.
  • This is ideal for dev environment.

答案 4 :(得分:1)

NSSM非常好,但是还有另一种选择:PowerShell Cmdlet New-Service

这里只是一个简单的例子:

$params = @{
    Name = "MyService"
    BinaryPathName = "path/to/exe"
    DisplayName = "My Service"
    StartupType = "Automatic"
    Description = "Description of my service"
}
New-Service @params

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-service?view=powershell-6

答案 5 :(得分:0)

你需要这个为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(以仿真{ {1}})