Общая теория Nginx
Разберём общую теорию Nginx, как он работает, чтобы потом проще понимать Yunohost и любую веб-инфраструктуру. Я постараюсь максимально подробно, с примерами и пояснениями.
1️⃣ Архитектура Nginx
Nginx — это высокопроизводительный веб-сервер и reverse proxy, который может работать с HTTP, HTTPS, TCP и UDP потоками.
Основные компоненты
Master process (главный процесс)
Запускается от root (для открытия портов <1024, например 80 и 443).
Читает конфигурацию (nginx.conf) и запускает worker-процессы.
Управляет перезапуском, логами и перезагрузкой конфигурации.
PID хранится в /run/nginx.pid.
Worker processes (рабочие процессы)
Основная работа: обработка HTTP-запросов, proxy, отдача файлов.
Запускаются от обычного пользователя (например www-data).
Каждый worker может обрабатывать множество соединений одновременно через асинхронный event loop (epoll/kqueue).
Event loop
Внутри worker процессов.
Асинхронно обрабатывает сокеты, читает/пишет данные без блокировки.
Позволяет одному worker’у обрабатывать тысячи соединений.
2️⃣ Работа с доменами и виртуальными хостами
Server blocks (виртуальные хосты)
Один Nginx сервер может обслуживать несколько доменов на одном IP через server { ... } блоки.
Пример:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Объяснение:
listen 80; — порт, на котором сервер слушает HTTP-запросы.
server_name — имена доменов, которые этот блок обслуживает.
root — корневая папка для файлов сайта.
location / — обработка запросов к URL.
try_files $uri $uri/ =404; — ищет файл, если нет — 404.
Yunohost делает примерно то же самое, но автоматически создаёт отдельные блоки для каждого домена и приложений.
Server_name vs default_server
default_server — блок, который обслуживает все запросы, если домен не совпал ни с одним server_name.
В Yunohost главный домен admin обычно ставится в default_server.
3️⃣ Порты и протоколы
Nginx может слушать любые порты.
HTTP: 80
HTTPS: 443
TCP/UDP: любые, через stream {} блок
Можно слушать локально (127.0.0.1:port) или публично (0.0.0.0:port).
Пример proxy_pass:
server {
listen 443 ssl;
server_name myapp.example.com;
ssl_certificate /etc/letsencrypt/live/myapp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/myapp/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3025;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Nginx слушает HTTPS на 443.
Проксирует на backend (например, Node.js или Yunohost приложение) по 127.0.0.1:3025.
4️⃣ Взаимодействие с процессами и ресурсами
Каждый worker:
Обрабатывает много соединений одновременно.
Работает асинхронно, не создавая отдельный поток на каждого клиента.
worker_connections + worker_processes = максимальное количество соединений.
Пример: auto worker_processes + worker_connections 768 → несколько тысяч одновременных клиентов.
5️⃣ Конфигурация include
Nginx читает главный конфиг (nginx.conf), а затем подключает include файлы:
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
Это позволяет:
Разделять конфиги на логические блоки
Yunohost держит свои домены в conf.d/
Другие сайты или Jitsi в sites-enabled/
6️⃣ SSL и HTTPS
Настраивается в server block:
listen 443 ssl;
ssl_certificate /path/fullchain.pem;
ssl_certificate_key /path/privkey.pem;
Nginx может автоматически использовать LetsEncrypt через Yunohost или certbot.
Можно указать протоколы (ssl_protocols TLSv1.2 TLSv1.3;) и предпочтительные шифры.
7️⃣ Proxy и backend
Nginx может работать как reverse proxy:
location / {
proxy_pass http://127.0.0.1:3025;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Прокси позволяет:
Скрывать порт backend приложения
Объединять несколько сайтов на одном IP
Делать SSL-termination (TLS на Nginx, а backend по HTTP)
8️⃣ Логирование и gzip
access_log и error_log — логируют запросы и ошибки.
gzip on; — сжатие текста (HTML, CSS, JS), ускоряет отдачу клиентам.
9️⃣ Потоковые (stream) возможности
Nginx умеет работать с TCP/UDP:
stream {
server {
listen 5222; # XMPP
proxy_pass 127.0.0.1:5222;
}
}
Полезно для Mailcow (SMTP, IMAP, POP3) или Jitsi Videobridge.
Ключевые выводы
Master + worker — асинхронная, масштабируемая архитектура.
Server blocks — виртуальные хосты для доменов, могут быть HTTP или HTTPS.
Include — позволяет организовать конфиги по каталогам (conf.d/, sites-enabled/).
Proxy_pass — объединяет внешние порты с внутренними сервисами.
SSL/TLS — делается на уровне server block, может быть централизованно через Yunohost.
Гибкость портов — Nginx может обслуживать HTTP, HTTPS, TCP, UDP.
Асинхронность — один worker обрабатывает тысячи соединений без блокировки.