nginx — веб-сервер и обратный прокси
шпаргалка · Ubuntu 24.04 · nginx 1.24 https://lab.dimsanych.ru/ru/wiki/nginx/Шпаргалка
-
sudo nginx -tпроверить конфиг (только с sudo) -
sudo systemctl reload nginxприменить без обрыва соединений -
sudo nginx -T | grep -n server_nameкакие сайты видит nginx -
ls -l /etc/nginx/sites-enabled/включённые сайты -
curl -i -H 'Host: docs.lab.test' http://127.0.0.1/кто ответит -
sudo tail -n 5 /var/log/nginx/error.logпочему 404, 403, 502 -
sudo tail -n 5 /var/log/nginx/access.logчто спрашивали и код -
sudo ss -tlnp | grep nginxна каких портах слушает
Конфигурация
Раскладка Debian и Ubuntu:
/etc/nginx/nginx.conf— общие настройки, внизуincludeсайтов;/etc/nginx/sites-available/— файлы сайтов;/etc/nginx/sites-enabled/— ссылки на включённые сайты; nginx читает только их;/var/log/nginx/access.logиerror.log— журналы.
Включить сайт
Файл в sites-available без ссылки в sites-enabled nginx не видит. Выключить
сайт — удалить ссылку, файл остаётся.
nginx -t проверяет весь конфиг и называет файл и строку ошибки. reload
перечитывает конфиг без обрыва соединений; с ошибкой в конфиге nginx оставляет
старый. Команда systemctl reload возвращается сразу, а новые рабочие процессы
берут соединения чуть позже: curl в той же строке может увидеть старое.
Журналы
access.log — строка на каждый запрос, error.log — почему запрос не удался
и что сломалось при старте. Формат access.log по умолчанию — combined:
По полям: $remote_addr (адрес клиента), -, $remote_user,
[$time_local], "$request" (метод, путь, версия), $status (код),
$body_bytes_sent (размер тела), "$http_referer", "$http_user_agent" — в
примере user-agent "curl/8.5.0" не поместился. Свой формат задаёт
log_format — в файле сайта вне блока server:
$request_time — сколько секунд nginx обрабатывал запрос. Файлы с .1 и
.2.gz рядом с журналом — прошлые, их по расписанию отодвигает и сжимает
logrotate (/etc/logrotate.d/nginx).
Прокси: путь и заголовки
Есть ли URI после адреса в proxy_pass, решает, какой путь получит
приложение:
location /api/ и proxy_pass |
Запрос /api/x уходит как |
|---|---|
http://127.0.0.1:3003 |
/api/x — путь без изменений |
http://127.0.0.1:3003/ |
/x — /api/ заменено на / |
По умолчанию приложение видит Host: 127.0.0.1:3003 — адрес из proxy_pass.
Имя сайта и адрес клиента передают заголовками:
HTTPS и перенаправление с HTTP
ssl_certificate — файл цепочки: сначала
сертификат сайта, за ним промежуточный. $request_uri — путь вместе с
запросом после ?: http://shop.lab.test/x?y=1 уводит на
https://shop.lab.test/x?y=1. Сертификаты и их проверка — openssl-tls.