Зачем он нужен
Ваше приложение умеет отвечать на запросы. Возникает вопрос: зачем ставить впереди ещё что-то?
Причин несколько:
- Защищённое соединение. Удобнее настроить в одном месте, чем в каждом приложении.
- Отдача файлов. Картинки и стили веб-сервер отдаёт в разы эффективнее приложения.
- Несколько проектов на одной машине. Он распределяет запросы по доменам.
- Ограничение нагрузки и защита от простейших атак.
- Приложение не смотрит в интернет напрямую. Это безопаснее.
Как устроена настройка
Файл настройки состоит из блоков. Основной — описание сайта: какой домен обслуживаем и что делать с запросами.
Минимальный вариант для приложения, которое слушает внутренний порт:
server {
listen 80;
server_name example.ru;
location / {
proxy_pass http://127.0.0.1:8000;
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;
}
}
Разберём: слушаем обычный веб-порт, обслуживаем указанный домен, все запросы передаём приложению на внутренний порт.
Строки с заголовками важны: без них приложение не узнает настоящий адрес посетителя и решит, что все запросы идут с самого сервера.
Отдача файлов напрямую
Картинки и прочую статику лучше отдавать без участия приложения:
location /static/ {
alias /var/www/myapp/static/;
expires 30d;
}
Второй строкой говорим браузеру кэшировать на месяц. Заметно ускоряет повторные заходы.
Полезные команды
Проверить настройку перед применением:
nginx -t
Всегда делайте это перед перезагрузкой. Ошибка в настройке при перезапуске уронит сайт, а проверка ловит её заранее.
Применить настройку без разрыва соединений:
systemctl reload nginx
Посмотреть журналы:
tail -f /var/log/nginx/error.log
Типичные ошибки
Забыли передать заголовки. Приложение видит все запросы как локальные, ломается определение адреса и защищённого соединения.
Перезапустили без проверки. Опечатка в файле — сайт лежит.
Указали неверный путь к файлам. Частая причина того, что стили не подгружаются: путь в настройке не совпадает с реальным.
Не увеличили размер загружаемых файлов. По умолчанию стоит небольшой предел, и загрузка картинки падает с непонятной ошибкой. Настраивается отдельным параметром.
Настроили защищённое соединение, но не перенаправление. Сайт открывается по обоим адресам, и посетители попадают на незащищённый.
Что знать про порядок обработки
Правила выбора блока обработки неочевидны: точное совпадение адреса важнее, чем совпадение по началу строки, а оно, в свою очередь, взаимодействует с правилами по образцу.
Практический вывод: если правило не срабатывает, дело чаще всего в том, что раньше сработало другое, более приоритетное. Смотреть надо весь файл, а не только своё правило.
Нужно ли это новичку
Не в первую очередь. Но если вы разворачиваете проект на своём сервере, без этого не обойтись — а сам факт, что вы настраивали веб-сервер руками, на собеседовании отличает вас от тех, кто нажимал кнопки в панели.
Хватит читать — пора делать
На CohortX можно найти команду под пет-проект и получить тот самый опыт, о котором спрашивают на собеседовании.
Похожие статьи
- Nginx for beginners: what you need to knowWhy a web server sits in front of your application, a minimal configuration, serving files, and common mistakes.
- A domain and a secure connection for your projectHow to buy and configure a domain, get a free certificate, and why a project without HTTPS looks unserious.
- Домен и защищённое соединение для проектаКак купить и настроить домен, получить бесплатный сертификат и почему без защищённого соединения проект выглядит несерьёзно.