Nginx — один из самых популярных веб-серверов в мире. Он используется как прокси-сервер, балансировщик нагрузки и сервер для раздачи статических файлов. В этом руководстве — всё, что нужно знать начинающему администратору для работы с Nginx.
Что такое Nginx
Nginx (читается «энджинкс») — высокопроизводительный веб-сервер, созданный Игорем Сысоевым в 2004 году. Он известен своей скоростью, стабильностью и низким потреблением памяти.
Основные применения Nginx:
- Веб-сервер для статических файлов (HTML, CSS, JS, изображения)
- Обратный прокси-сервер (reverse proxy) для приложений
- Балансировщик нагрузки (load balancer)
- Кэширующий сервер
- Терминатор SSL/TLS
Архитектура Nginx
В Nginx используется один главный процесс и несколько рабочих процессов:
- Главный процесс (master) — читает конфигурацию, управляет рабочими процессами
- Рабочие процессы (worker) — обрабатывают входящие запросы
Количество рабочих процессов задаётся директивой worker_processes. Рекомендуется устанавливать значение равным количеству ядер процессора или auto.
Установка Nginx
Ubuntu / Debian
sudo apt update
sudo apt install nginx
CentOS / RHEL
sudo yum install epel-release
sudo yum install nginx
Проверка версии
nginx -v
Управление Nginx
После установки Nginx можно управлять через systemd или напрямую через исполняемый файл.
Через systemd (рекомендуется)
# Запуск
sudo systemctl start nginx
# Остановка
sudo systemctl stop nginx
# Перезапуск
sudo systemctl restart nginx
# Перезагрузка конфигурации (без остановки)
sudo systemctl reload nginx
# Статус
sudo systemctl status nginx
# Автозапуск при загрузке
sudo systemctl enable nginx
Через исполняемый файл
# Запуск
nginx
# Остановка (плавное завершение)
nginx -s quit
# Быстрая остановка
nginx -s stop
# Перезагрузка конфигурации
nginx -s reload
# Переоткрытие лог-файлов
nginx -s reopen
Проверка конфигурации
Перед перезагрузкой всегда проверяйте синтаксис конфигурации:
nginx -t
Если конфигурация корректна, вы увидите:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Структура конфигурационного файла
Основной конфигурационный файл находится по пути:
/etc/nginx/nginx.conf(Ubuntu/Debian)/etc/nginx/nginx.conf(CentOS)/usr/local/nginx/conf/nginx.conf(из исходников)
Основные контексты
# Глобальные настройки (контекст main)
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
# Настройки обработки соединений
worker_connections 1024;
}
http {
# Настройки HTTP-сервера
server {
# Настройки виртуального сервера
location / {
# Настройки обработки запросов
}
}
}
Типы директив
- Простые директивы — заканчиваются точкой с запятой (
;) - Блочные директивы — содержат вложенные директивы в фигурных скобках (
{})
Раздача статических файлов
Самая частая задача — настроить Nginx для раздачи статического сайта.
Базовая конфигурация
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Параметры location
server {
# Статические файлы
location / {
root /var/www/site;
}
# Изображения (отдельный каталог)
location /images/ {
root /data;
expires 30d;
}
# CSS и JS
location ~* \.(css|js)$ {
root /var/www/site;
expires 7d;
}
# Запрет доступа к скрытым файлам
location ~ /\. {
deny all;
}
}
Настройка обратного прокси
Nginx часто используется как обратный прокси-сервер для приложений (Node.js, Python, PHP).
Проксирование на backend
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1: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;
}
}
Проксирование PHP-FPM
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Настройка SSL/TLS
Для работы по HTTPS необходим SSL-сертификат.
Базовая HTTPS-конфигурация
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/example.com;
}
# Редирект с HTTP на HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
Получение бесплатного сертификата (Let’s Encrypt)
# Установка certbot
sudo apt install certbot python3-certbot-nginx
# Получение сертификата
sudo certbot --nginx -d example.com -d www.example.com
# Автопродление
sudo certbot renew --dry-run
Балансировка нагрузки
Nginx может распределять запросы между несколькими серверами.
upstream backend {
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3003;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
Алгоритмы балансировки
- Round Robin (по умолчанию) — запросы распределяются по очереди
- Least Connections — запросы идут на сервер с最少шим числом соединений
- IP Hash — один клиент всегда попадает на один сервер
upstream backend {
least_conn;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
Кэширование
Nginx может кэшировать ответы backend для ускорения загрузки.
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 1h;
proxy_cache_valid 404 1m;
}
}
}
Логирование
Nginx ведёт два типа логов:
- access.log — лог всех запросов
- error.log — лог ошибок
http {
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
# Кастомный формат лога
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
server {
access_log /var/log/nginx/site.log main;
}
}
Типичные конфигурации для WordPress
Базовая конфигурация WordPress
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
location ~ /\.ht {
deny all;
}
}
WordPress Multisite (поддомены)
server {
listen 80;
server_name *.example.com;
root /var/www/example.com;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Полезные команды
# Проверить конфигурацию
nginx -t
# Посмотреть версию и модули
nginx -V
# Перезагрузить конфигурацию
nginx -s reload
# Посмотреть активные соединения
ss -tlnp | grep nginx
# Проверить логи ошибок
tail -f /var/log/nginx/error.log
# Проверить логи запросов
tail -f /var/log/nginx/access.log
Частые ошибки и решения
502 Bad Gateway
Nginx не может подключиться к backend. Проверьте:
- Запущен ли PHP-FPM или приложение
- Правильный ли порт или сокет в
fastcgi_pass/proxy_pass
404 Not Found
Файл не найден. Проверьте:
- Правильный ли
root - Существует ли файл по указанному пути
- Права доступа к файлам
403 Forbidden
Нет прав доступа. Проверьте:
- Права на файлы (755 для директорий, 644 для файлов)
- Права на чтение для пользователя nginx
- Наличие
indexфайла
Порт 80 занят
# Найти процесс на порту 80
sudo ss -tlnp | grep :80
# Остановить Apache (если установлен)
sudo systemctl stop apache2
Заключение
Nginx — мощный и гибкий веб-сервер, который подходит для большинства задач: от раздачи статики до сложных прокси-конфигураций. Освоив базовые концепции из этого руководства, вы сможете настроить Nginx для вашего проекта.
Читайте также:
Добавить комментарий