Вопрос по windows, service, windows-services, nginx – Добавить nginx.exe в качестве системной службы Windows (например, Apache)?

50

Я настроил NGINX в качестве сервера переднего плана для статического контента и использую Apache в качестве сервера для других целей.

Дело в том, что я не могу найти логичный ответ, который позволяет мне сделатьnginx.exe системный сервис Windows (как мой Apache).

Кто-нибудь сталкивался с ответом на это?

Вопрос принадлежитSF Shiplu Mokaddim

Ваш Ответ

9   ответов
72

Как это сделать сWindows Service Wrapper

(Примечание: к настоящему времени есть многообещающие альтернативы -см. также решение NSSM, описанное в ответе ниже от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.

Теперь у вас будетnginx сервис в ваших услугах! (Он настроен на автоматический запуск при загрузке; если вы хотите запустить сервер, вы должны вручную запустить службу (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/

Дополнительная информация не указана в сообщении блога:

Вы можете найти последнюю версию Windows Service Wrapper также через этот репозиторий Maven: http://repo.jenkins-ci.org

Пример:

<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>
@Phrogz Спасибо за обновление.
Я обновил xml, потому что процессы nginx не были остановлены, и мне пришлось убить их вручную с помощьюtaskkill /F /IM nginx.exe, В журналах Windows Service Wrapper указывалось, что мне не хватает конфигурации XML Stopexecutable. Поэтому я удалил теги стоп-аргумента и заменил его следующим:<stopexecutable>c:\nginx\nginx.exe</stopexecutable> <stopargument>-s</stopargument> <stopargument>stop</stopargument>
Обратите внимание, что, кажется, новыйrepo for WinSW сnewer binaries имеется в наличии.
Обратите внимание, что вам нужно указать 2 аргумента остановки (проверено в 1.18): & lt; stopargument & gt; -s & lt; / stopargument & gt; & Lt; stopargument & GT; остановка & л; / stopargument & GT;
В nginxservice.xml мне нужно было удалить символ пробела после -p, чтобы он загрузился правильно. & Lt; startargument & GT; -pc: \ Nginx & л; / & startargument GT ;. Пробовал на 1.8.0 и 1.9.5
4

Самый простой способ, который я обнаружил, - это использоватьшоколадным менеджер пакетов.

Как только Chocolatey установлен, вы открываете административную подсказку и набираете:

choco install nginx

Теперь у вас есть служба Windows под названием «nginx». Бег.

это установит nginx v1.6.2 на момент написания статьи
К сожалению, в январе 2019 года это больше не создает услуги.
Я знаю, что это старый, но использоватьchoco install nginx вместо
Это июль-2017, и Chocolatey установит nginx 1.12.
Так как у нас теперь июнь 2017 года, а шоколадная версия nginx по-прежнему 1.6.2, которая, кстати, была выпущена 16 сентября 2014 года, я бы не стал использовать ее в производстве (даже Debian более актуален!). В любом случае, мне нужен быстрый способ проверить подготовку моего упаковщика с помощью веб-сервера на моей машине разработчика, так что я пойду на это!
1

официальныйnginx wiki ссылается наwinginx для этого. Он собирает exe-установщик в среде Linux. Процесс выглядит так:

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.

@ A.Grandt Это инструмент Linux, который делает установщик EXE для Windows. Затем вы копируете этот установщик, устанавливаете его на свой сервер Windows, и он работает как сервис.
К вашему сведению: Linux! = Windows.
6

SC.EXE будет работать только для исполняемых файлов, которые уже поддерживают API служб Windows и могут правильно реагировать на запуск и остановку запросов из диспетчера управления службами (SCM). Другие обычные приложения, специально не написанные как сервисы, просто не запустятся (обычно с ошибкой 1053) ...

Для этих exe 's вам нужна "служебная оболочка" - небольшая утилита, которая может принимать команды пуска / остановки от SCM и запускать / завершать ваше приложение соответственно. Microsoft предоставляетSrvany (который бесплатный, но очень простой), но есть несколько других бесплатных и коммерческих альтернатив.

Кстати, вы должны проверить эторуководство, показывающее, как запустить Nginix как сервис, особенно шаг 7, который обсуждает, как правильно остановить Nginix. Не каждая оболочка будет поддерживать эту функциональность (Srvany не поддерживает) ...

SC.EXE will only work for executables that already support the Windows Services API Я не считаю это утверждение правильным, если только оно не относится к конкретной версии (версиям) Windows. Я использовал sc.exe для запуска не обслуживаемых двоичных файлов.See here for an example
0

Вместо того, чтобы превращать nginx в сервис или использовать CMD для запуска процесса, который, похоже, не работает. Я обнаружил, что Powershell позволяет легко запускать nginx как отдельный процесс. Я объединил запуск nginx с PHP. Ниже приведен сценарий с именем & quot; start-nginx.ps1 & quot;

$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 должны распознавать & quot; .ps1 & quot; файлы как powershell, даже в командной строке CMD.

Я создал еще один небольшой скрипт для уничтожения запущенных процессов, который просто удаляет «start-process» строки из этого файла.

Для запуска при запуске я использовал команду win-R для перехода к оболочке каталога: запуск

Помещая ярлык для запуска скрипта в этом каталоге, nginx запускается при загрузке!

Powershell также включает в себя гораздо более сложные возможности для планирования задач, и есть возможность запланировать запуск этого сценария при запуске.Смотрите эту ссылку

Из статьи:

 >powershell

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

В целом, я думаю, что этот подход дает вам все, что вам нужно от службы Windows nginx, и не требует каких-либо сторонних приложений.

1

NSSM - лучший инструмент для запуска Nginx как сервиса.
если тыdo not want to use any external 3rd party software тогда вы можете реализовать любой из этих двух методов.

  • 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.
43

Скачать форму NSSM http://nssm.cc/download . "Run %NSSM_HOME%\nssm.exe install “Nginx”"

Выберите исполняемый файл Nginx в диалоговом окне NSSM, затем нажмите ОК. Перейдите в раздел «Службы» и запустите новую созданную службу «Nginx», готово.

Отличное решение! Workink отлично! Спасибо!
Спасибо, в следующий раз я попробую это с вашим решением! Инструмент выглядит очень просто и имеет отличное название ;-)
Потратил несколько часов, пытаясь сделать то же самое с winsw (потому что, как вы знаете, ответ имеет больше голосов, так что сначала попробуйте), а после неудачи сделал это с NSSM через несколько минут. Огромное спасибо !!
Недостатком этого решения является то, что команды командной строки nginx, такие какnginx.exe -s reload больше не будет работать: если вы измените конфигурацию, вы должны перезапустить службу. В качестве обходного пути я прочитал, что вы должны запустить nginx как пользователь в группе администраторов, чтобы ваш пользователь, также в группе администраторов, мог запускать команды.
6

You can using start.bat and stop.bat to realize the same effect.

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.
)
Ни один из вышеперечисленных методов не сработал. Служба была запущена успешно, но nginx.exe все еще не работал. Этот подход прост, не требует дополнительного программного обеспечения, может вызываться автоматически при запуске и всегда работает. Благодарю.
1

Скачать ZIP-файл сВот.

экстрактnginx-service.exe отwinginx\build и запустить его.

Похожие вопросы