Вы подняли VPS. Теперь на нём нужно ужиться десятку проектов: лендинг, блог, бот, API. Не платить за десять серверов и не превратить один в кашу — как раз работа nginx. Ниже — что это, зачем и как довести до боевого состояния по шагам. С готовыми командами, без воды и героизма.
Продолжение гайда про VPS в России. Берёте первый сервер или наводите порядок в нескольких — читать сверху вниз.
У сервера один IP-адрес и два веб-порта на весь мир: 80 (http) и 443 (https). А сайтов — много. Нельзя повесить десять приложений на один порт напрямую. Нужен один привратник, который встанет на 80/443 и по адресу в запросе решит, кому его отдать. Этот привратник — nginx.
Разместить много независимых сайтов на одном VPS — дёшево, изолированно, с HTTPS и без ручного хаоса при каждом новом проекте.
nginx как reverse proxy: единая точка входа на 80/443, маршрутизация по домену, TLS, сжатие, лимиты и логи в одном месте.
Новый сайт = один конфиг + симлинк + reload. 30 секунд вместо нового сервера. Приложения спрятаны на localhost.
Браузер в каждом запросе пишет, на какой домен он пришёл:Host: shop.ru. nginx читает эту строку, находит подходящий server-блок и проксирует запрос в нужное приложение. Один порт снаружи — много сайтов внутри. Именно это вы и видели в ролике выше.
Все домены ведут DNS-записями на один IP. Запросы на shop.ru, blog.ru, api.ru стучатся в один и тот же nginx.
Сопоставляет домен из запроса с server_name в конфигах. Нашёл совпадение — выбрал нужный server-блок.
Пробрасывает запрос на localhost-порт нужного приложения, добавляет заголовки и возвращает ответ клиенту.
Приложения слушают 127.0.0.1 — их из интернета не видно вообще. Единственная дверь наружу — nginx на 80/443. Это и удобно (одна точка для TLS и логов), и безопасно (поверхность атаки — один проверенный сервис).
Минимальный рабочий конфиг для одного сайта. Скопируйте, поменяйте домен и порт — и так на каждый проект. Вся «магия» — три строки:server_name,location / иproxy_pass.
# /etc/nginx/sites-available/shop.ruserver { listen 80; server_name shop.ru www.shop.ru; # Кто пришёл по shop.ru — уходит в это приложение. location / { proxy_pass http://127.0.0.1:3001; 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; } client_max_body_size 25m;}server_nameпо какому домену срабатывает этот блок. Это и есть «маршрут».
proxy_passкуда передать запрос — порт вашего приложения на localhost.
proxy_set_headerдонести до приложения реальный домен, IP клиента и протокол. Без них приложение думает, что все ходят с 127.0.0.1.
client_max_body_sizeпотолок размера загрузки. По умолчанию 1 МБ — формы с файлами ловят «413», пока не поднимете.
# Кладём конфиг и включаем сайт симлинком$ sudo ln -s /etc/nginx/sites-available/shop.ru /etc/nginx/sites-enabled/$ sudo nginx -t # проверка синтаксиса — НИКОГДА не пропускайте$ sudo systemctl reload nginx # без сброса соединенийПаттерн: конфиги лежат в sites-available/, а включаются симлинком в sites-enabled/. Выключить сайт = удалить симлинк, файл остаётся. nginx -t перед каждым reload — закон.
Let's Encrypt выдаёт сертификаты бесплатно, certbot делает всю рутину: получает, прописывает в nginx, включает редирект с http на https и заводит автопродление. Команда — одна. Дальше забываете.
# Бесплатный HTTPS на все домены сразу, с автопродлением$ sudo apt install certbot python3-certbot-nginx$ sudo certbot --nginx -d shop.ru -d www.shop.ru -d blog.ru -d api.ru$ sudo certbot renew --dry-run # репетиция автопродления# Firewall: наружу только SSH и веб. Порты приложений (3001/8080/9000) закрыты.$ sudo ufw allow OpenSSH$ sudo ufw allow 'Nginx Full' # 80 + 443$ sudo ufw enableБез firewall ваши приложения на 3001/8080/9000 могут оказаться открыты из интернета в обход nginx — со всеми его TLS и лимитами насмарку. Закрыли всё, кроме SSH и веба, — и весь трафик гарантированно идёт через привратника.
Опечатка в конфиге роняет ВЕСЬ nginx — лягут все сайты разом, не только новый. Проверка синтаксиса перед каждым reload — рефлекс.
nginx работает, а приложение за ним — нет (упало или слушает другой порт). 502 = «я-то жив, а апстрим молчит». Смотрите, поднят ли процесс и тот ли порт в proxy_pass.
Без proxy_set_header приложение видит всех как 127.0.0.1: ломается геолокация, антифрод, лимиты. Пробрасывайте X-Real-IP и X-Forwarded-For.
client_max_body_size по умолчанию ~1 МБ. Аватарки и PDF режутся молча. Поднимите лимит и в nginx, и в самом приложении.
Выдали руками и забыли про автопродление — через 90 дней сайт краснеет. Проверяйте certbot renew --dry-run, держите таймер живым.
Порт 3001 виден из интернета — кто-то ходит мимо TLS и лимитов. Закройте всё, кроме 80/443/SSH, через ufw.
Теперь добавить сайт — это конфиг, симлинк и reload. Хотите так же разложить по полочкам работу с ИИ-агентами? Рядом — каталог практик agentic coding: Plan Mode, AGENTS.md, sandbox, MCP — такие же разборы «зачем и как».
Заметки. Команды даны для Ubuntu/Debian (apt, ufw, systemd). Домены shop.ru / blog.ru / api.ru и порты 3001/8080/9000 — иллюстративные, подставьте свои. Принцип «один nginx — пачка апстримов» одинаков и для голых процессов, и для Docker-контейнеров: меняется только адрес вproxy_pass.