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

时间:2012-04-08 07:34:17

标签: windows service windows-services nginx

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

问题是我无法找到一个合乎逻辑的答案,它允许我使nginx.exe成为Windows系统服务(就像我的Apache)。

有人遇到过这个答案吗?

9 个答案:

答案 0 :(得分:75)

如何使用 Windows Service Wrapper

执行此操作

(注意:目前有一些很有前途的替代方案 - 来自see also NSSM solution described in answer belowAdamy。)

  1. 通过Windows Service Wrappergithub下载最新版本的nuget
    • 撰写本文时的当前版本为 v2.2.0
    • 由于.NET2.0和.NET4.0的v2.x可执行文件可用 - 其他只能按需提供。
  2. winsw-*.exe重命名为nginxservice.exe
    • 这是将显示拥有您的nginx进程的进程的名称。
  3. 将具有相同基本名称的XML文件放在exe旁边,例如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>
    
  4. 以管理员身份运行命令nginxservice.exe install
  5. 您现在可以在服务中获得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 }
    }
    

答案 1 :(得分:44)

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

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

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:6)

  

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

答案 4 :(得分:4)

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

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

<mvc:annotation-driven>
   <mvc:message-converters register-defaults="false">
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper">
               <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                   <property name="objectMapper">
                       <array>
                           <bean class="com.yourproject.example.CustomObjectMapper"/>
                       </array>
                   </property>
               </bean>
           </property>
       </bean>
   </mvc:message-converters>
</mvc:annotation-driven>

您现在拥有一个名为&#39; nginx&#39;的Windows服务。运行

答案 5 :(得分:1)

官方nginx wiki出于此目的,winginx对{{3}}进行了审核。它在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中指定它们。

答案 6 :(得分:1)

here下载zip文件。

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

答案 7 :(得分:1)

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.

答案 8 :(得分:0)

而不是将nginx转变为服务,或者使用CMD来启动流程,而这似乎并不起作用。我发现Powershell可以很容易地将nginx作为一个独立的进程启动。我已经将nginx与PHP结合起来了。下面是脚本,名为&#34; start-nginx.ps1&#34;

$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系统应该识别&#34; .ps1&#34;文件作为powershell,即使在CMD提示符中也是如此。

我创建了另一个小脚本来杀死正在运行的进程,它只是删除了&#34; start-process&#34;该文件中的行。

要在启动时运行,我使用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服务所需的一切,并且不需要任何第三方应用程序。