Add nginx.exe as Windows system service (like Apac

2019-01-12 17:37发布

I set up NGINX as a front end server for static content and I use Apache as a back-end server for other thing.

The thing is I can't find a logical answer that allows me to make nginx.exe a Windows system service (like my Apache).

Any come across an answer to this?

9条回答
Lonely孤独者°
2楼-- · 2019-01-12 18:27

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.
查看更多
Rolldiameter
3楼-- · 2019-01-12 18:28

How to do it with Windows Service Wrapper

(Note: There are promising alternatives by now - see also NSSM solution described in answer below from Adamy.)

  1. Download the latest version of Windows Service Wrapper via github or nuget.
    • Current version as of this writing is v2.1.2
    • Since v2.x executables for .NET2.0 and .NET4.0 are available - others only on demand.
  2. Rename winsw-1.xx-bin.exe to something like nginxservice.exe.
    • This is the name that will show up for the process that owns your nginx process.
  3. Place an XML file next to the exe with the same base name, e.g. nginxservice.xml. The contents should be like below (verify your nginx location).

    <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. Run the command nginxservice.exe install.

You will now have an nginx service in your Services! (It is set to start automatically on boot; if you want to start your server, you must manually start the service (net start nginx).)


Detailed description of correctly setting up nginx as a Windows Service: http://web.archive.org/web/20150819035021/http://misterdai.yougeezer.co.uk/posts/2009/10/16/nginx-windows-service/

Additional info not contained in above blog post:

You can find the latest version of the Windows Service Wrapper also via this Maven Repository: http://repo.jenkins-ci.org

Example:

<dependency>
    <groupId>com.sun.winsw</groupId>
    <artifactId>winsw</artifactId>
    <version>2.1.2</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>
查看更多
beautiful°
4楼-- · 2019-01-12 18:30

Rather than turning nginx into a service, or using CMD to start a process, which really doesn't seem to work. I found that Powershell makes it easy to startup nginx as a detached process. I've combined starting nginx with PHP. Below is the script, named "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

This script can be executed from any directory, but needs to be customized for where your nginx installation is located.

This script includes a silent attempt to kill nginx and PHP before launching both.

Windows systems are supposed to recognize ".ps1" files as powershell, even in the CMD prompt.

I created another small script to kill the running processes, which simply removes the "start-process" lines from this file.

To run at startup, I used the win-R command to navigate to the directory shell:startup

Placing a shortcut to the startup script in this directory, nginx starts at boot!

Powershell also includes a much more sophisticated ability to schedule tasks, and it is possible to schedule this script to run at startup. See This Link

From the article:

 >powershell

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

Combined, I think this approach gets you everything you'd need from an nginx windows service and doesn't require any third-party applications.

查看更多
登录 后发表回答