# теория · шаг 2 из 4
Словарь: термины для тех, кто пришёл из Django или WordPress
Коротко
Урок-справочник: слова, которыми говорят про nginx, и таблицы перевода с Apache и Django. Разборов с числами тут нет и не нужно - это словарь, к которому возвращаются.
- nginx это веб-сервер, который умеет и отдавать файлы сам, и работать обратным прокси: клиент говорит с ним, а он ходит к приложению.
.htaccessв nginx НЕ существует: все правила в конфиге плюсreload.- Из Django переезжает главное: статику и медиа отдаёт nginx, а не Python.
- 502 значит «до приложения не достучались», 504 - «приложение не ответило вовремя», 500 - обычно ошибка внутри самого приложения.
Слова знакомы - листай до «Теперь сам» и проверь себя на чужом конфиге.
Половина трудностей с nginx - не в конфиге, а в словах. Человек пять лет делает сайты на WordPress или пишет на Django, всё работает, а в статьях про nginx с первой строки: «апстрим», «реверс-прокси», «терминация TLS», «воркер». Разберём эти слова один раз - дальше в курсе они будут встречаться как родные.
Что делает nginx, если объяснять на пальцах
Веб-сервер - программа, которая слушает порт и отвечает на HTTP-запросы. nginx умеет отвечать сам (отдать файл с диска) и умеет передавать запрос кому-то ещё.
Обратный прокси (reverse proxy) - это второе умение. «Прокси» - потому что посредник, «обратный» - потому что стоит не рядом с клиентом, а перед серверами. Клиент думает, что разговаривает с сайтом; на самом деле он разговаривает с nginx, а тот уже ходит к приложению.
Бэкенд (он же upstreamupstreamИменованный список адресов приложения. nginx выбирает из него сервер по заданному правилу и умеет исключать неотвечающие. Имя группы по умолчанию уходит бэкенду в заголовке Host., «апстрим») - то, к чему nginx ходит за ответом.
Для Django это gunicorn или uvicorn на порту 8000, для WordPress -
php-fpm, для Node - сам процесс приложения. В конфиге бэкенд появляется в
строке proxy_pass или в блоке upstream.
Терминация TLS - шифрование заканчивается на nginx. Снаружи https,
внутрь, к приложению, идёт обычный http по локальной сети. Сертификаты живут
у nginx, приложение о них не знает.
Если ты пришёл из WordPress и Apache
| Привычное в Apache | Как это называется в nginx |
|---|---|
VirtualHost |
блок server |
ServerName |
server_name |
DocumentRoot |
root |
.htaccess |
ничего: правила только в главном конфиге |
mod_rewrite, RewriteRule |
директива rewrite (раздел 13) |
Options Indexes |
autoindex on |
AllowOverride, Require ip |
allow и deny (раздел 12) |
mod_php (php внутри сервера) |
нет: PHP работает отдельным процессом php-fpm, nginx общается с ним по FastCGIРазбирается в разделе 7, глава «PHP и FastCGI»: Как nginx разговаривает с PHP - протоколу из пар «имя-значение», не по HTTP |
Главное отличие, из-за которого ломаются переносы сайтов: .htaccess в
nginx не существует. Нельзя положить файл в каталог и поменять поведение
сервера. Всё - в конфиге, и после правки нужен reload. Плюс к этому: правила
из .htaccess (например, «красивые ссылки» WordPress) переписываются одной
строкой try_files $uri $uri/ /index.php?$args; - и это лучше, потому что
nginx не перечитывает файлы на каждый запрос.
Если ты пришёл из Django
| Привычное в Django | Что с этим делает nginx |
|---|---|
runserver |
в проде не используется; запросы принимает nginx, приложение крутит gunicorn/uvicorn |
STATIC_ROOT + collectstatic |
этот каталог отдаёт nginx напрямую, минуя Python |
MEDIA_ROOT |
то же самое: файлы пользователей отдаёт nginx |
ALLOWED_HOSTS |
проверка имени домена; nginx делает похожее раньше - server_name |
SECURE_SSL_REDIRECT |
обычно переносят в nginx: return 301 https://...Разбирается в разделе 13, глава «return против rewrite»: return: коды, тела, редиректы - ответ-редирект без обращения к приложению |
X-Forwarded-For и SECURE_PROXY_SSL_HEADER |
эти заголовки ставит nginx, чтобы приложение видело реального клиента и знало про https (раздел 7) |
DEBUG = False и «пропала статика» |
классика: при DEBUG=False Django статику не отдаёт, это и есть работа nginx |
Кто уже видел gunicorn - у него та же схема, что у nginx: мастер-процесс и
воркеры. Разница в том, что воркер gunicorn на время запроса занят целиком, а
воркер nginx одновременно тянет тысячи соединений: он почти не считает, он
перекладывает байты.
Слова, которые встретятся в первых же разделах
Директива - строка конфига вида имя значение;. Всё в nginx - директивы.
Контекст (он же блок) - фигурные скобки, внутри которых директивы
действуют: http { server { location { … } } }. Вложенность важна: то, что
написано снаружи, обычно наследуется внутрь (раздел 2).
location - правило «какой кусок конфига применить к этому адресу». Не
путать с папкой на диске: location /images/ не обязан соответствовать
каталогу images.
Мастер и воркеры - один процесс-начальник (читает конфиг, открывает порты, следит) и несколько рабочих, которые обслуживают соединения.
reload - применение нового конфига без разрыва соединений. Не рестарт: старые запросы доживают на старом конфиге.
Статика - файлы, которые отдаются как есть: картинки, css, js, шрифты, pdf. Динамика - то, что приложение считает на каждый запрос.
Апстрим-таймаут, 502, 504 - словарь аварий: 502 обычно значит «до
приложения не достучались», 504 - «приложение не ответило вовремя». Ошибка
самого приложения при этом чаще выглядит как 500 (раздел 6).
TTFB - время до первого байта ответа. Именно его чаще всего улучшает кеширование и сжатие.
Как читать чужой конфиг, пока слов не хватает
Открывай не сверху вниз, а «кто ответит - что сделает»: сначала ищи
server_name и listen (какой сайт), потом нужный location (какое
правило), потом внутри него root или proxy_pass (файл с диска или поход к
приложению). Три взгляда - и смысл девяноста процентов конфигов ясен.
Теперь сам
Вот кусок чужого конфига. Назови своими словами, что делает каждая из четырёх строк, и скажи, какая из них означает поход к приложению, а какая - файл с диска.
server {
server_name shop.local;
root /var/www/shop;
location /static/ { expires 30d; }
location /api/ { proxy_pass http://app:8000; }
}
Ответ. server_name shop.local - имя сайта, по нему nginx выбирает этот
блок из нескольких (аналог ServerName в Apache и близкий родственник
ALLOWED_HOSTS в Django). root /var/www/shop - каталог на диске, от которого
считаются пути файлов (DocumentRoot). location /static/ с expires 30d -
это файл с диска плюс указание браузеру держать его месяц в кеше. location
/api/ с proxy_pass - единственная строка, означающая поход к приложению:
запрос уходит на app:8000, и что там внутри, nginx не знает. То есть три
строки из четырёх обходятся без бэкенда вовсе - ровно то соотношение, о
котором была первая глава.
Термины, которые в курсе будут дальше
Не заучивай - просто запомни, что они существуют, а разберём их по ходу:
- upstream-группа - несколько бэкендов под одним именем и правило, как между ними раскидывать запросы (раздел 8);
- буферизация - nginx забирает ответ приложения так быстро, как тот отдаёт, и дальше сам возится с медленным клиентом (раздел 7);
- keepalive - переиспользование установленного соединения вместо создания нового (разделы 7 и 8);
- SNISNIПоле в самом начале установки TLS, где клиент открытым текстом говорит, к какому имени идёт. Без него сервер не знал бы, какой сертификат показывать, когда на одном адресе много сайтов. - имя сайта, которое клиент сообщает до шифрования, чтобы сервер понял, какой сертификат предъявлять (раздел 9);
- ACME - протокол автоматического выпуска сертификатов, по нему работает Let's Encrypt (раздел 9);
- фазы обработки - последовательность этапов, через которые nginx проводит каждый запрос; на ней держится весь курс (раздел 13).
Главное
nginx - веб-сервер, который умеет и отдавать файлы сам, и работать обратным
прокси: клиент разговаривает с ним, а он ходит к приложению (gunicorn,
php-fpm, Node) и возвращает ответ. Из Apache переезжают так: VirtualHost →
server, DocumentRoot → root, RewriteRule → rewrite, а .htaccess
не существует вовсе - все правила в конфиге плюс reload. Из Django: статику и
медиа отдаёт nginx, а не Python, https и заголовки о клиенте - тоже его работа.
Директива, контекст, location, мастер и воркеры, статика и динамика, 502
против 504 - этих слов хватит, чтобы начать.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий