Nginx
Эта документация охватывает базовые и продвинутые темы: от установки и базовой конфигурации до настройки балансировки нагрузки, безопасности и оптимизации производительности.
1. Введение
Nginx — это высокопроизводительный веб-сервер, обратный прокси-сервер и балансировщик нагрузки. Он широко используется для обслуживания статического контента, проксирования запросов к бэкенд-серверам и обеспечения высокой доступности благодаря распределению нагрузки. Nginx известен своей низкой потребляемостью памяти и эффективной обработкой большого количества одновременных соединений.
2. Установка и управление Nginx
2.1. Установка
Nginx можно установить из стандартных репозиториев вашей операционной системы. Ниже приведены примеры для разных дистрибутивов Linux:
Debian/Ubuntu Используйте пакетный менеджер
apt
:sudo apt update sudo apt install nginx -y
Объяснение: Команда
apt update
обновляет списки пакетов, аapt install nginx
устанавливает Nginx.CentOS/RHEL Вначале добавьте репозиторий EPEL, затем установите Nginx:
sudo yum install epel-release -y sudo yum install nginx -y
Объяснение: EPEL (Extra Packages for Enterprise Linux) содержит дополнительные пакеты, среди которых и Nginx.
Arch Linux Установка через
pacman
:sudo pacman -S nginx
Объяснение: Arch Linux имеет современный репозиторий, где уже присутствует актуальная версия Nginx.
2.2. Управление сервисом
После установки Nginx управляется с помощью systemd (или другого init-менеджера в зависимости от системы).
Запуск сервера
sudo systemctl start nginx
Объяснение: Команда запускает службу Nginx, если сервер ранее не был активен.
Перезагрузка конфигурации (без остановки активных соединений)
sudo systemctl reload nginx
Объяснение: Перезагрузка (reload) позволяет применить изменения конфигурационных файлов без разрыва текущих соединений.
Полный перезапуск
sudo systemctl restart nginx
Объяснение: Команда останавливает сервер и запускает его заново, что может разорвать соединения.
Остановка сервера
sudo systemctl stop nginx
Объяснение: Полное отключение сервиса Nginx.
Проверка статуса
sudo systemctl status nginx
Объяснение: Выводит информацию о запущенном процессе, активных соединениях и последних логах.
3. Файлы и структура директорий
Основные конфигурационные файлы Nginx расположены в каталоге /etc/nginx/
. Разделение конфигураций позволяет удобно управлять настройками для отдельных сайтов и сервисов.
/etc/nginx/nginx.conf
Главный конфигурационный файл, содержащий глобальные настройки.
/etc/nginx/sites-available/
Каталог с конфигурационными файлами для всех доступных сайтов.
/etc/nginx/sites-enabled/
Символические ссылки на активные конфигурации сайтов.
/var/log/nginx/access.log
Лог запросов (доступа) к серверу.
/var/log/nginx/error.log
Лог ошибок, возникающих при работе сервера.
Объяснение: Использование двух каталогов (sites-available и sites-enabled) позволяет легко включать или отключать сайты с помощью создания/удаления символических ссылок.
4. Основные директивы конфигурации
В файле nginx.conf
задаются основные параметры работы сервера, влияющие на производительность и масштабируемость.
4.1. Пример базовой конфигурации
worker_processes auto;
worker_rlimit_nofile 100000;
events {
worker_connections 4096;
multi_accept on;
}
Объяснение:
worker_processes auto;
– позволяет Nginx автоматически определить количество рабочих процессов на основе числа ядер процессора.worker_rlimit_nofile 100000;
– задаёт максимальное количество открытых файловых дескрипторов для процессов.worker_connections 4096;
– определяет максимальное число одновременных соединений, которое может обрабатывать один рабочий процесс.multi_accept on;
– разрешает рабочему процессу принимать несколько соединений за раз, что повышает производительность при большом количестве запросов.
5. Конфигурация виртуальных хостов (Server Blocks)
Виртуальные хосты позволяют обслуживать несколько доменных имен или сайтов на одном сервере.
5.1. Базовая конфигурация виртуального хоста
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
index index.html index.htm;
}
Объяснение:
listen 80;
– указывает, что сервер будет принимать запросы на порту 80 (HTTP).server_name
– список доменных имен, для которых применяется эта конфигурация.root
– директория, откуда Nginx будет отдавать файлы.index
– список файлов, которые будут искаться в каталоге, если запрошен корневой URL.
5.2. Перенаправления (Редиректы)
Редиректы используются для перенаправления пользователей с одного URL на другой.
301 Редирект (постоянный):
server { listen 80; server_name oldsite.com; return 301 https://newsite.com; }
Объяснение: Все запросы к
oldsite.com
перенаправляются наhttps://newsite.com
с кодом ответа 301, что означает постоянное перемещение.302 Редирект (временный):
server { listen 80; server_name example.com; location /oldpage { return 302 /newpage; } }
Объяснение: Перенаправление, которое сообщает, что страница временно перемещена.
6. Проксирование запросов (Reverse Proxy)
Nginx часто используется как обратный прокси для передачи запросов от клиентов к бэкенд-серверам, таким как Node.js, Python или другие HTTP-сервисы.
6.1. Пример обратного прокси
location /api/ {
proxy_pass http://backend_server:5000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Объяснение:
location /api/
– указывает, что для URL, начинающихся с/api/
, применяется данная настройка.proxy_pass
– перенаправляет запросы на указанный бэкенд-сервер.proxy_set_header
– устанавливает заголовки, чтобы передать оригинальные данные запроса, такие как IP адрес клиента и имя хоста.
6.2. Проксирование WebSocket-соединений
Для поддержки протокола WebSocket необходимо передать специальные заголовки:
location /ws/ {
proxy_pass http://localhost:8080;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
Объяснение: Заголовки Upgrade
и Connection
необходимы для установления WebSocket-соединения между клиентом и сервером.
7. Балансировка нагрузки
Nginx может распределять входящие запросы между несколькими серверами, повышая отказоустойчивость и производительность.
7.1. Определение upstream-группы
upstream backend {
server backend1.local weight=2;
server backend2.local;
server backend3.local backup;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
Объяснение:
upstream backend { ... }
– создаёт группу серверов для балансировки нагрузки.weight=2
– задаёт больший приоритет для данного сервера (его запросов будет обрабатываться больше).backup
– сервер используется только в случае недоступности основных серверов.В блоке
server
черезproxy_pass
запросы перенаправляются в upstream-группу.
7.2. Типы балансировки
Round Robin – запросы равномерно распределяются между серверами (используется по умолчанию).
Least Connections (
least_conn
) – запрос отправляется серверу с наименьшим числом активных соединений.IP Hash (
ip_hash
) – запросы от одного клиента всегда направляются на один и тот же сервер (полезно для сессий).
8. Безопасность
Обеспечение безопасности — важная задача при настройке веб-сервера. Рассмотрим несколько подходов.
8.1. Ограничение доступа
Вы можете ограничить доступ к определённым ресурсам по IP-адресам:
location /admin/ {
allow 192.168.1.0/24;
deny all;
}
Объяснение: Только клиенты с IP-адресами из подсети 192.168.1.0/24
получат доступ к /admin/
, все остальные будут заблокированы.
8.2. Защита от DDoS и ограничение запросов
Используйте директивы limit_req_zone
и limit_req
для защиты от атак и чрезмерного количества запросов:
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server {
location /login/ {
limit_req zone=one burst=10 nodelay;
}
}
Объяснение: Ограничение до 5 запросов в секунду для каждого IP. Параметр burst
позволяет кратковременно превышать лимит до 10 запросов.
8.3. Настройка HTTPS
Использование SSL/TLS для шифрования данных важно для безопасности пользователей:
Установите
certbot
для автоматического получения сертификатов от Let's Encrypt:sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d example.com -d www.example.com
Конфигурация HTTPS:
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; include ssl_params.conf; }
Объяснение: Директива
ssl_certificate
указывает на путь к сертификату, аssl_certificate_key
— на приватный ключ. Рекомендуется включать дополнительные параметры безопасности через файлssl_params.conf
.
9. Оптимизация и производительность
9.1. Кэширование статических файлов
Позволяет клиентам (браузерам) кэшировать ресурсы, что снижает нагрузку на сервер:
location ~* \.(jpg|jpeg|png|gif|css|js|ico|svg)$ {
expires max;
log_not_found off;
}
Объяснение: Директива expires max;
сообщает браузеру, что файлы можно кэшировать на максимально возможный срок.
9.2. Сжатие данных (Gzip и Brotli)
Сжатие снижает объём передаваемых данных:
Gzip:
gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_vary on;
Brotli (если модуль включен):
brotli on; brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
Объяснение: Gzip и Brotli позволяют уменьшить время загрузки страниц за счёт сжатия контента до передачи клиенту.
9.3. Настройка буферов
Параметры буферизации позволяют оптимизировать обработку больших объёмов данных:
client_body_buffer_size 16K;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
Объяснение: Эти параметры помогают снизить вероятность ошибок при передаче больших запросов или ответов, особенно при работе с медленными клиентами.
10. Логирование и отладка
10.1. Формат логов
Вы можете настроить формат логов для удобства последующего анализа:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
Объяснение: Формат main
задаёт структуру логов, которая позволяет отслеживать IP, дату, запрос, статус ответа и другую полезную информацию.
10.2. Отладка ошибок
Для диагностики проблем можно включить более подробное логирование:
error_log /var/log/nginx/error.log debug;
Объяснение: Режим debug
позволяет записывать детальную информацию об обработке запросов. Это полезно при поиске сложных ошибок, но не рекомендуется использовать в рабочей среде длительное время из-за объёма логов.
10.3. Анализ логов
Используйте утилиты вроде tail
, grep
или специализированные программы (например, ngxtop) для мониторинга логов в реальном времени:
tail -f /var/log/nginx/error.log
Объяснение: Команда tail -f
позволяет наблюдать за появлением новых записей в логе.
11. Работа с приложениями (FastCGI, uWSGI, и проч.)
Nginx может служить связующим звеном между веб-сервером и языковыми интерпретаторами.
11.1. Обработка PHP через FastCGI
Для интеграции с PHP используется php-fpm
:
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
Объяснение: Директива fastcgi_pass
указывает на сокет, через который Nginx передаёт запросы на обработку PHP. Файл fastcgi_params
содержит стандартные переменные окружения.
11.2. Работа с Python через uWSGI
Для Python-приложений можно использовать uWSGI:
location / {
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi/app.sock;
}
Объяснение: Конфигурация аналогична работе с PHP, но используется протокол uWSGI.
12. Расширенные возможности и модули
Nginx поддерживает множество модулей, как встроенных, так и сторонних. Некоторые из них:
Модуль HTTP Stub Status: Позволяет отслеживать состояние сервера.
location /nginx_status { stub_status; allow 127.0.0.1; # Ограничение доступа для локальных запросов deny all; }
Модуль Rewrite: Используется для динамической обработки URL.
location / { rewrite ^/old/(.*)$ /new/$1 permanent; }
Модуль Limit Rate: Ограничивает скорость отдачи данных клиентам.
location /downloads/ { limit_rate 500k; }
Объяснение: Расширенные возможности позволяют адаптировать сервер под специфические задачи, например, мониторинг состояния, динамические редиректы и контроль скорости передачи данных.
13. Трюки и советы по устранению неполадок
13.1. Проверка конфигурации
Перед применением новых настроек всегда проверяйте синтаксис:
nginx -t
Объяснение: Команда сообщает, корректна ли конфигурация, и указывает на возможные ошибки.
13.2. Вывод полной конфигурации
Для отладки можно вывести всю конфигурацию:
nginx -T
Объяснение: Это полезно для поиска конфликтующих настроек или устаревших директив.
13.3. Работа с логами
Регулярный анализ логов позволяет оперативно выявлять проблемы. Используйте фильтрацию (например, grep
), чтобы отыскать ошибки:
grep 'error' /var/log/nginx/error.log
14. Полезные ссылки и ресурсы
Официальная документация: nginx.org Объяснение: Это основной источник информации и справки по директивам и модулям.
Генератор конфигураций: nginxconfig.io Объяснение: Удобный онлайн-инструмент для создания стартовой конфигурации.
Сообщества и форумы:
StackOverflow, Reddit, специализированные группы в Telegram — отличное место для обмена опытом и получения помощи.
15. Заключение
Эта документация охватывает полный спектр возможностей Nginx — от базовой установки до тонкой настройки параметров для повышения производительности и безопасности. Благодаря гибкости конфигурации и широкому набору модулей Nginx остаётся одним из самых популярных инструментов для разработки высоконагруженных веб-сервисов.
Если у вас появились дополнительные вопросы или требуется помощь с настройкой конкретных функций, обращайтесь к официальной документации или специализированным сообществам.
Last updated