Руководство для начинающих
В этом руководстве даётся начальное введение в nginx и описываются
некоторые простые задачи, которые могут быть решены с его помощью.
Предполагается, что nginx уже установлен на компьютере читателя.
Если нет, см. Установка nginx.
В этом руководстве описывается, как запустить и остановить nginx
и перезагрузить его конфигурацию,
объясняется, как устроен конфигурационный файл, и описывается,
как настроить nginx для раздачи статического содержимого, как
настроить прокси-сервер на nginx, и как связать nginx с приложением
FastCGI.
У nginx есть один главный и несколько рабочих процессов.
Основная задача главного процесса — чтение и проверка конфигурации
и управление рабочими процессами.
Рабочие процессы выполняют фактическую обработку запросов.
nginx использует
модель, основанную на событиях, и зависящие от операционной системы
механизмы для эффективного распределения запросов между рабочими процессами.
Количество рабочих процессов задаётся в конфигурационном файле и
может быть фиксированным для данной конфигурации или автоматически
устанавливаться равным числу доступных процессорных ядер (см.
worker_processes).
Как работают nginx и его модули, определяется в конфигурационном файле.
По умолчанию, конфигурационный файл называется nginx.conf
и расположен в каталоге
/usr/local/nginx/conf
,
/etc/nginx
или
/usr/local/etc/nginx
.
Запуск, остановка, перезагрузка конфигурации
Чтобы запустить nginx, нужно выполнить исполняемый файл.
Когда nginx запущен, им можно управлять, вызывая исполняемый файл с
параметром -s
.
Используйте следующий синтаксис:
nginx -s сигнал
Где сигнал может быть одним из нижеследующих:
-
stop
— быстрое завершение -
quit
— плавное завершение -
reload
— перезагрузка конфигурационного файла -
reopen
— переоткрытие лог-файлов
Например, чтобы остановить процессы nginx с ожиданием окончания
обслуживания текущих запросов рабочими процессами, можно выполнить
следующую команду:
nginx -s quit
Команда должна быть выполнена под тем же
пользователем, под которым был запущен nginx.
Изменения, сделанные в конфигурационном файле,
не будут применены, пока команда перезагрузить конфигурацию не будет
вручную отправлена nginx’у или он не будет перезапущен.
Для перезагрузки конфигурации выполните:
nginx -s reload
Получив сигнал, главный процесс проверяет правильность синтаксиса нового
конфигурационного файла и пытается применить конфигурацию, содержащуюся
в нём.
Если это ему удаётся, главный процесс запускает новые рабочие процессы
и отправляет сообщения старым рабочим процессам с требованием завершиться.
В противном случае, главный процесс откатывает изменения и продолжает
работать со старой конфигурацией.
Старые рабочие процессы, получив команду завершиться,
прекращают принимать новые запросы и продолжают обслуживать текущие запросы
до тех пор, пока все такие запросы не будут обслужены.
После этого старые рабочие процессы завершаются.
Посылать сигналы процессам nginx можно также средствами Unix,
такими как утилита kill
.
В этом случае сигнал отправляется напрямую процессу с данным ID.
ID главного процесса nginx записывается по умолчанию в файл
nginx.pid
в каталоге
/usr/local/nginx/logs
или
/var/run
.
Например, если ID главного процесса равен 1628, для отправки сигнала QUIT,
который приведёт к плавному завершению nginx, нужно выполнить:
kill -s QUIT 1628
Для просмотра списка всех запущенных процессов nginx может быть использована
утилита ps
, например, следующим образом:
ps -ax | grep nginx
Дополнительную информацию об отправке сигналов процессам nginx
можно найти в Управление nginx.
Структура конфигурационного файла
nginx состоит из модулей, которые настраиваются директивами, указанными
в конфигурационном файле.
Директивы делятся на простые и блочные.
Простая директива состоит из имени и параметров, разделённых пробелами,
и оканчивается точкой с запятой (;
).
Блочная директива устроена так же, как и простая директива, но
вместо точки с запятой после имени и параметров следует набор дополнительных
инструкций, помещённых внутри фигурных скобок
({
и }
).
Если у блочной директивы внутри фигурных скобок можно задавать другие
директивы, то она называется контекстом (примеры:
events,
http,
server
и
location).
Директивы, помещённые в конфигурационном файле вне любого контекста,
считаются находящимися в контексте
main.
Директивы events
и http
располагаются в контексте main
, server
—
в http
, а location
— в
server
.
Часть строки после символа #
считается комментарием.
Раздача статического содержимого
Одна из важных задач конфигурации nginx — раздача
файлов, таких как изображения или статические HTML-страницы.
Рассмотрим пример, в котором в зависимости от запроса файлы будут
раздаваться из разных локальных каталогов: /data/www
,
который содержит HTML-файлы, и /data/images
,
содержащий файлы с изображениями.
Для этого потребуется отредактировать конфигурационный файл и настроить
блок
server
внутри блока http
с двумя блоками location.
Во-первых, создайте каталог /data/www
и положите в него файл
index.html
с любым текстовым содержанием, а также
создайте каталог /data/images
и положите в него несколько
файлов с изображениями.
Далее, откройте конфигурационный файл.
Конфигурационный файл по умолчанию уже включает в себя несколько
примеров блока server
, большей частью закомментированных.
Для нашей текущей задачи лучше закомментировать все такие блоки и
добавить новый блок server
:
http { server { } }
В общем случае конфигурационный файл может содержать несколько блоков
server
,
различаемых по портам, на
которых они
слушают,
и по
имени сервера.
Определив, какой server
будет обрабатывать запрос,
nginx сравнивает URI, указанный в заголовке запроса, с параметрами директив
location
, определённых внутри блока
server
.
В блок server
добавьте блок location
следующего вида:
location / { root /data/www; }
Этот блок location
задаёт “/
”
в качестве префикса, который сравнивается с URI из запроса.
Для подходящих запросов добавлением URI к пути, указанному в директиве
root,
то есть, в данном случае, к /data/www
, получается
путь к запрашиваемому файлу в локальной файловой системе.
Если есть совпадение с несколькими блоками location
,
nginx выбирает блок с самым длинным префиксом.
В блоке location
выше указан самый короткий префикс,
длины один,
и поэтому этот блок будет использован, только если не будет совпадения
ни с одним из остальных блоков location
.
Далее, добавьте второй блок location
:
location /images/ { root /data; }
Он будет давать совпадение с запросами, начинающимися с
/images/
(location /
для них тоже подходит, но указанный там префикс
короче).
Итоговая конфигурация блока server
должна выглядеть
следующим образом:
server { location / { root /data/www; } location /images/ { root /data; } }
Это уже работающая конфигурация сервера, слушающего на стандартном порту 80
и доступного на локальном компьютере по адресу
http://localhost/
.
В ответ на запросы, URI которых начинаются с /images/
,
сервер будет отправлять файлы из каталога /data/images
.
Например, на запрос
http://localhost/images/example.png
nginx отправит
в ответ файл /data/images/example.png
.
Если же этот файл не существует, nginx отправит ответ, указывающий на
ошибку 404.
Запросы, URI которых не начинаются на /images/
, будут
отображены на каталог /data/www
.
Например, в результате запроса
http://localhost/some/example.html
в ответ будет
отправлен файл /data/www/some/example.html
.
Чтобы применить новую конфигурацию, запустите nginx, если он ещё не запущен,
или отправьте сигнал reload
главному процессу nginx,
выполнив:
nginx -s reload
В случае если что-то работает не как ожидалось, можно попытаться выяснить
причину с помощью файловaccess.log
иerror.log
из каталога
/usr/local/nginx/logs
или
/var/log/nginx
.
Настройка простого прокси-сервера
Одним из частых применений nginx является использование его в качестве
прокси-сервера, то есть сервера, который принимает запросы, перенаправляет их
на проксируемые сервера, получает ответы от них и отправляет их клиенту.
Мы настроим базовый прокси-сервер, который будет обслуживать запросы
изображений из локального каталога и отправлять все остальные запросы на
проксируемый сервер.
В этом примере оба сервера будут работать в рамках одного
экземпляра nginx.
Во-первых, создайте проксируемый сервер, добавив ещё один блок
server
в конфигурационный файл nginx со следующим
содержимым:
server { listen 8080; root /data/up1; location / { } }
Это будет простой сервер, слушающий на порту 8080
(ранее директива listen
не указывалась, потому что
использовался стандартный порт 80) и отображающий все
запросы на каталог /data/up1
в локальной файловой
системе.
Создайте этот каталог и положите в него файл index.html
.
Обратите внимание, что директива root
помещена в контекст
server
.
Такая директива root
будет использована, когда директива
location
, выбранная для выполнения запроса, не содержит
собственной директивы root
.
Далее, используйте конфигурацию сервера из предыдущего раздела
и видоизмените её, превратив в конфигурацию прокси-сервера.
В первый блок location
добавьте директиву
proxy_pass,
указав протокол, имя и порт проксируемого сервера в качестве параметра
(в нашем случае это http://localhost:8080
):
server { location / { proxy_pass http://localhost:8080; } location /images/ { root /data; } }
Мы изменим второй блок
location
, который на данный момент отображает запросы
с префиксом /images/
на файлы из каталога
/data/images
так, чтобы он подходил для запросов изображений
с типичными расширениями файлов.
Изменённый блок location
выглядит следующим образом:
location ~ \.(gif|jpg|png)$ { root /data/images; }
Параметром является регулярное выражение, дающее совпадение со всеми
URI, оканчивающимися на .gif
, .jpg
или
.png
.
Регулярному выражению должен предшествовать символ ~
.
Соответствующие запросы будут отображены на каталог /data/images
.
Когда nginx выбирает блок location
,
который будет обслуживать запрос, то вначале он проверяет
директивы location,
задающие префиксы, запоминая location
с самым
длинным подходящим префиксом, а затем проверяет регулярные выражения.
Если есть совпадение с регулярным выражением, nginx выбирает соответствующий
location
, в противном случае берётся запомненный ранее
location
.
Итоговая конфигурация прокси-сервера выглядит следующим образом:
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
Этот сервер будет фильтровать запросы, оканчивающиеся на
.gif
, .jpg
или .png
,
и отображать их на каталог /data/images
(добавлением URI к
параметру директивы root
) и перенаправлять все остальные
запросы на проксируемый сервер, сконфигурированный выше.
Чтобы применить новую конфигурацию, отправьте сигнал reload
nginx’у, как описывалось в предыдущих разделах.
Существует множество
других директив для дальнейшей настройки прокси-соединения.
Настройка проксирования FastCGI
nginx можно использовать для перенаправления запросов на FastCGI-серверы.
На них могут исполняться приложения, созданные с использованием
разнообразных фреймворков и языков программирования, например, PHP.
Базовая конфигурация nginx для работы с проксируемым FastCGI-сервером
включает в себя использование директивы
fastcgi_pass
вместо директивы proxy_pass
,
и директив fastcgi_param
для настройки параметров, передаваемых FastCGI-серверу.
Представьте, что FastCGI-сервер доступен по адресу
localhost:9000
.
Взяв за основу конфигурацию прокси-сервера из предыдущего раздела,
замените директиву proxy_pass
на директиву
fastcgi_pass
и измените параметр на
localhost:9000
.
В PHP параметр SCRIPT_FILENAME
используется для
определения имени скрипта, а в параметре QUERY_STRING
передаются параметры запроса.
Получится следующая конфигурация:
server { location / { fastcgi_pass localhost:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
Таким образом будет настроен сервер, который будет перенаправлять
все запросы, кроме запросов статических изображений, на проксируемый
сервер, работающий по адресу localhost:9000
,
по протоколу FastCGI.
Есть нужен веб-сервер для Windows, идеально подойдет веб-сервер Nginx с подключенным PHP через FastCGI. В статье будет показана настройка и связка Nginx с PHP на примере Windows 11. Аналогично происходит настройка в Windows 7/8/10.
1. Структура каталогов под сервера
Удобно когда все сервера и сервисы установлены в отдельной папке. Я рекомендую сделать структуру аналогично моей.
Создаем на диске D:\ папку server (если диск один, то создаем на C). В папке server будет находится все что относится в веб-серверу, базы данных, файлы сайта.
Структура будет выглядеть так:
# Папка для серверов
D:\server\
# Папка для nginx
D:\server\nginx\
# Папка для PHP
D:\server\php\
# Папка для веб-сайтов
D:\server\www\
Создаем необходимые папки.
Подобная архитектура удобна тем, что все сервера находятся на отдельном диске в отдельной папке. Можно без проблем сделать резервное копирование, обновление серверов и так далее.
2. Установка и настройка nginx
2.1. Установка nginx
Заходим на официальный сайт Nginx https://nginx.org/ru/download.html и скачиваем последнею версию
Стабильная версия больше подойдет если nginx используется для рабочих веб-сайтов, а не используется для разработки, тестирования новых возможностей nginx.
Извлекаем скаченный архив в папку D:\server\nginx\
2.2. Конфигурация nginx (nginx.conf)
Теперь необходимо настроить сам nginx и его работу в связке с PHP.
Открываем файл конфигурации nginx.conf (в моем случае D:\server\nginx\conf\nginx.conf) и настраиваем веб-сервер nginx
# Базовый файл конфигурации nginx + PHP FastCGI
#user nobody;
worker_processes 1; # Количество запущенных процессов
#Лог ошибок
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024; # Количество подключений к одному процессу
}
http {
include mime.types;
default_type application/octet-stream;
# Лог доступа
access_log off;
#access_log logs/access.log main;
gzip on; # Использовать сжатие
# Разделов server может быть неограниченное количество
#
# Раздел server для домена сайта localhost по 80 порту
server {
listen 80; # Порт
server_name localhost; # Домен сайта
charset utf-8; # Кодировка сайта
error_log logs/localhost.error.log; # Лог ошибок сайта
access_log logs/localhost.access.log; # Лог доступа сайта
# Путь до папки сайта
root D:/server/www;
# Обработка всех URI запросов начинающихся с /
location / {
#root D:/server/www; # root определена в разделе server
index index.html index.php; # файлы в качестве индекса
}
# Настройка обработки php скриптов через PHP-FastCGI
#
# Обработка всех URI запросов оканчивающихся на .php
location ~ \.php$ {
# IP и порт PHP-FastCGI. С такими же параметрами нужно будет запускать php-cgi.exe
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# Путь до php скриптов, $document_root - путь из параметра root (папка сайта)
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
Сохраняем и закрываем файл.
3. Установка и настройка PHP
3.1. Установка PHP
Заходим на сайт PHP https://windows.php.net/download и скачиваем последнею Non Thread Safe версию
Если в Windows не установлены Visual C++ Redistributable для Visual Studio 2015-2019, их необходимо скачать (vc_redist.x64.exe и vc_redist.x86.exe) и установить.
Извлекаем скаченный архив в папку D:\server\php\
3.2. Конфигурация PHP (php.ini)
По умолчанию в PHP содержатся два примера конфигурации php.ini-production и php.ini-development. Версия production используется для рабочих сайтов, в ней ошибки только записываются в лог файлы веб-сервера. Версия development используется при разработке, в ней ошибки выводятся на веб-страницу и записываются в лог файлы.
Копируем и переименовываем файл php.ini-production или php.ini-development в php.ini (это основной файл конфигурации PHP).
Открываем в тестовом редакторе файл php.ini (в моем случае D:\server\php\php.ini), находим параметр extension_dir и указываем папку с расширениями PHP
; Раскомментируем параметр для Windows (относительный путь)
extension_dir = "ext"
; Или можно указать полный путь до папки с расширениями
;extension_dir = "D:\server\php\ext"
Далее находим раздел Dynamic Extensions и включаем необходимые расширения
Сохраняем и закрываем файл.
4. Скрипты запуска и остановки веб-сервера
В папке D:\server\ будут находится скрипты для управления веб-сервером.
После запуска php-cgi.exe (PHP FastCGI), он будет работать в открытом окне консоли. Если это не желательно, скачиваем утилиту RunHiddenConsole.exe в папку D:\server\ и тогда дальнейший запуск php-cgi.exe будет происходить через данную утилиту.
Создаем скрипт запуску веб-сервера web-start.bat
:: Запуск PHP FastCGI
:: Если файл RunHiddenConsole.exe существует, то запускаем PHP через утилиту
if exist "RunHiddenConsole.exe" (
:: PHP будет запущен в скрытом режиме
RunHiddenConsole.exe "php\php-cgi.exe" -b 127.0.0.1:9000 -c "php\php.ini"
) else (
start php\php-cgi.exe -b 127.0.0.1:9000 -c "php\php.ini"
)
:: Запуск nginx
cd nginx
start nginx.exe
Создаем скрипт остановки веб-сервера web-stop.bat
taskkill /f /IM nginx.exe
taskkill /f /IM php-cgi.exe
Для удобства создаем скрипт перезапуска веб-сервера web-restart.bat
call web-stop.bat
call web-start.bat
В результате папка server выглядит следующим образом
5. Проверка веб-сервера nginx + PHP
Создаем в папке D:\server\www\ файл index.php следующего содержимого
<?php
phpinfo();
?>
Запускаем веб-сервер скриптом web-start.bat
Открываем в браузере http://localhost/ и если все нормально, будет выведена информация о PHP.
nginx в связке с PHP успешно установлены, настроены и работают.
Если что-то не работает, смотрим лог файлы nginx (D:\server\nginx\logs\) или запускаем PHP без скрытия консоли, чтобы увидеть ошибки в ней.
Installing and Running nginx
- Download nginx for Windows Download
- Extract the downloaded .zip file
- Rename the extracted folder nginx
- Copy the extracted nginx files to the desired location, for example C:\Program Files\nginx
- Open the nginx folder and double click nginx.exe to run the server
Adding PHP Support
- Download Microsoft Visual C++Download
- Download PHP for Windows (VC15 x64 NTS) Download
- Install Microsoft Visual C++
- Extract the downloaded .zip file
- Rename the extracted folder php
- Copy the extracted php folder to the desired location, for example C:\Program Files\PHP
- Open the php install location and right click in the white space while holding down the Shift key > Open PowerShell window here
- Paste the following command in the PowerShell window to start the PHP CGI process
.\php-cgi.exe -b 127.0.0.1:9123
- Open Windows Explorer and navigate to the nginx installation directory /conf
- Edit nginx.conf in a text editor
- Add the following lines inside the server object
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9123;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
} - Save the changes to nginx.conf
- Right click the Start button > Run > Type taskkill /f /im «nginx.exe» > Press Enter
- Double click nginx.exe to restart the process with PHP support
Running nginx Server on Startup
nginx doesn’t currently have the ability to run as a Windows service natively. A simple workaround is to create a scheduled task to start the nginx server on system startup
- Open notepad and paste the following into a blank text file
start «» /b «C:\Program Files\PHP\php-cgi.exe» -b 127.0.0.1:9123
start «» /b «C:\Program Files\nginx\nginx.exe» -c «C:\Program Files\nginx\conf\nginx.conf» - Save the text file as startup.bat in the nginx installation directory
- Click the Start button > Search Task > Click Task Scheduler
- Right click the Task Scheduler Library folder in the top left > Create Basic Task
- Name the task nginx startup > Click Next
- Select When the computer starts > Click Next
- Select Start a program > Click Next
- Click the Browse… button and navigate to C:\Program Files\nginx\startup.bat
- Set the Start in value to C:\Program Files\nginx > Click Next
- Click Finish
- Reboot to test that nginx with PHP support starts with the system on boot
Source: http://nginx.org/en/docs/windows.html
Из данного HOWTO Вы узнаете как установить и настроить связку nginx + php (в режиме FastCGI) + СУБД MySQL для работы под операционной Microsoft Windows.
Мы подробно рассмотрим вопросы установки, базовой и расширенной настройки, а также безопасности.
В статье приводятся примеры скриптов запуска и остановки, а также примеры файлов конфигурации nginx и php.
Подробности смотрите под катом.
Шаг 1. Подготовка к установке
Для начала рекомендуем в корне системного диска создать каталог nginx (например, c:\nginx\), а в нём подкаталоги public_html, php и mysql. Лучше всего связка работает, когда все основные компоненты находятся в одном каталоге. В каталог php мы будем устанавливать интерпретатор PHP5, в mysql соответственно данную СУБД, а в public_html — файлы главного сайта.
Разместив все компоненты таким образом, Вы сделаете пакет перемещаемым (Portable) и готовым к работе с любого компьютера.
Шаг 2. Загрузка необходимых компонентов
Нам потребуются следующие компоненты:
- PHP — http://windows.php.net/download/. Вам необходимо скачать версию с инсталлятором (*.msi) в варианте Thread Safe;
- MySQL — http://dev.mysql.com/downloads/mysql/. Также скачайте версию с msi-инсталлятором;
- nginx — http://nginx.org/ru/download.html. Скачайте последнюю версию;
- RunHiddenConsole — http://redmine.lighttpd.net/attachments/660/RunHiddenConsole.zip.
Шаг 3. Установка компонентов
По окончании скачивания приступайте к установке компонентов согласно данному алгоритму:
- распакуйте архив с nginx в созданный на шаге 1 каталог в корне (например, c:\nginx\). Далее в данном HOWTO будет использоваться именно этот каталог, поэтому если Вы изменили путь, сделайте соответствующие правки;
- установите PHP в каталог c:\nginx\php\:
- на этапе выбора типа установки (Web Server Setup) обязательно выберите вариант «Other CGI«, иначе модули, необходимые для работы PHP в режиме FastCGI не будут установлены;
PHP — Web Server Setup - на этапе выбора необходимых модулей (Choose Items to Install) обязательно выберите MySQL, MySQLi и OpenSSL (если хотите далее настроить SSL). Также рекомендуется выбрать модули, необходимые для большинства CMS: bzip2, Curl, Exif, GD2, Gettext, XML. Если Вы забыли что-то нужное и оно Вам потребуется, Вы всегда сможете доустановить/удалить эти компоненты, снова запустив программу установки PHP и выбрав пункт Change.
PHP — выбор компонентов
- на этапе выбора типа установки (Web Server Setup) обязательно выберите вариант «Other CGI«, иначе модули, необходимые для работы PHP в режиме FastCGI не будут установлены;
- установите СУБД MySQL в каталог c:\nginx\mysql\. Здесь нет ничего сложного. В мастере конфигурации выберите стандартную конфигурацию и обязательно задайте пароль администратора (пароль встроенной учётной записи суперпользователя root);
- распакуйте архив RunHiddenConsole.zip в каталог c:\nginx\.
Шаг 4. Создание скриптов запуска и остановки
Для быстрого запуска набора Вам потребуется создать в каталоге c:\nginx\ 3 файла: start.cmd, shutdown.cmd и restart.cmd, предназначенные соответственно для запуска, остановки и перезапуска серверов.
Листинг файла start.cmd (запуск сервера):
@echo off echo Starting servers... set PHP_FCGI_MAX_REQUESTS=0 set SRVPATH=C:\nginx net start MySQL start /D%SRVPATH% nginx.exe %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9000 -c %SRVPATH%/php/php.ini
Листинг файла shutdown.cmd (остановка сервера):
@echo off echo Shutting down servers... taskkill /IM nginx.exe /F taskkill /IM php-cgi.exe /F net stop MySQL
Листинг файла restart.cmd (перезапуск сервера):
@echo off echo Shutting down servers... taskkill /IM nginx.exe /F taskkill /IM php-cgi.exe /F net stop MySQL echo Starting servers... set PHP_FCGI_MAX_REQUESTS=0 set SRVPATH=C:\nginx net start MySQL start /D%SRVPATH% nginx.exe %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9000 -c %SRVPATH%/php/php.ini
Если Вы изменили путь со стандартного C:\nginx\, на что-то другое, внесите соответствующие правки в скрипты.
Если требуется запускать сервер nginx+php+mysql при загрузке системы, то добавьте задание на автозапуск скрипта start.cmd с помощью оснастки Назначенные задания Windows.
Откройте файл c:\nginx\conf\nginx.conf в любом текстовом редакторе (я рекомендую Notepad++).
1. Измените строку:
worker_processes 1;
Здесь вместо 1 укажите количество рабочих процессов nginx. Рекомендуется указывать число, равное количеству ядер процессора.
2. Уберите символ комментария (решётку) у строки:
error_log logs/error.log;
Это позволит включить запись логов ошибок в файл error.log, который Вы всегда найдёте в каталоге c:\nginx\logs\.
3. Измените значение директивы server{} для nginx без использования SSL:
server { listen 80 default; server_name localhost; server_tokens off; #charset koi8-r; #access_log logs/access.log main; location / { root c:/nginx/public_html; index index.html index.htm index.php; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; } #error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
Если Вы хотите использовать SSL, Вам потребуется совсем иной конфиг:
server { listen 443 default; server_name localhost; server_tokens off; ssl on; ssl_certificate C:/nginx/private/ssl_cert_domain.pem; ssl_certificate_key C:/nginx/private/ssl_cert_domain.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; #charset koi8-r; #access_log logs/access.log main; location / { root c:/nginx/public_html; index index.html index.htm index.php; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_param HTTPS on; } #error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ /\.ht { deny all; } }
Здесь C:/nginx/private/ssl_cert_domain.pem — файл сертификата SSL, а C:/nginx/private/ssl_cert_domain.key — закрытый ключ для него. Внимание! При старте сервера у Вас запросят пароль для расшифровки закрытого ключа, поэтому чтобы не вводить его постоянно, во время создания (получения) сертификата оставьте поле ввода пароля пустым (это конечно небезопасно, но экономит время во время запуска сервера). В новых версиях возможно появится функция указания пароля в конфиге (как у Apache).
Вы можете включить ведение логов доступа (access.log), убрав символ комментария у строки #access_log logs/access.log main;.
Вы также можете переопределить страницы ошибок 404, 500, 502, 503, 504 и 403 путём указания в директиве error_page кода ошибки и имени файла, который будет отображаться при её возникновении.
Шаг 6. Настройка php и безопасность
Откройте текстовый файл C:\nginx\php\php.ini в любом текстовом редакторе. Из соображений безопасности рекомендуем изменить строку
safe_mode = Off
на
safe_mode = On
Также найдите в файле строку
disable_functions =
и замените её на следующую:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
Эти действия включат безопасный режим для PHP (Safe Mode), при котором запрещены большинство небезопасных функций и исполнение файлов, а также отключит ряд потенциально уязвимых функций. Внимание! Если Ваша CMS не работает при включённом режиме PHP Safe Mode, отключите его, либо поставьте правильную CMS ;-).
Если Вы являетесь разработчиком и хотите видеть ошибки и сообщения PHP, то найдите строку
display_errors = Off
и замените её на
display_errors = On
Для исправления опасной уязвимости в PHP, позволяющей выполнять PHP-код из загружаемых файлов, найдите в php.ini строку
;cgi.fix_pathinfo=1
уберите символ комментария (;) около неё и замените на следующую:
cgi.fix_pathinfo = 0
Дальнейшие настройки файла изменять не требуется — всё уже настроено оптимально для большинства применений программой установки PHP.
Шаг 7. Обработка нескольких PHP-файлов одновременно
К сожалению, PHP в Windows не умеет создавать копии своих экземпляров, поэтому придётся заранее запускать несколько копий и описать их использование в конфиге nginx.
В файле start.cmd пропишите запуск php-cgi.exe на разные номера портов:
%SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9000 -c %SRVPATH%/php/php.ini %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9001 -c %SRVPATH%/php/php.ini %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9002 -c %SRVPATH%/php/php.ini %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9003 -c %SRVPATH%/php/php.ini %SRVPATH%\RunHiddenConsole.exe %SRVPATH%\php\php-cgi.exe -b 127.0.0.1:9004 -c %SRVPATH%/php/php.ini
Запустите столько процессов, сколько вам потребуется (обычно достаточно 5-20). В нашем примере используется 5 экземпляров с номерами портов 9000 — 9004.
Откройте файл nginx.conf в текстовом редакторе и перед директивой server {} пропишите следующие строки:
upstream backend { server 127.0.0.1:9000; server 127.0.0.1:9001; server 127.0.0.1:9002; server 127.0.0.1:9003; server 127.0.0.1:9004; }
Теперь откройте файл fastcgi_params и в самом начале пропишите следующее:
fastcgi_connect_timeout 1; fastcgi_next_upstream timeout; fastcgi_pass backend;
Обязательно уберите fastcgi_pass 127.0.0.1:9000; во всех директивах location.
Пример готового конфига nginx.conf:
worker_processes 4; error_log logs/error.log; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; upstream backend { server 127.0.0.1:9000; server 127.0.0.1:9001; server 127.0.0.1:9002; server 127.0.0.1:9003; server 127.0.0.1:9004; } server { listen 80 default; server_name localhost; server_tokens off; location / { root C:/nginx/public_html; index index.html index.htm index.php; location ~ \.php$ { include fastcgi_params; } } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ /\.ht { deny all; } } }
Пример конфига, использующего SSL:
worker_processes 4; error_log logs/error.log; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; upstream backend { server 127.0.0.1:9000; server 127.0.0.1:9001; server 127.0.0.1:9002; server 127.0.0.1:9003; server 127.0.0.1:9004; } server { listen 443 default; server_name localhost; server_tokens off; ssl on; ssl_certificate C:/nginx/private/ssl_cert_domain.pem; ssl_certificate_key C:/nginx/private/ssl_cert_domain.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; location / { root C:/nginx/public_html; index index.html index.htm index.php; location ~ \.php$ { include fastcgi_params; fastcgi_param HTTPS on; } } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ /\.ht { deny all; } } }
Пример файла fastcgi_params:
fastcgi_connect_timeout 1; fastcgi_next_upstream timeout; fastcgi_pass backend; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; fastcgi_index index.php;
Шаг 8. Тестирование и заключение
Запустите серверы и создайте в каталоге C:\nginx\public_html\ файл test.php со следующим содержанием:
<?php phpinfo(); ?>
Откройте этот файл в браузере по адресу http://localhost/test.php и если Вы увидели информацию об установленном сервере, значит всё работает корректно и Вы можете приступать к использованию сервера.
Шаг 9. Готовые примеры файлов конфигурации
По многочисленным просьбам мы решили выложить примеры всех файлов конфигурации nginx в Git-репозитории. В данный момент доступно три разных готовых конфига:
- nginx_simple.conf — простейший конфиг для запуска одного сайта без поддержки SSL;
- nginx_ssl.conf — конфиг для запуска одного сайта с поддержкой SSL;
- nginx_vhosts.conf — специально настроенный конфиг с относительными путями, поддержкой SSL, виртуальных хостов (позволяет держать несколько сайтов на одном сервере) и отдельных логов.
Там же вы найдете готовые скрипты запуска и остановки сервера, а также файл конфигурации PHP.
Nginx and PHP Setup on Windows
For local development you could also use Nginx with PHP as an replacement for XAMPP.
Install Nginx
- Download Nginx for Windows: http://nginx.org/en/download.html | Direct: nginx-1.19.7.zip
- Extract the ZIP file to
c:\nginx
- Open the file
c:/nginx/config/nginx.conf
and replace theserver { ... }
section with this configuration:
server {
listen 80;
server_name localhost;
index index.php;
error_log c:/nginx/logs/localhost.error.log;
access_log c:/nginx/logs/localhost.access.log;
root c:/nginx/html;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9123;
}
}
- Create a file
c:/nginx/html/index.php
and copy/paste this content:
- To start the webserver run:
cd c:\nginx
start nginx
- Allow the windows firewall access
- Run the tasklist command-line utility to see nginx processes:
tasklist /fi "imagename eq nginx.exe"
nginx runs as a standard console application (not a service), and it can be managed using the following commands:
nginx -s stop
fast shutdownnginx -s quit
graceful shutdownnginx -s reload
changing configuration, starting new worker processes with a new configuration, graceful shutdown of old worker processesnginx -s reopen
re-opening log filestaskkill /IM nginx.exe /F
Close all nginx processes
Install PHP
- Download PHP for Windows Thread Safe x64: php-8.3.12-Win32-vs16-x64.zip
- Extract the ZIP file to:
c:\nginx\php
- Make sure that the file
C:\nginx\php\php-cgi.exe
exists. - Create a new file:
c:\nginx\php\php.ini
and copy/paste this content:
[PHP] engine = On short_open_tag = Off implicit_flush = Off zend.enable_gc = On expose_php = Off max_execution_time = 30 max_input_time = 60 memory_limit = 512M error_reporting = E_ALL display_errors = On display_startup_errors = On log_errors = On variables_order = "GPCS" request_order = "GP" register_argc_argv = Off auto_globals_jit = On post_max_size = 8M default_mimetype = "text/html" default_charset = "UTF-8" include_path = "." extension_dir = "c:\nginx\php\ext" enable_dl = Off file_uploads = On upload_max_filesize = 2M max_file_uploads = 20 allow_url_fopen = On allow_url_include = Off default_socket_timeout = 60 extension=curl extension=fileinfo extension=gd extension=gettext extension=intl extension=mbstring extension=mysqli extension=openssl extension=pdo extension=pdo_mysql extension=sqlite3 [Session] session.save_handler = files session.save_path = "c:\nginx\temp" session.use_strict_mode = 0 session.use_cookies = 1 session.use_only_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.cookie_samesite = session.serialize_handler = php session.gc_probability = 1 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.sid_bits_per_character = 5
To start PHP with FastCGI run:
cd c:\nginx\php
php-cgi.exe -b 127.0.0.1:9123
- Open
http://localhost
- You should see the phpinfo page.
XDebug Setup
- Follow these installation instructions: https://odan.github.io/2020/12/03/xampp-xdebug-setup-php8.html