Динамічний кореневий шлях до домену nginx на основі імені хоста?


11

Я намагаюся налаштувати свій сервер nginx / PHP розробки з базовим конфігурацією master / catch-all vhost, щоб я міг створювати необмежену кількість ___.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конфігурація, яку я використовую, працює добре.

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;

}

Відповіді:



13

Nginx config - це не програма, це декларація. Коли ви використовуєте конфігурацію, як це:

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
}

Це виглядає як весело, я зараз планую більше грати з картою. Я також не знав, що файли конфігурації не обробляються лінійно.
Xeoncross

Який сенс $mypathтут? Він ніде не використовується.
kodeart

@kodeart $mypath- це група результатів для регулярних виразів ~^(.?<mypath>+)\.frameworks\.loc$і $rootpathє результатом для цілої хитрості карти.
Фабіо Монтефусколо

4

Окрім чудової відповіді DukeLion , мені потрібно було змінити лінію

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

до

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

в моєму /etc/nginx/nginx.confфайлі, як тут запропоновано .

Додавання

root /var/www/frameworks/$rootpath

в /etc/nginx/sites-available/defaultпрацював відмінно після цього.


0

Можливо, ви також можете заглянути в 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-Паттен кошти використовувати повне доменне ім'я (наприклад, www.example.com). Запит на www.example.com автоматично спрямовуватиметься до root-документа /home/www/www.example.com/.

Додавати додатковий сайт так само просто, як створити ще один каталог /home/wwwу повному доменному імені. Немає змін у конфігураційному файлі Lighttpd.

Існують і інші символи, які можуть бути використані для створення структури каталогів. Вони такі, як слідують

    знак %% =>%
    % 0 => ім'я домену + tld
    % 1 => tld
    % 2 => ім'я домену без tld
    % 3 => піддомен 1 ім'я
    % 4 => ім'я субдомена 2
    % _ => повне доменне ім’я

Детальна інформація тут .

PS: Увімкнення PHP також легко, якщо ви перебуваєте на платформі debian / ubuntu. Просто ввімкніть 10-fastcgi.confі 15-fastcgi-php.conf.


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.