1. 1
  2. 2
  3. 3
  4. 4

# конспект · шаг 4 из 4

Конспект: синтаксис и контексты

выжимка - её можно унести в заметки

Язык конфига состоит всего из двух конструкций - и из правила о том, где каждая директива вообще разрешена.

Две конструкции

worker_processes auto;          # простая директива: имя, аргументы, ;

server {                        # блочная: открывает контекст
    listen 80;
    server_name shop.local;
}

Аргументы читаются подряд, пока не встретится ; или {. Из этой одной строчки следует всё остальное поведение языка, включая сообщения об ошибках.

Контексты

main (весь файл)
├── events
├── http
│   ├── server
│   │   └── location  →  вложенный location
│   └── upstream
└── stream

Каждая директива разрешена только в своих контекстах - это первое, что смотрят в документации (строка Context:). Правило выбора: ставь директиву в самый узкий контекст, где она разрешена.

Мелочи, которые экономят время

Что Как
комментарий # до конца строки; внутри кавычек - обычный символ
кавычки нужны при пробеле, ;, { или # внутри аргумента
\ в кавычках защищает кавычку, но не защищает $
размеры k и m везде; g понимают не все директивы
время ms s m h d, складываются: 1h 30m
буква m минуты во времени и мегабайты в размере - смысл задаёт директива

Четыре сообщения об одной пропущенной ;

Что идёт следом Что скажет nginx -t
блок location { directive "root" is not terminated by ";"
закрывающая } unexpected "}"
директива со строгим числом аргументов invalid number of arguments in "gzip"
директива-список (server_name, index) ничего, конфиг признан верным

Во всех четырёх случаях номер строки указывает на место, где разбор остановился, а не где сделана ошибка.

Ловушки джокера

  • Номер строки в ошибке - не место ошибки. Nginx называет строку, на которой понял, что что-то не так. Смотри выше.
  • Конфиг прошёл проверку, а сайт отдаёт 404 на всё. Директива-список съела соседнюю строку. Быстрая проверка - nginx -T | grep server_name.
  • $1-$9 в значении заголовка молча пустые. Это ссылки на скобочные группы регулярки, а не текст. Знак доллара в значении заводится через geo $dollar { default "$"; }.
  • nginx -t печатает syntax is ok и тут же падает. Синтаксис и смысл проверяются разными этапами: читать надо последнюю строку вывода.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.