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