С чего начать Первые шаги трек · 15 ступеней
Linux Labs
К статье

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 — журналы.

Включить сайт

bash
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:

text
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:

nginx
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. Имя сайта и адрес клиента передают заголовками:

nginx
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

HTTPS и перенаправление с HTTP

nginx
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.

Загрузка…