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 для вашего проекта.

Читайте также:

Добавить комментарий

Разработка сайтов на Wordpress