Динамические виртуальные хосты (dynamic vhost) в nginx

У apache есть такая полезная вещь как dynamic vhost - динамические виртуальных хосты. Собственно, оно нужно для того, чтобы каждый раз при добавлении домена, не было нужды редактировать файл конфигурации. Достаточно один раз настроить, добавить\обновить DNS запись и добавить директорию на сервер.
Так вот до недавнего времени, мне не было нужды в динамических виртуальных хостах, но не так давно понадобилось сделать и я, признаться, немного был поражён тому, насколько это просто, лаконично и главное гибко можно настроить в nginx.

Не буду томить, всё действительно очень просто:

server {
    server_name $host;
    root /var/www/$host;
    # ... and so on ...
}

По большему счёту это всё, но на практике хорошо бы проверять наличие директории, и если такой нет - показывать 404 ошибку:

server_name $host;

if (!-d /var/www/$host) {
     return 404;
}

root /var/www/$host;

Если необходимо только для поддоменов то:

server_name $subdomain.example.com;

if (!-d /var/www/$subdomain.example.com) {
     return 404;
}

root /var/www/$subdomain.example.com;

Или вместо 404 ошибки можно сделать перенаправление (редирект, если будет угодно) на основной:

server_name $subdomain.example.com;

if (!-d /var/www/$subdomain.example.com) {
     rewrite ^/(.*) http://example.com permanent;
}

root /var/www/$subdomain.example.com;

Ну и совсем универсальный вариант для доменов и поддоменов:

server {
        set $basepath "/var/www";
        set $domain $host;

        if ($domain ~ "^(.[^.]*)$") {
                set $domain $1;
                set $rootpath "${domain}/html/";
                set $servername "${domain}";
        }

        if ($domain ~ "^(.*)\.(.[^.]*)$") {
                set $subdomain $1;
                set $domain $2;
                set $rootpath "${subdomain}.${domain}/html/";
                set $servername "${subdomain}.${domain}";
        }

        if (!-d $basepath/$rootpath) {
                return 404;
        }

        server_name $servername;
        root $basepath/$rootpath/;
}


Понравилась статья? Поделись с друзьями!




Комментарии на этом сайте требуют включенного Javascript в вашем браузере. Вероятно, ваш браузер не поддерживает Javascript, или он был отключен по каким-то причинам. Если вы хотите прокомментировать пост, или просто почитать комментарии, то пожалуйста, включите Javascript или попробуйте открыть эту страницу другим браузером.