В строках ниже я мощь иметь файл конфигурации для конкретного сайта, который содержит дополнительные fastcgi_params уникальный для этого сайта. Если этот файл существует, я хочу его загрузить.
server {
listen 80 default;
server_name _;
root /path/www/$host;
# Pass PHP scripts to php-fastcgi listening on port 9000
location ~ \.php {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
if (-f /path/www/$host/nginx.conf) {
include /path/www/$host/nginx.conf;
}
}
}
Однако это не работает, и я получаю следующую ошибку:
nginx: [Emerg] директива include не разрешена здесь, в ...
Я подумал, что вместо того, чтобы проверять отдельно, я мог бы позволить включают проверьте для меня.
server {
listen 80 default;
server_name _;
root /path/www/$host;
# Pass PHP scripts to php-fastcgi listening on port 9000
location ~ \.php {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
include /path/www/$host/*.nginx;
}
}
Однако, похоже, это не работает.
Что ж, это старовато, но, тем не менее, я нашел обходной путь.
У меня есть настройка с vhosts, настроенными в этом стиле:
/etc/nginx/sites-enabled/site.com.conf
Вместо того, чтобы проверять, существует ли файл (что невозможно), я просто делаю:
include /etc/nginx/sites-customizations/site.com.*.conf
Таким образом, я могу просто создать файл в sites-customizations
-folder, который по моему соглашению называется так же, как основная конфигурация. В *
работает почти так же, как if, так как не ломается, если нет дополнительных файлов конфигурации. Если хотите, это также позволяет вам добавить несколько дополнительных конфигураций в отдельные файлы.
include
делает свое дело во время запуска сервера - переменные времени выполнения, такие как $host
не может быть использован и не может быть использован в if
контекст, как вы выяснили.
Вам нужно будет разделить server
блоки для разных хостов. Сожалею!
Я знаю, что это устарело, но решение может помочь кому-то, ищущему ответ, как я.
У меня была куча перенаправлений, которые мне нужно было включить только для определенного хоста, а пока include
не допускается в if
директиву, в итоге я добавил if
внутри файла, который я включал ...
Так что у меня есть include /etc/nginx/conf.d/redirects
и внутри этого файла у меня есть:
if ($host = "www.example.com") {
# Some conf or redirects for this site only.
}
Я пользуюсь преимуществом glob()
расширение шаблона функции, которое используется nginx в include
директиве и хорошо работает на моих серверах Debian.
В вашем случае попробуйте заменить эту строку:
include /path/www/$host/nginx.conf;
с этим:
include /path/www/<hostname>/nginx[.]conf;
это маска файла, которая соответствует только одному файлу и не заставит nginx жаловаться, если файл не существует. Однако переменные не допускаются в директивах include, поэтому вы должны указать фиксированное значение в <hostname>
. Нам пришлось создать сценарий, который генерирует отдельные файлы .conf (по одному для каждого виртуального хоста).
Так как Джеральд Шнайдер указал, я предлагал сохранить $host
в замене, что не допускается. Я изменил предложение выше.