Как вы условно включаете файлы в Nginx vhost?

12

В приведенных ниже строках у меня может быть файл конфигурации для конкретного сайта, который содержит дополнительные 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;
        }
}

Тем не менее, это не похоже на работу.

Xeoncross
источник
Вы нашли решение этой проблемы? Я в одной лодке, и мне интересно, как ты это сделал?
Jackweirdy
Извините, я думаю, что наконец решил, что проблема была по-другому.
Xeoncross

Ответы:

8

includeделает это во время запуска сервера - переменные времени выполнения, такие как, $hostне могут использоваться и не могут использоваться в ifконтексте, как вы выяснили.

Вам нужно разделить serverблоки для разных хостов. Сожалею!

Шейн Мэдден
источник
31

Ну, это довольно старый, но в любом случае, я нашел обходной путь.

У меня есть настройки с Vhosts, настроенный в этом стиле:

/etc/nginx/sites-enabled/site.com.conf

Вместо проверки, существует ли файл (что невозможно), я просто делаю:

include /etc/nginx/sites-customizations/site.com.*.conf

Таким образом, я могу просто создать файл в sites-customizations-folder, который по моему соглашению называется тем же, что и основная конфигурация. Эти *работы в значительной степени как если бы, как не сломаться , если нет дополнительных файлов конфигурации. Если вам нравится, это также позволяет вам добавить несколько дополнительных конфигураций в отдельных файлах.

user158786
источник
5

Я знаю, что это старо, но решение может помочь кому-то искать ответ, как я.

У меня была куча перенаправлений, которые мне нужно было включить только для конкретного хоста, и хотя includeэто не разрешено в ifдирективе, я закончил тем, что добавил ifвнутренний файл, который я включал ...

Итак, у меня есть include /etc/nginx/conf.d/redirectsи внутри этого файла у меня есть:

if ($host = "www.example.com") {
    # Some conf or redirects for this site only.
}
Тити
источник
5

Я использую преимущества glob()расширения шаблона функции, которое используется в includeдирективе nginx и хорошо работает на моих серверах Debian.

В вашем случае попробуйте заменить эту строку:

include /path/www/$host/nginx.conf;

с этим:

include /path/www/<hostname>/nginx[.]conf;

это маска файла, которая соответствует только одному файлу, и не заставит nginx пожаловаться, если файл не существует. Однако переменные не допускаются в директивах include, поэтому вы должны указать фиксированное значение в <hostname>. Нам пришлось создать скрипт, который генерирует отдельные файлы .conf (по одному на vhost).

редактировать

Как указал Джеральд Шнайдер , я предлагал оставить $hostна замену, что недопустимо. Я изменил предложение выше.

Альберто Пасторе
источник
1
переменная $hostвсе еще не будет работать здесь.
Джеральд Шнайдер
Извините, вы правы, переменные не допускаются в директивах include. Мы используем скрипт Python, который создает один .conf для каждого vhost из списка, но мы широко используем «пользовательские» дополнительные отклонения для каждого vhost от стандартных.
Альберто Пасторе