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

Динамический корневой путь домена nginx на основе имени хоста?

Я пытаюсь настроить свой сервер разработки nginx / PHP с базовой конфигурацией vhost master / catch-all, чтобы я мог создано неограниченное ___.framework.loc домены по мере необходимости.

server {
        listen 80;
        index index.html index.htm index.php;

        # Test 1
        server_name ~^(.+)\.frameworks\.loc$;
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;

        include /etc/nginx/php.conf;
}

Однако nginx выдает ошибку 404 для этой настройки. Я знаю, что nginx и PHP работают и у меня есть разрешение, потому что localhost config, который я использую, отлично работает.

server {
        listen 80 default;
        server_name localhost;
        root /var/www/localhost;
        index index.html index.htm index.php;

        include /etc/nginx/php.conf;
}

Что я должен проверить, чтобы найти проблему? Вот копия того php.conf, который они оба загружают.

location / {
        try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {

        try_files $uri =404;

        include fastcgi_params;
        fastcgi_index index.php;

        # Keep these parameters for compatibility with old PHP scripts using them.
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # Some default config
        fastcgi_connect_timeout        20;
        fastcgi_send_timeout          180;
        fastcgi_read_timeout          180;
        fastcgi_buffer_size          128k;
        fastcgi_buffers            4 256k;
        fastcgi_busy_buffers_size    256k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_intercept_errors    on;
        fastcgi_ignore_client_abort off;
        fastcgi_pass 127.0.0.1:9000;

}

Конфигурация Nginx - это не программа, это декларация. Когда вы используете такую ​​конфигурацию:

server {
        server_name ~^(.+)\.frameworks\.loc$;
        ...
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;
}

Невозможно гарантировать, что ваш set директива будет выполнена до root.

Но есть трюк с map директива, которую я люблю использовать. Он основан на том, что map оценивается до location

http {
  map $http_host $rootpath {
    ~^(.?<mypath>+)\.frameworks\.loc$  $mypath;
    default                            /      ;
  }
  ....
  root /var/www/frameworks/$rootpath
}

Почему бы просто не использовать:

server_name *.frameworks.loc;
root /var/www/frameworks/$http_host/public;

Помимо отличных DukeLion's ответ, мне нужно было сменить строку

~^(.?<mypath>+)\.frameworks\.loc$ $mypath;

к

~^(?P<mypath>.+)\.frameworks\.loc$ $mypath;

в моем /etc/nginx/nginx.conf файл как предложено Вот.

Добавление

root /var/www/frameworks/$rootpath

в /etc/nginx/sites-available/default после этого работал нормально.

Может быть, вы также можете посмотреть на lighttpd. Он имеет встроенную поддержку именно того, о чем вы здесь спрашиваете. Это звонок mod_evhost.

Включить evhost

Добавьте следующие строки в ваш lighttpd.conf. Если вы используете базовый дистрибутив Debian / Ubuntu, просто добавьте программную ссылку или скопируйте из /etc/lighttpd/conf-available/10-evhost.conf к /etc/lighttpd/conf-enabled/.

    # http://redmine.lighttpd.net/wiki/1/Docs:ModEVhost
    server.modules += ( "mod_evhost" )
    evhost.path-pattern = "/home/www/%_"

В %_ (подстановочный знак) в evhost.path-patten означает использование полного имени домена (например, www.example.com). Запрос на www.example.com будет автоматически направлен в корневой каталог документа. /home/www/www.example.com/.

Добавить дополнительный сайт так же просто, как создать еще один каталог в /home/www с полным доменным именем. Без изменений в конфигурационном файле Lighttpd.

Существуют и другие подстановочные знаки, которые можно использовать для построения структуры каталогов. Они следующие

    %% => % sign
    %0 => domain name + tld
    %1 => tld
    %2 => domain name without tld
    %3 => subdomain 1 name
    %4 => subdomain 2 name
    %_ => full domain name

Подробная информация Вот.

PS: Включить PHP также просто, если вы работаете на платформе debian / ubuntu. Просто включите 10-fastcgi.conf и 15-fastcgi-php.conf.

NGINX использует библиотеку регулярных выражений PCRE.
Начиная с NGINX v0.8.25 server_name директива позволяет названные захваты.

Именованные захваты в регулярных выражениях создавать переменные (0.8.25), которые позже можно будет использовать в других директивах. При использовании именованных скобок NGINX автоматически устанавливает переменную для каждой именованной скобки во время оценки имен серверов (я полагаю).

Я использую следующий фрагмент, чтобы «ограждать» среду разработчиков. «Пользователь» относится к их имени пользователя и «proj» проекта, над которым они работают:

# ...
server_name ~^(?<user>[^.]+)\.(?<proj>[^.]+).dev.local-server.com;
root /home/$user/www/$proj;
# ...

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