Nginx (произносится «Энжин-Икс») — высокопроизводительный веб-сервер, разработанный Игорем Сысоевым и впервые выпущенный в 2004 году. Он завоевал популярность благодаря своей асинхронной, событийно-ориентированной архитектуре, которая позволяет обрабатывать десятки тысяч соединений одновременно с минимальным потреблением памяти. Nginx отлично подходит для статических файлов, а также как обратный прокси и балансировщик для динамических приложений (например, на PHP, Python, Node.js).
В этой статье мы подробно разберём установку Nginx на основных операционных системах, структуру конфигурационных файлов, базовые и продвинутые настройки, создание серверных блоков (аналог виртуальных хостов в Apache), настройку HTTPS, работу с модулями и многое другое с наглядными примерами.
1. Установка Nginx
Способ установки зависит от вашей операционной системы. Рассмотрим основные варианты.
1.1 Установка на Ubuntu / Debian
В дистрибутивах на основе Debian пакет Nginx доступен в официальных репозиториях.
# Обновление списка пакетов
sudo apt update
# Установка Nginx
sudo apt install nginx
# Автоматический запуск при загрузке системы
sudo systemctl enable nginx
# Запуск сервера
sudo systemctl start nginxПосле установки откройте в браузере http://localhost — вы должны увидеть стандартную страницу приветствия Nginx.
Важно: Если порт 80 уже занят другим сервером (например, Apache), остановите его или измените порт в конфигурации Nginx (об этом ниже).
1.2 Установка на CentOS / RHEL / Rocky Linux
В этих дистрибутивах Nginx обычно устанавливается из EPEL-репозитория.
# Установка EPEL (если ещё не установлен)
sudo dnf install epel-release
# Установка Nginx
sudo dnf install nginx
# Автоматический запуск при загрузке
sudo systemctl enable nginx
# Запуск сервера
sudo systemctl start nginx1.3 Установка на Windows
Для Windows Nginx распространяется в виде ZIP-архива:
- Скачайте последнюю стабильную версию с официального сайта Nginx.
- Распакуйте архив в папку, например,
C:\nginx. - Запустите из командной строки: start nginx (из папки
C:\nginx). - Для остановки выполните: nginx -s stop
- Для перезагрузки конфигурации: nginx -s reload
1.4 Установка из исходных кодов
Если нужна специфическая сборка с дополнительными модулями:
# Скачивание исходников (замените версию на актуальную)
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# Конфигурация с указанием пути установки и модулей
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_gzip_static_module
# Сборка и установка
make
sudo make install
# Запуск
/usr/local/nginx/sbin/nginxПодробные инструкции по установке из исходных кодов содержатся в официальной документации Nginx.
2. Структура конфигурационных файлов
В отличие от Apache, у Nginx нет одного большого файла httpd.conf. Конфигурация строится по модульному принципу:
| Система | Главный конфигурационный файл | Дополнительные директивы |
|---|---|---|
| Ubuntu/Debian | /etc/nginx/nginx.conf | /etc/nginx/sites-available/, /etc/nginx/sites-enabled/, /etc/nginx/conf.d/ |
| CentOS/RHEL | /etc/nginx/nginx.conf | /etc/nginx/conf.d/ |
| Arch Linux | /etc/nginx/nginx.conf | /etc/nginx/conf.d/ |
Главный файл nginx.conf включает в себя блок http, внутри которого могут быть блоки server (виртуальные хосты) и общие настройки.
Синтаксис конфигурационных файлов:
- Директивы заканчиваются точкой с запятой
; - Блоки обозначаются фигурными скобками
{ ... } - Комментарии начинаются с
# - Вложенные блоки разрешены
- Вложенность и отступы важны для читаемости
Проверка синтаксиса
Перед перезагрузкой сервера всегда проверяйте конфигурацию:
nginx -tЕсли синтаксис корректен, вы увидите: nginx: configuration file /etc/nginx/nginx.conf test is successful
Это обязательная практика — неправильная конфигурация может привести к падению сервера.
3. Основные директивы nginx.conf
Разберём ключевые директивы, которые вы найдёте в главном конфигурационном файле.
3.1 Базовые настройки
# Пользователь, от имени которого работают рабочие процессы
user www-data;
# Количество рабочих процессов (обычно равно числу ядер CPU)
worker_processes auto;
# Файл, в который записывается PID основного процесса
pid /run/nginx.pid;
# Максимальное количество открытых файлов на один рабочий процесс
worker_rlimit_nofile 65535;3.2 Основной блок events (управление соединениями)
events {
# Максимальное количество соединений на один рабочий процесс
worker_connections 1024;
# Разрешить приём множества соединений в одном системном вызове
multi_accept on;
}3.3 Блок http (глобальные настройки веб-сервера)
http {
# Базовые MIME-типы
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Формат логов
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
# Основные настройки производительности
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Таймауты соединений
keepalive_timeout 65;
types_hash_max_size 2048;
# Сжатие gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml;
# Подключение файлов с настройками виртуальных хостов
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}3.4 Базовый блок server (виртуальный хост по умолчанию)
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}4. Серверные блоки (Server Blocks / Виртуальные хосты)
В Nginx виртуальные хосты называются серверными блоками и описываются внутри блока http с помощью директивы server. Аналогично Apache, они позволяют размещать несколько сайтов на одном IP-адресе.
4.1 Настройка серверных блоков
Шаг 1: Создайте директории для сайтов:
# Создание папок для сайтов
mkdir -p /var/www/site1.com/html
mkdir -p /var/www/site2.com/html
# Создание тестовых страниц
echo "<h1>Site 1</h1>" > /var/www/site1.com/html/index.html
echo "<h1>Site 2</h1>" > /var/www/site2.com/html/index.htmlШаг 2: Создайте конфигурационные файлы в /etc/nginx/sites-available/:
# /etc/nginx/sites-available/site1.conf
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}# /etc/nginx/sites-available/site2.conf
server {
listen 80;
server_name site2.com www.site2.com;
root /var/www/site2.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}Шаг 3: Активируйте сайты, создав символические ссылки в sites-enabled/:
ln -s /etc/nginx/sites-available/site1.conf /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/site2.conf /etc/nginx/sites-enabled/Шаг 4: Проверьте конфигурацию и перезагрузите Nginx:
nginx -t
systemctl reload nginx4.2 Серверный блок по умолчанию
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/default;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}Серверный блок с default_server будет обслуживать запросы, которые не соответствуют ни одному другому блоку.
4.3 Обработка нескольких доменов
server {
listen 80;
server_name example.com www.example.com site1.net www.site1.net;
root /var/www/multi-site/html;
}4.4 Использование location для разных URI
server {
listen 80;
server_name example.com;
root /var/www/example/html;
# Обработка статики
location /static/ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# Обработка изображений
location /images/ {
expires 1y;
add_header Cache-Control "public";
}
# Проксирование на бэкенд (например, Node.js)
location /api/ {
proxy_pass http://localhost:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}💡 Этот блок подходит для WebSocket-соединений (например, Socket.io). Заголовки Upgrade и Connection обязательны, иначе соединение будет сбрасываться.
Регулярные выражения в location и map легко допустить ошибку — одна лишняя слеш или пробел ломает правило. В конструкторе Nginx-правил на codestack.space можно собрать типовые сценарии (кеширование, прокси, редиректы) и получить готовый блок конфигурации без ручного подбора regex.
5. Модули Nginx
Nginx поддерживает динамическую загрузку модулей (начиная с версии 1.9.11). В отличие от Apache, большинство модулей компилируются статически или загружаются через директиву load_module.
5.1 Основные модули
| Модуль | Назначение |
|---|---|
ngx_http_ssl_module | Поддержка HTTPS (SSL/TLS) |
ngx_http_v2_module | Поддержка HTTP/2 |
ngx_http_proxy_module | Проксирование запросов на бэкенд |
ngx_http_upstream_module | Балансировка нагрузки |
ngx_http_gzip_module | Сжатие ответов |
ngx_http_rewrite_module | Перезапись URL (встроен) |
ngx_http_realip_module | Передача реального IP клиента через прокси |
5.2 Подключение динамического модуля
# В самом начале nginx.conf
load_module /usr/lib/nginx/modules/ngx_http_image_filter_module.so;5.3 Условная обработка с помощью map
http {
map $http_user_agent $mobile {
default 0;
~*iPhone 1;
~*Android 1;
}
server {
location / {
if ($mobile) {
rewrite ^ /mobile/ redirect;
}
}
}
}6. Настройка HTTPS (SSL/TLS)
6.1 Создание самоподписанного сертификата
# Создание директории для сертификатов
sudo mkdir -p /etc/nginx/ssl
# Генерация сертификата (замените SERVER_FQDN на ваше доменное имя)
sudo openssl req -x509 -nodes \
-addext "subjectAltName=DNS:SERVER_FQDN,DNS:www.SERVER_FQDN" \
-days 730 \
-newkey rsa:2048 \
-keyout /etc/nginx/ssl/nginx.key \
-out /etc/nginx/ssl/nginx.crt6.2 Настройка серверного блока для HTTPS
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
root /var/www/example/html;
index index.html;
# SSL-сертификаты
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
# Настройки SSL для повышения безопасности
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on; # не требуется в современных версиях
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
try_files $uri $uri/ =404;
}
}Такие заголовки, как HSTS, CORS и защита от кликджекинга, удобно добавлять готовыми блоками. Конструктор правил позволяет выбрать нужные опции и получить корректный фрагмент для вставки в server или http.
6.3 Перенаправление HTTP → HTTPS
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$server_name$request_uri;
}7. Nginx как обратный прокси и балансировщик
Одно из самых частых применений Nginx — проксирование запросов к внутренним сервисам (Node.js, Python, PHP-FPM, Java и т.д.).
7.1 Проксирование на PHP-FPM
server {
listen 80;
server_name example.com;
root /var/www/example/public;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}⚠️ Важно: SCRIPT_FILENAME должен указывать на реальный путь к файлу на диске. Если root задан в server, а не в location, убедитесь, что $document_root подставляется корректно.
7.2 Проксирование на Node.js / Express
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}7.3 Балансировка нагрузки (upstream)
http {
upstream backend {
# Стратегия распределения: round-robin по умолчанию
server backend1.example.com weight=3;
server backend2.example.com weight=1;
server backend3.example.com backup; # резервный
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}Для балансировки и upstream-пулов можно использовать шаблоны: в конструкторе есть заготовки под разные стратегии (round-robin, weight, backup) с пояснениями, что делает каждый параметр.
8. Управление сервисом
8.1 systemd (Ubuntu/Debian/CentOS 7+)
# Запуск
sudo systemctl start nginx
# Остановка
sudo systemctl stop nginx
# Перезапуск (для применения изменений конфигурации)
sudo systemctl restart nginx
# Плавный перезапуск (без разрыва соединений)
sudo systemctl reload nginx
# Проверка статуса
sudo systemctl status nginx
# Автозапуск при загрузке
sudo systemctl enable nginx8.2 Сигналы Nginx (без systemd)
# Быстрый перезапуск (новый мастер-процесс)
nginx -s reload
# Плавная остановка (завершение обработки запросов)
nginx -s quit
# Немедленная остановка
nginx -s stop
# Повторное открытие лог-файлов (ротация логов)
nginx -s reopen9. Настройка фаервола
Не забудьте открыть порты:
Ubuntu (UFW):
sudo ufw allow 'Nginx Full' # HTTP (80) и HTTPS (443)CentOS/RHEL (firewalld):
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload⚠️ Перед открытием портов убедитесь, что у сервера есть публичный IP и правила фаервола хостинга (например, панель Reg.ru, AWS, DigitalOcean) также разрешают входящие соединения на 80/443.
10. Безопасность
10.1 Скрытие версии Nginx
# В блоке http
server_tokens off; # Убирает версию из заголовков и страниц ошибок10.2 Ограничение доступа по IP
location /admin/ {
allow 192.168.1.0/24;
deny all;
}10.3 Защита от кликджекинга и XSS
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;10.4 Ограничение количества запросов (лимитирование)
# В блоке http
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;
# В блоке server или location
location /login/ {
limit_req zone=mylimit burst=10 nodelay;
proxy_pass http://backend;
}💡 limit_req_zone можно объявить только в блоке http, а limit_req — в server или location.
11. Кеширование статики
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
# Отключение логов для статики (для производительности)
access_log off;
}Мини-чеклист для быстрой проверки конфигурации:
nginx -t — синтаксис в порядке
systemctl reload nginx — применены изменения
Открыты порты 80 и 443 в фаерволе ОС и панели хостинга
Проверены права на файлы и папки (www-data / nginx)
Для PHP — проверен сокет FPM и пути к файлам
12. Заключение
Мы рассмотрели полный цикл работы с Nginx: от установки до тонкой настройки и использования в качестве прокси-сервера и балансировщика. Ключевые выводы:
- Всегда проверяйте конфигурацию командой
nginx -tперед перезагрузкой. - Используйте серверные блоки (
server) для разделения сайтов — это аналог виртуальных хостов в Apache. - Применяйте схему sites-available / sites-enabled для удобного управления сайтами (на Debian/Ubuntu это работает из коробки).
- Активно используйте проксирование — Nginx отлично справляется с ролью шлюза для динамических приложений.
- Настраивайте кеширование и сжатие для статики, чтобы ускорить загрузку страниц.
- Обеспечьте безопасность: скрывайте версию, настраивайте заголовки, используйте лимиты запросов и HTTPS.
Nginx — это мощный, гибкий и очень быстрый инструмент. Он подходит как для небольших проектов, так и для крупных высоконагруженных систем. Освоив его настройку, вы сможете строить надёжные и производительные веб-инфраструктуры.
