# конспект · шаг 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и тут же падает. Синтаксис и смысл проверяются разными этапами: читать надо последнюю строку вывода.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий