Представь, что твой веб-сервер — это дирижёр оркестра. Он принимает запросы от зрителей (пользователей), решает, какому музыканту (приложению) их передать, и управляет всем представлением. nginx — один из лучших "дирижёров" в мире веба. Давай разберём, как его правильно настроить под любые задачи: от простого сайта до стримингового медиасервера.
1. Установка и базовая настройка nginx
Первым делом нужно установить nginx на твою систему. Процесс немного отличается в зависимости от дистрибутива Linux.
Установка на Ubuntu/Debian
sudo apt update
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
Установка на CentOS/RHEL
sudo yum install epel-release -y
sudo yum install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
Важно: После установки открой браузер и перейди на http://IP_ТВОЕГО_СЕРВЕРА. Если видишь приветственную страницу nginx — установка прошла успешно!
Структура конфигурационных файлов
Давай разберемся, где что лежит. Это основа для любой настройки сервера nginx.
/etc/nginx/nginx.conf— главный конфигурационный файл/etc/nginx/sites-available/— доступные конфиги сайтов/etc/nginx/sites-enabled/— активные конфиги сайтов (обычно симлинки)/var/log/nginx/— логи доступа и ошибок/usr/share/nginx/html/— корневая директория по умолчанию
2. Базовая конфигурация виртуального хоста
Создадим наш первый виртуальный хост для сайта example.com. Это основа nginx linux настройки.
# /etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
# Логирование
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
}
Активируем конфиг и проверим синтаксис:
# Создаем симлинк в sites-enabled
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# Проверяем синтаксис конфига
sudo nginx -t
# Если всё OK, перезагружаем nginx
sudo systemctl reload nginx
Опасно: Всегда выполняй nginx -t перед перезагрузкой! Это предотвратит падение сервера из-за ошибки в конфиге.
3. nginx SSL настройка: Защищаем соединение
В современном вебе HTTPS — это must have. Давай настроим SSL с помощью бесплатных сертификатов Let's Encrypt.
Установка Certbot (Let's Encrypt)
# Для Ubuntu/Debian
sudo apt install certbot python3-certbot-nginx -y
# Для CentOS/RHEL
sudo yum install certbot python3-certbot-nginx -y
Получение и настройка SSL сертификата
# Автоматическое получение и настройка SSL
sudo certbot --nginx -d example.com -d www.example.com
Certbot автоматически обновит твой конфиг. Вот как выглядит результат:
server {
server_name example.com www.example.com;
# Редирект с HTTP на HTTPS
listen 80;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
# Пути к SSL сертификатам
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Современные SSL настройки
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers off;
root /var/www/example.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
4. nginx docker настройка: Контейнеризация
Работа с nginx в Docker — это чистота и переносимость. Давай создадим простую связку.
Docker Compose конфигурация
# docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx:alpine
container_name: web_server
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./sites:/etc/nginx/sites-enabled:ro
- ./html:/usr/share/nginx/html:ro
- ./ssl:/etc/nginx/ssl:ro
- ./logs:/var/log/nginx
restart: unless-stopped
networks:
- webnet
app:
image: your_application:latest
container_name: backend_app
expose:
- "3000"
networks:
- webnet
networks:
webnet:
driver: bridge
nginx конфиг для проксирования к приложению
# nginx.conf для Docker
events {
worker_connections 1024;
}
http {
upstream backend {
server app:3000;
}
server {
listen 80;
location / {
proxy_pass http://backend;
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;
}
}
}
5. nginx rtmp настройка: Стриминг медиа
Хочешь создать свой Twitch или YouTube? RTMP модуль для nginx позволяет организовать видеостриминг.
Сборка nginx с RTMP модулем
# Установка зависимостей
sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev -y
# Скачивание исходников
wget https://nginx.org/download/nginx-1.24.0.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.2.tar.gz
# Распаковка
tar -zxvf nginx-1.24.0.tar.gz
tar -zxvf v1.2.2.tar.gz
# Конфигурация и сборка
cd nginx-1.24.0
./configure --add-module=../nginx-rtmp-module-1.2.2 \
--with-http_ssl_module \
--with-http_v2_module
make
sudo make install
Конфигурация RTMP сервера
# /usr/local/nginx/conf/nginx.conf
rtmp {
server {
listen 1935; # Стандартный порт RTMP
chunk_size 4096;
application live {
live on;
record off;
# Транскодирование для разных качеств
exec ffmpeg -i rtmp://localhost/live/$name \
-c:v libx264 -preset veryfast -b:v 2500k -maxrate 2500k \
-bufsize 5000k -vf scale=1280:720 -g 60 -c:a aac \
-b:a 128k -f flv rtmp://localhost/hls/$name_720p;
# HLS выход для веб-плееров
hls on;
hls_path /tmp/hls;
hls_fragment 3;
hls_playlist_length 60;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
hls_nested on;
}
}
}
# HTTP сервер для раздачи HLS
http {
server {
listen 80;
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
# Статистика
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /usr/local/nginx/conf;
}
}
}
6. Оптимизация производительности
Правильная настройка сервера nginx включает оптимизацию под нагрузку. Вот ключевые параметры:
| Параметр | Значение | Описание |
|---|---|---|
| worker_processes | auto | Количество worker процессов (обычно равно количеству CPU ядер) |
| worker_connections | 1024 | Максимальное количество соединений на worker |
| keepalive_timeout | 65 | Таймаут keep-alive соединений в секундах |
| gzip on | Включено | Сжатие ответов для экономии трафика |
| client_max_body_size | 100M | Максимальный размер тела запроса |
# Оптимизированный nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
# Базовые настройки
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# Кэширование файловых дескрипторов
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# Gzip сжатие
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript;
# Лимиты
client_max_body_size 100M;
client_body_timeout 10;
reset_timedout_connection on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Подключаем конфиги сайтов
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Часто задаваемые вопросы (FAQ)
Как проверить синтаксис конфигурации nginx?
Используй команду sudo nginx -t. Она проверит все конфигурационные файлы на ошибки синтаксиса и покажет, где именно проблема, если она есть.
Как перезагрузить конфигурацию без простоя?
Команда sudo nginx -s reload или sudo systemctl reload nginx перезагрузит конфигурацию без разрыва существующих соединений.
Где смотреть логи ошибок nginx?
Основные логи находятся в /var/log/nginx/error.log. Логи доступа — в /var/log/nginx/access.log. В конфиге можно настроить отдельные логи для каждого виртуального хоста.
Как настроить nginx для работы с PHP (PHP-FPM)?
Добавь в location блок конфигурации:
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
И подключи fastcgi параметры: include fastcgi_params;
Можно ли использовать nginx как балансировщик нагрузки?
Да, nginx отлично справляется с ролью балансировщика. Используй директиву upstream для определения бэкенд-серверов и методы балансировки: round-robin, least_conn, ip_hash.
Заключение
Мы прошли полный путь nginx настройки — от базовой установки до продвинутых конфигураций. Ты теперь умеешь:
- Настраивать виртуальные хосты для сайтов
- Защищать соединения с помощью SSL/TLS
- Работать с nginx в Docker-контейнерах
- Организовывать видеостриминг через RTMP
- Оптимизировать производительность под высокие нагрузки
Помни главное правило: всегда тестируй конфигурацию командой nginx -t перед применением изменений. Начинай с простых конфигов, постепенно добавляя сложность. Nginx — мощный инструмент, который будет расти вместе с твоими проектами.