Як ви умовно включаєте файли в 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()розширенням функції функцій, яке використовується nginx в includeдирективі, і добре працює на моїх серверах Debian.

У вашому випадку спробуйте замінити цей рядок:

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

з цим:

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

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

Редагувати

Як зазначав Джеральд Шнайдер , я пропонував утримати $hostзаміну, що не дозволено. Я змінив пропозицію вище.


1
змінна $hostвсе ще не працює тут.
Джеральд Шнайдер

Вибачте, ви праві, змінні заборонено в директивах включати. Ми використовуємо скрипт python, який створює єдиний .conf для кожного vhost зі списку, але ми широко використовуємо "спеціальні" додаткові відхилення per-vhost від стандартних.
Альберто Пасторе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.