59

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

问题是我找不到一个合乎逻辑的答案来让我做出nginx.exeWindows 系统服务(如我的 Apache)的合乎逻辑的答案。

有人遇到过这个问题的答案吗?

4

9 回答 9

78

如何使用Windows 服务包装器做到这一点

(注意:现在有更简单的替代方案 - 另请参阅下面描述的解决方案,使用suneg的巧克力包管理器和直接Adamy使用NSSM )

  1. 通过githubnuget下载最新版本的Windows Service Wrapper
    • 撰写本文时的当前版本是v2.2.0
    • 由于 .NET2.0 和 .NET4.0 的 v2.x 可执行文件可用 - 其他仅按需提供。
  2. 重命名winsw-*.exenginxservice.exe.
    • 这是将为拥有您的 nginx 进程的进程显示的名称。
  3. 在具有相同基本名称的 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>
    
  4. 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 存储库找到最新版本的 Windows 服务包装器: 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 }
}
于 2012-12-14T08:56:58.037 回答
54

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

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

于 2014-02-19T01:51:04.557 回答
8

您可以使用start.batstop.bat来实现相同的效果。

开始.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.
)

停止.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.
)
于 2016-10-01T02:28:35.150 回答
7

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

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

顺便说一句,您应该查看本指南,展示如何将 Nginix 作为服务运行,尤其是第 7 步,其中讨论了如何正确停止 Nginix。并非每个包装器都支持该功能(Srvany 不支持)...

于 2012-10-18T21:53:07.870 回答
5

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

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

choco install nginx

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

于 2016-01-25T09:04:01.927 回答
2

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

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

Windows 任务计划程序

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

Windows 启动快捷方式

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

  • 按照此答案查找您的启动位置。

  • 每当您登录系统时,Nginx 都会自动运行。
  • 这个是最简单的。但是,它取决于用户配置文件,即如果您在服务器上运行 Nginx,它只会为您的用户帐户运行,当您注销时它会停止。
  • 这是开发环境的理想选择。
于 2018-02-03T08:59:09.090 回答
1

为此目的,官方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.

于 2015-02-02T11:04:21.970 回答
1

从这里下载 zip 文件。

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

于 2015-02-13T07:09:00.653 回答
1

而不是把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 还包括更复杂的任务调度功能,并且可以安排此脚本在启动时运行。看到这个链接

来自文章:

 >powershell

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

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

于 2016-11-26T16:25:50.827 回答