У меня есть несколько виртуальных хостов, управляемых Nginx.
Я получил тикет, в котором меня просят проверить значение заголовка запроса для некоторых виртуальных хостов и отказаться от обслуживания запросов, если заголовок отсутствует или недействителен. Вот что я добавил к каждому из виртуальных хостов:
location / {
if ($http_my_request_header_name != "<mytoken>") {
return 406;
}
}
И это работает, как и ожидалось. Однако я намерен сделать это решение более элегантным и создать новый файл конфигурации с именем common.conf и вместо вставки одного и того же кода во все виртуальные хосты включить этот общий файл как:
include conf.d/common.conf;
Тем не менее, все мои попытки потерпели неудачу:
Вставьте условное выражение if и оставьте директиву location в виртуальном хосте, который будет include файлом. Ошибка, которую я получил, сообщала мне в журналах, что у меня не может быть if в файле.
Я переместил весь
location / {
if ($http_my_request_header_name != "<mytoken>") {
return 406;
}
}
в общий файл и заменил его на include в конфигах виртуального хоста. Ошибка, которую я получил, говорила мне, что мне нужно обернуть директиву server вокруг директивы location.
Я обернул директиву сервера вокруг директивы моего местоположения, но это также привело к ошибке. У меня больше нет ошибки, потому что с тех пор я уничтожил сервер и воссоздал его. Но если нужно точное сообщение об ошибке, дайте мне знать, я воспроизведу его и поделюсь здесь.
Как я могу создать общий файл конфигурации, который будет проверять заголовок запроса и включать его в несколько конфигураций виртуального хоста?
РЕДАКТИРОВАТЬ
Ввиду ответа Рахула Шармы я предоставляю дополнительную информацию о текущей попытке. Вот как сейчас выглядит основная конфа:
server {
...
include conf.d/common.conf;
...
}
а include является прямым дочерним элементом директивы server, то есть вокруг строки include. Earlier, instead of the include` больше ничего не оборачивается, основная конфа имела свое содержимое, например
server {
...
location / {
if ($http_my_request_header_name != "<mytoken>") {
return 406;
}
}
...
}
и это сработало. Я буквально переместил location / в файл common.conf и заменил его на include. Итак, Nginx по какой-то причине не любит другой мой файл. Вот почему это было странно для меня, и именно это заставило меня задать этот вопрос.
@RahulSharma снова попробовал вторую попытку, вот что я вижу в журналах ошибок: 2022/10/05 16:00:31 [emerg] 1843#1843: "location" directive is not allowed here in /etc/nginx/conf.d/common.conf:1. По сути, ему не нравится, что в моем common.conf есть директива location, и, вероятно, что-то должно быть обернуто вокруг нее. Но у меня очень ограниченные знания о синтаксисе nginx, и я не знаю, чего не хватает.



Я предполагаю, что содержимое вашего файла conf.d/common.conf:
location / {
if ($http_my_request_header_name != "<mytoken>") {
return 406;
}
}
Ошибка
Директива location не разрешена здесь, в /etc/nginx/conf.d/common.conf.
это потому, что, вероятно, ваше утверждение include внутри основного nginx.conf неуместно. Строка include conf.d/common.conf; должна быть внутри блока server, чтобы это работало так:
server {
...
...
include conf.d/common.conf;
...
...
}
К сожалению, это не проблема. Я отредактировал свой вопрос с дополнительной информацией, показав, что я переместил этот код из основной конфигурации и заменил его включением, и именно тогда это начало не работать.
Это странно. Можете ли вы показать все содержимое вашего файла nginx.conf?
К сожалению, это конфиденциально. Но если бы был рабочий пример делегирования location в другой файл и включения его в конфиг, это, конечно, был бы правильный ответ. Итак, если вы решите проигнорировать мой пример и указать мне на доказательство концепции этой работы, то это будет правильный ответ. Ваш текущий ответ очень логичен, но решает проблему, отличную от моей.
Оказалось, что в nginx.conf была строчка
include /etc/nginx/conf.d/*.conf;
который включал common.conf в другом месте, о котором я не знал, и во втором месте код внутри common.conf был недействителен.
Ваша вторая попытка должна сработать. Если вы получаете сообщение об ошибке, значит, что-то еще происходит с настройками. Вставьте точную ошибку, с которой вы столкнулись, вместе с содержимым файлов
nginx.confиcommon.conf.