Раскладка Debian и Ubuntu:
/etc/nginx/nginx.conf — общие настройки, внизу include сайтов;
/etc/nginx/sites-available/ — файлы сайтов;
/etc/nginx/sites-enabled/ — ссылки на включённые сайты; nginx читает только
их;
/var/log/nginx/access.log и error.log — журналы.
Включить сайт
sudo ln -s /etc/nginx/sites-available/docs /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Файл в sites-available без ссылки в sites-enabled nginx не видит. Выключить
сайт — удалить ссылку, файл остаётся.
nginx -t проверяет весь конфиг и называет файл и строку ошибки. reload
перечитывает конфиг без обрыва соединений; с ошибкой в конфиге nginx оставляет
старый. Команда systemctl reload возвращается сразу, а новые рабочие процессы
берут соединения чуть позже: curl в той же строке может увидеть старое.
Журналы
access.log — строка на каждый запрос, error.log — почему запрос не удался
и что сломалось при старте. Формат access.log по умолчанию — combined:
127.0.0.1 - - [20/Oct/2026:10:03:58 +0000] "POST / HTTP/1.1" 405 166 "-"
По полям: $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:
log_format timed '$remote_addr [$time_local] "$request" '
'$status $body_bytes_sent $request_time';
access_log /var/log/nginx/app.log timed;
$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.
Имя сайта и адрес клиента передают заголовками:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
HTTPS и перенаправление с HTTP
server {
listen 443 ssl;
server_name shop.lab.test;
ssl_certificate /etc/nginx/tls/fullchain.pem;
ssl_certificate_key /etc/nginx/tls/shop.key;
root /var/www/shop;
}
server {
listen 80;
server_name shop.lab.test;
return 301 https://$host$request_uri;
}
ssl_certificate — файл цепочки: сначала
сертификат сайта, за ним промежуточный. $request_uri — путь вместе с
запросом после ?: http://shop.lab.test/x?y=1 уводит на
https://shop.lab.test/x?y=1. Сертификаты и их проверка — openssl-tls.