Подтвердить что ты не робот

Как настроить массовые динамические виртуальные хосты в nginx?

Играя с nginx около часа, пытаясь настроить массовые динамические виртуальные хосты. Если вы когда-либо делали это в apache, вы понимаете, что я имею в виду.

Цель состоит в том, чтобы иметь динамические поддомены для нескольких человек в офисе (более 50)

4b9b3361

Ответ 1

Вам понадобится какой-то скриптовый knowladge, чтобы собрать это вместе, я бы использовал php, но если вы хорошо разбираетесь в bash, используйте это. Я бы сделал это следующим образом:

  • Сначала создайте папку (/usr/local/etc/nginx/domain.com/).

  • В основной команде добавления nginx.conf: include/usr/local/etc/nginx/domain.com/*. conf;

  • В каждом файле в этой папке должны быть разные имена хостов subdomain.conf.

Вам не нужно перезапускать nginx-сервер для конфигурации, чтобы выполнить его, вам нужно только перезагрузить его:/usr/local/etc/rc.d/nginx reload

ИЛИ вы можете создать только один файл conf, где должны быть установлены все vhosts. Это, вероятно, лучше, так что nginx не нужно загружать 50 файлов, но только один....

ЕСЛИ у вас проблемы со сценарием, тогда задайте вопрос об этом...

Ответ 2

Возможно, это сделает вас там, где вы хотите быть:

server {

    root /sites/$http_host;

    server_name $http_host;

    ...

}

Мне нравится это, поскольку я могу буквально создавать сайты "на лету", просто создайте новый каталог, названный в честь домена, и укажите DNS на сервер ip.

Ответ 3

На основании ответа user2001260, позже отредактированного partlov, вот мой исход.

Помните, что это для сервера dev, расположенного на локальной виртуальной машине, где префикс .dev используется в конце каждого домена. Если вы хотите удалить его или использовать что-то еще, часть \.dev в директиве server_name может быть отредактирована или вообще удалена.

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # Match any server name with the format [subdomain.[.subdomain...]].domain.tld.dev
    server_name ~^(?<subdomain>([\w-]+\.)*)?(?<domain>[\w-]+\.[\w-]+)\.dev$;

    # Map by default to (projects_root_path)/(domain.tld)/www;
    set $rootdir "/var/www/$domain/www";

    # Check if a (projects_root_path)/(subdomain.)(domain.tld)/www directory exists
    if (-f "/var/www/$subdomain.$domain/www"){
        # in which case, set that directory as the root
        set $rootdir "/var/www/$subdomain.$domain/www";
    } 

    root $rootdir;

    index index.php index.html index.htm index.nginx-debian.html;

    # Front-controller pattern as recommended by the nginx docs
    location / {
        try_files $uri $uri/ /index.php;
    }

    # Standard php-fpm based on the default config below this point
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

}

Регулярное выражение в server_name захватывает переменные subdomain и domain. Часть subdomain является необязательной и может быть пустой. Я установил его так, что по умолчанию, если у вас есть субдомен, скажем admin.mysite.com, корневой каталог будет иметь тот же корень, что и mysite.com. Таким образом, один и тот же фронт-контроллер (в моем случае index.php) может маршрутизировать на основе субдомена. Но если вы хотите сохранить совсем другое приложение в субдомене, вы можете иметь dir admin.mysite.com, и он будет использовать этот каталог для вызовов admin.mysite.com.

Осторожно: Использование if не рекомендуется в текущей версии nginx, поскольку оно добавляет дополнительные служебные накладные расходы для каждого запроса, но это должно быть хорошо для использования в среде dev, для чего эта конфигурация хороша. В рабочей среде я бы рекомендовал не использовать массовую конфигурацию виртуального хоста и настраивать каждый сайт отдельно, для большего контроля и лучшей безопасности.

Ответ 4

Другой вариант состоит в том, чтобы иметь несколько уровней, чтобы каталоги могли быть классифицированы по вашему усмотрению. Например:

include sites-enabled/*.conf;
include sites-enabled/*/*.conf;
include sites-enabled/*/*/*.conf;
include sites-enabled/*/*/*/*.conf;

Ответ 5

server_name ~^(?<vhost>[^.]*)\.domain\.com$;
set $rootdir "/var/www/whatever/$vhost";
root $rootdir;

Ответ 6

Как предложил @Samuurai здесь короткая версия Angular 5 с интеграцией построения nginx:

server {
    server_name ~^(?<branch>.*)\.staging\.yourdomain\.com$;
    access_log /var/log/nginx/branch-access.log;
    error_log /var/log/nginx/branch-error.log;
    index index.html;
    try_files $uri$args $uri$args/ $uri $uri/ /index.html =404;
    root /usr/share/nginx/html/www/theft/$branch/dist;
}

Ответ 7

До тех пор, пока вам будет удобно писать скрипты, не сложно собрать некоторые скрипты, которые быстро настроят vhosts в nginx. Эта статья в slicehost проходит через создание нескольких vhosts и делает это таким образом, что это легко записывается в сценарии и сохраняет конфигурации отдельно. Единственным недостатком является перезапуск сервера, но это следует ожидать с изменениями конфигурации.


Обновление. Если вы не хотите выполнять какую-либо конфигурацию, поддерживающую себя, то ваши 2 варианта (безопасные в любом случае) должны были бы либо найти программу, которая позволит вашим пользователям управлять собственным куском своих nginx config (который позволит им создать все поддомены, которые они хотят) или создать такую ​​консоль управления, ориентированную на пользователя самостоятельно.

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