Как вы условно включаете файлы в 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;
        }
}

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


Вы нашли решение этой проблемы? Я в одной лодке, и мне интересно, как ты это сделал?
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, который по моему соглашению называется тем же, что и основная конфигурация. Эти *работы в значительной степени как если бы, как не сломаться , если нет дополнительных файлов конфигурации. Если вам нравится, это также позволяет вам добавить несколько дополнительных конфигураций в отдельных файлах.


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 от стандартных.
Альберто Пасторе
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.