Конфигурация nginx.conf
Уровни конфига
Конфиг Nginx — иерархический:
main (nginx.conf)
├── events
└── http
├── server (сайт)
│ └── location (путь)
├── server
└── server
Правило: настройки наследуются сверху вниз.
Три уровня настройки
main — глобальные. Работают везде.
server — для конкретного сайта. server_name example.com.
location — для конкретного URL. location /api { ... }.
Основной nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
# MIME-типы
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Оптимизация
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# Логи
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
# Gzip
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;
# Размеры
client_max_body_size 20M;
client_body_buffer_size 128k;
# SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# Подключение конфигов
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Разбор ключевых директив
server_tokens off; — скрывает версию Nginx в заголовках. Безопасность — не давать хакерам знать версию.
client_max_body_size 20M; — максимум размера загружаемого файла. По умолчанию 1 МБ — Laravel упадёт при загрузке аватарки. Обязательно увеличь.
gzip_types — что сжимать. HTML, CSS, JS, JSON — сжимать всегда. Картинки, видео — не сжимать, они уже сжаты.
ssl_protocols TLSv1.2 TLSv1.3; — только современные версии. TLSv1.0 и 1.1 устарели, их надо отключать.
ssl_prefer_server_ciphers on; — использовать серверные шифры, а не клиентские.
Что не сжимать
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml
application/rss+xml
application/atom+xml
image/svg+xml
font/woff
font/woff2;
Не включай в gzip_types:
- Картинки (
image/jpeg,image/png,image/webp) - Видео (
video/mp4) - Аудио
- Архивы (
application/zip,application/gzip)
Почему: они уже сжаты. Gzip только жрёт CPU впустую.
Таймауты
client_header_timeout 60s;
client_body_timeout 60s;
send_timeout 60s;
keepalive_timeout 65s;
keepalive_requests 100;
keepalive_timeout — сколько держать соединение открытым. Больше — быстрее для повторных запросов.
send_timeout — сколько ждать клиента при отправке.
Заголовки безопасности
Добавь в http или в server:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
Что дают:
X-Frame-Options— защита от clickjackingX-Content-Type-Options— защита от MIME-sniffingX-XSS-Protection— базовая защита от XSSReferrer-Policy— не палить URLPermissions-Policy— ограничить API браузера
Структура сайтов
Не пиши всё в nginx.conf. Раздели:
/etc/nginx/sites-available/
├── skills-dev.ru
├── api.skills-dev.ru
├── nobleweb.ru
└── catalan.life
Включение:
sudo ln -s /etc/nginx/sites-available/skills-dev.ru /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Отключение:
sudo rm /etc/nginx/sites-enabled/skills-dev.ru
sudo systemctl reload nginx
Проверка конфига
Всегда:
sudo nginx -t
С подробностями:
sudo nginx -T # вывести весь конфиг с include
Итог
Минимум для веба:
sendfile on,gzip onclient_max_body_size 20Mssl_protocols TLSv1.2 TLSv1.3server_tokens off- Заголовки безопасности
- Конфиги сайтов в отдельных файлах
Дальше — virtual hosts.