использование vhost шаблоны

Я использую nginx на Debian. Таким образом помимо главного конфигурационного файла/etc/nginx/nginx.conf есть папки/etc/nginx/sites-available/с vhost файлами конфигурации и/etc/nginx/sites-enabled/со связями с активным vhosts.

Таким образом позвольте мне задать свой вопрос сначала. Поскольку объяснение долго, и возможно вы не должны читать его...


я хочу быть в состоянии использовать несколько vhost шаблонов как это:

server {
    listen   80;
    server_name ~^(?.+)\.(?.+)\.loc$;

    if ($host ~ ^(?.+)\.(?.+)\.loc$) {
        set $folder "$area/$project";
    }
    ...
    access_log /var/log/nginx/$area/$project.access.log;
    error_log /var/log/nginx/error.log;
    ...
    root /var/www/$folder/;
    ...
}

и определить, на котором vhost основан который шаблон. Кроме того, было бы замечательно иметь возможность "расширить" шаблон, так, чтобы я мог добавить новые параметры настройки к своему vhosts и пересмотреть параметры настройки, унаследованные от шаблона.

, Как я могу достигнуть его?


Мой ток vhost файловая структура похож на это:

/etc/nginx/sites-available содержит следующие файлы:

дефолт (дефолт vhost) ax-common-vhost (vhost шаблон) test.sandbox.loc (vhost на основе шаблона ax-common-vhost; это включает thatwith , включают правило)... и некоторые дальнейшие...

/etc/nginx/sites-available содержит следующие файлы:

default -> /etc/nginx/sites-available/default test.sandbox.loc -> /etc/nginx/sites-available/test.sandbox.loc ...and some further ones...

Шаблон ax-common-vhost определяет некоторые варианты как корневая папка динамично, используя имя сервера:

server {
    listen   80;
    server_name ~^(?.+)\.(?.+)\.loc$;

    if ($host ~ ^(?.+)\.(?.+)\.loc$) {
        set $folder "$area/$project";
    }
    ...
    access_log /var/log/nginx/$area/$project.access.log;
    error_log /var/log/nginx/error.log;
    ...
    root /var/www/$folder/;
    ...
}

So when I want to create a new vhost, I just create a new vhost file and a link to it -- and don't need to copy&paste the settings and to set the paths manually. I just need to follow the convention, that a host %project%.%area%.loc hast to be placed in [my webroot]/%area%/%project%

Я думал, это работает по включать правилу: сервер получает запрос x.y.loc, ищет файл, названный так, открывает файл, и наконец обрабатывает директивы в нем (так включать директива и целое содержание включенного шаблона).

Но это не так. Nginx, кажется, только просматривает целую папку/etc/nginx/sites-available/(в алфавитном порядке?) и держаться первый файл/ сервер директива имя хоста в запросе равняется/машины.

Это означает, включать

include /etc/nginx/sites-available/ax-common-vhost;

не используется. На самом деле я удалил включать директивы из vhost файлов - и ничто не изменилось!

И это - проблема. Поскольку, когда я добавляю новый шаблон, например, для моих проектов Структуры Зенда (с [корень проекта]/public/как корень):

файл ax-zf-vhost

server {
    listen   80;
    server_name ~^(?.+)\.(?.+)\.loc$;

    if ($host ~ ^(?.+)\.(?.+)\.loc$) {
        set $folder "$area/$project";
    }
    ...
    access_log /var/log/nginx/$area/$project.access.log;
    error_log /var/log/nginx/error.log;
    ...
    root /var/www/$folder/public/;
    ...
}

..., это проигнорировано, так как сервер не получает информации о, что vhost myzf.sandbox.loc основан на ax-zf-vhost. Вместо этого это просто образовывает петли/etc/nginx/sites-available/папка, находит ax-common-vhost, myzf.sandbox.loc машины к образцу ^ (?. +). (?. +). loc$ и nginx используют ax-common-vhost для myzf.sandbox.loc.

Как эта проблема может быть решена?

Спасибо

1
nl ja de

1 ответы

Хорошо, это работает теперь!

Я изменил server_name блок своего основного vhost файла, таким образом, это porecces только запрос с именами хоста, перечисленными в директиве:

файл ax-common-vhost:

server {
    listen   80;
    server_name test.sandbox.loc foo.sandbox.loc bar.sandbox.loc;
    ...
}

instead of the generic server_name ~^(?.+)\.(?.+)\.loc$;.

vhost файлы test.sandbox.loc, foo.sandbox.loc, bar.sandbox.loc и т.д. в/etc/nginx/sites-available/и связи с ними в/etc/nginx/sites-enabled/больше не необходимы. Я создал связь/etc/nginx/sites-enabled/ax-common-vhost с/etc/nginx/sites-available/ax-common-vhost вместо этого.

Подход для второго общего vhost файла - то же самое, и это работает.

Первая проблема решена: параметры настройки могут быть разделены несколькими vhosts/блоки сервера, и я могу легко добавить новый vhosts, не дублируя параметры настройки.

But: The vhost file with the settings cannot be extended by another file. Is it possible to do this, so that a file B can "extend" a file A, inherit its settings and overwrite only directives/rules? How can I realize that?

1
добавлено
nginx_ru
nginx_ru
930 участник(ов)

Сообщество пользователей nginx, новости, обсуждения конфигураций, вопросы, программирование на конфигах

Debian | Centos | Флуд
Debian | Centos | Флуд
477 участник(ов)