Skip to content

📄 Nginx

1. Описание

Nginx (произносится как "engine-x") — это высокопроизводительный веб-сервер и обратный прокси-сервер, разработанный с акцентом на стабильность, гибкость и низкое использование ресурсов. Он часто используется для обслуживания сайтов, раздачи статических файлов, организации reverse proxy для приложений (Node.js, Python, Java и т. д.), SSL/TLS, HTTP/2, балансировки нагрузки и других задач.


2. Установка Nginx

2.1 Ubuntu / Debian

sudo apt update
sudo apt install nginx -y

2.2 Проверка версии

nginx -v

2.3 Управление сервисом

sudo systemctl status nginx
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx   # после изменений конфига

3. Структура директорий Nginx

Путь Назначение
/etc/nginx Основная директория конфигурации
/etc/nginx/nginx.conf Главный конфигурационный файл
/etc/nginx/sites-available Доступные виртуальные хосты
/etc/nginx/sites-enabled Активированные виртуальные хосты
/etc/nginx/conf.d Дополнительные конфиги
/var/www/html Корневая папка сайта по умолчанию
/var/log/nginx/access.log Лог запросов
/var/log/nginx/error.log Лог ошибок

4. Базовая конфигурация

4.1 Пример минимальной конфигурации сайта

Создайте файл:

sudo nano /etc/nginx/sites-available/example.com

Пример содержимого:

server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        root /var/www/example.com;
        index index.html;
        try_files $uri $uri/ =404;
    }
}

Активируйте сайт:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

5. Полезные примеры конфигураций

5.1 Reverse Proxy

Для передачи запросов на backend-приложение (например, Node.js на порту 3000):

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;
}

5.2 Перенаправление на HTTPS

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

5.3 Поддержка SSL/TLS с Let's Encrypt

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;

    location / {
        root /var/www/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

5.4 Кэширование

location ~ \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

6. Получение сертификата Let’s Encrypt

6.1 Установка Certbot

sudo apt install certbot python3-certbot-nginx -y

6.2 Получение сертификата

sudo certbot --nginx -d example.com -d www.example.com

Certbot автоматически обновит ваш Nginx-конфиг и настроит автоматическое обновление сертификатов.

6.3 Проверка автообновления

sudo systemctl status certbot.timer

7. Безопасность

7.1 Отключение баннера сервера

Добавьте в конфиг:

server_tokens off;

7.2 Защита от сканирования

if ($http_user_agent ~* (nmap|masscan|sqlmap|nessus)) {
    return 403;
}

7.3 Ограничение методов запроса

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 405;
}

8. Логирование и диагностика

8.1 Логи

  • Access log: /var/log/nginx/access.log
  • Error log: /var/log/nginx/error.log

8.2 Анализ логов

tail -f /var/log/nginx/access.log

9. Виртуальные хосты

Вы можете настроить несколько доменов на одном сервере:

server {
    listen 80;
    server_name site1.com;
    ...
}

server {
    listen 80;
    server_name site2.org;
    ...
}

10. Команды управления

Команда Описание
nginx -t Проверка конфигурации
systemctl reload nginx Перезагрузка без остановки
systemctl restart nginx Полный перезапуск
journalctl -u nginx Посмотреть системные логи
nginx -s reload Ручная перезагрузка

11. Производительность и оптимизация

11.1 Gzip сжатие

gzip on;
gzip_types text/plain application/xml text/css application/javascript;
gzip_min_length 1024;

11.2 Использование keepalive

upstream backend {
    server 127.0.0.1:3000;
    keepalive 32;
}

11.3 Буферизация

client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 20M;
large_client_header_buffers 2 1k;

📎 Приложения