Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @Echo Off
- SetLocal EnableDelayedExpansion
- :: Portable nginx+php+mysql for Windows
- :: Inquisitor, 2016-2019
- :: nginx 1.15.8
- :: php 7.2.10
- :: mysql 5.7.23
- CD /D "%~dp0"
- :: Лог работы скрипта
- Set LogFile=%~dpn0.log
- :: Формат даты в логе
- Set TimestampFormat=[%%Date%% %%Time:~,8%%]
- :: Периодичность проверки запроса на отключение и перезапуска процессов при падении, секунды
- Set WatcherTimeout=10
- :: Обрабатываем команду на выключение
- If /I "%~1"=="shutdown" (
- If Exist "%~dp0.loader.lock" (
- Call :Log Received termination signal, shutting down
- Del "%~dp0.loader.lock" 2>nul
- ) Else (
- Call :Log [WARNING] Received termination signal, server not started
- )
- Exit /B
- )
- :: Обрабатываем запуск сервиса
- If /I "%~1"=="service" (
- Call Echo.>>"%LogFile%"
- Call :Log Loader started as service
- GoTo :service
- )
- :: Перезапускаем себя как скрытый процесс, если запущено без аргументов
- If "%~1"=="" (
- Start "" "%~dp0tools\hidcon" %~nx0 restart_hidden
- Call Echo.>>"%LogFile%"
- Call :Log Loader started
- Exit
- )
- :service
- :: ДЛЯ ОТЛАДКИ! УБРАТЬ ИЗ ПРОДАКШЕНА
- :: Set Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem
- :: Сохраняем оригинальный path
- Set OSPath=%Path%
- :: Добавляем пути к бинарникам в системный path для этого скрипта и дочерних процессов
- Set Path=%!!%~dp0nginx;%!!%~dp0mysql\bin
- :: Добавляем модули
- :: FFMpeg 4.1.3
- ::Set Path=%Path%;%~dp0modules\ffmpeg
- :: ImageMagick 6.9.3 (php5)
- ::Set Path=%Path%;%~dp0modules\imagick-php5\ImageMagick
- ::Set LOCALAPPDATA=%~dp0modules\imagick-php5
- :: Меняем системный temp на наш
- Set Temp=%~dp0\tmp
- :: Добавляем системный path с низшим приоритетом
- Set Path=%Path%;%OSPath%
- :: Обрабатываем запуск консоли
- If /I "%~1"=="console" (
- PushD nginx\wwwroot
- Start cmd
- PopD
- Exit /B 0
- )
- :: Запускаем каждый процесс из его рабочей директории
- :: MySQL
- Call :Log Starting MySQL...
- :start-mysql
- PushD .\mysql\
- Start bin\mysqld --defaults-file="my.ini" --user=root --standalone||Call :Log [ERROR] Can't start MySQL
- PopD
- If "%1"=="restart" (
- Call :Log [WARNING] MySQL crashed, restarting
- Exit /B
- )
- :: PHP
- Call :Log Starting PHP...
- :start-php
- PushD .\php
- :: меняя что-то тут, не забываем изменить в nginx\conf\nginx.conf, секция upstream backend
- Set PHP_Pool[]="9123","9124","9125"
- For %%A In (%PHP_Pool[]%) Do (
- If Not Defined _PHP_Worker_%%~A Set _PHP_Worker_%%~A=false
- TaskList /FI "PID eq !_PHP_Worker_%%~A!" /FO:CSV /NH|FindStr /C:"!_PHP_Worker_%%~A!"||(
- For /F "delims=" %%P In ('easy_spawner "php-cgi.exe" "-b 127.0.0.1:%%~A -c .\php.ini"') Do (
- Call :Log New PHP worker on port :%%~A with PID %%P
- Set _PHP_Worker_%%~A=%%P
- )
- )
- )
- PopD
- If "%1"=="check_workers" (
- Exit /B
- )
- :: nginx
- Call :Log Starting NginX...
- :start-nginx
- PushD .\nginx
- Start nginx||Call :Log [ERROR] Can't start NginX
- PopD
- If "%1"=="restart" (
- Call :Log [WARNING] NginX crashed, restarting
- Exit /B
- )
- :: Убиваем уже не нужные процессы hidcon
- TaskKill /F /IM "hidcon.exe"
- :: Повышаем приоритет для запущенных процессов
- For %%A In ("mysqld.exe", "php-cgi.exe", "nginx.exe") Do (
- wmic process where name="%%~A" CALL setpriority "high priority"
- )
- :: Создаём lock-файл и следим за его наличием
- Set LockFile=.\.%~n0.lock
- Echo.>"%LockFile%"
- :Watcher
- Ping -n %WatcherTimeout% 127.0.0.1>nul 2>nul
- :: Проверяем наличие процессов и перезапускаем в случае падения
- ::TaskList /FI "imagename EQ php-cgi.exe" /FO:CSV|FindStr /I /C:"php-cgi.exe">nul||Call :start-php restart
- Call :start-php check_workers
- :: Запускаем процесс выключения, если файл удалён
- If Not Exist "%LockFile%" (
- Call :Log Lockfile not found, killing child processes
- rem Останавливаем nginx
- PushD .\nginx
- nginx -s stop
- PopD
- rem Останавливаем MySQL
- mysqladmin -u root -p%$_DB_PASS% shutdown
- rem Останавливаем PHP-CGI
- rem эта дрянь не поддерживает корректное отключение
- rem поэтому просто дергаем TerminateProcess() aka SIGKILL
- TaskKill /F /T /IM php-cgi.exe
- Call :Log Loader stopped
- Exit
- )
- GoTo :Watcher
- :Log
- Call Echo %TimestampFormat% %*>>"%LogFile%"
- Exit /B
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement