Назад | Перейти на главную страницу

Как вы условно включаете файлы в виртуальный хост Nginx?

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