Dynamiczna ścieżka katalogu głównego domeny Nginx na podstawie nazwy hosta?

11

Próbuję skonfigurować mój programistyczny serwer nginx / PHP z podstawową konfiguracją vhost master / catch-all, aby w razie potrzeby móc tworzyć nieograniczoną liczbę ___.framework.locdomen .

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;
}

Jednak nginx odpowiada błędem 404 dla tej konfiguracji. Wiem, że nginx i PHP działają i mam uprawnienia, ponieważ localhostkonfiguracja, której używam, działa dobrze.

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

        include /etc/nginx/php.conf;
}

Co powinienem sprawdzić, aby znaleźć problem? Oto kopia tego php.conf, które ładują.

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;

}
Xeoncross
źródło

Odpowiedzi:

12

Dlaczego nie po prostu użyć:

server_name *.frameworks.loc;
root /var/www/frameworks/$http_host/public;
Michael Hampton
źródło
Właśnie tego szukałem!
Xeoncross,
13

Konfiguracja Nginx nie jest programem, to deklaracja. Gdy używasz config w ten sposób:

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

Nie ma sposobu, aby zapewnić, że twoja setdyrektywa zostanie wykonana wcześniej root.

Ale jest pewna sztuczka z mapdyrektywą, której lubię używać. Opiera się na fakcie, który mapjest oceniany wcześniejlocation

http {
  map $http_host $rootpath {
    ~^(.?<mypath>+)\.frameworks\.loc$  $mypath;
    default                            /      ;
  }
  ....
  root /var/www/frameworks/$rootpath
}
DukeLion
źródło
To wygląda na zabawę, planuję teraz grać więcej z mapą. Nie wiedziałem też, że pliki konfiguracyjne nie były przetwarzane w sposób liniowy.
Xeoncross,
O co $mypathtu chodzi? Nigdzie nie jest używany.
kodeart
@kodeart $mypathjest grupą wyników dla wyrażenia regularnego ~^(.?<mypath>+)\.frameworks\.loc$i $rootpathstanowi wynik dla całej sztuczki z mapą.
Fabio Montefuscolo
4

Oprócz świetnej odpowiedzi DukeLiona musiałem zmienić linię

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

do

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

w moim /etc/nginx/nginx.confpliku, zgodnie z sugestią tutaj .

Dodawanie

root /var/www/frameworks/$rootpath

w /etc/nginx/sites-available/defaultpracował dobrze po tym.

zub0r
źródło
0

Może możesz zajrzeć również do lighttpd. Ma wbudowaną obsługę dokładnie tego, o co tutaj pytasz. Nazywa się to mod_evhost .

Włącz evhost

Dodaj następujące wiersze do pliku lighttpd.conf. Jeśli używasz podstawowej dystrybucji Debian / Ubuntu, po prostu soft link lub skopiuj z /etc/lighttpd/conf-available/10-evhost.confdo /etc/lighttpd/conf-enabled/.

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

%_( Symbol wieloznaczny) w evhost.path-patten oznacza użycie pełnej nazwy domeny (np. Www.example.com). Zapytanie o www.example.com automatycznie przekieruje do katalogu głównego dokumentu /home/www/www.example.com/.

Dodanie dodatkowej strony jest tak proste, jak utworzenie innego katalogu /home/wwwz pełną nazwą domeny. Brak zmian w pliku konfiguracyjnym Lighttpd.

Istnieją inne symbole wieloznaczne i można ich używać do budowania struktury katalogów. Są one następujące

    Znak %% =>%
    % 0 => nazwa domeny + tld
    % 1 => tld
    % 2 => nazwa domeny bez tld
    % 3 => nazwa subdomeny 1
    % 4 => nazwa subdomeny 2
    % _ => pełna nazwa domeny

Szczegółowe informacje są tutaj .

PS: Włączenie PHP jest również łatwe, jeśli korzystasz z platformy debian / ubuntu. Po prostu włącz 10-fastcgi.confi 15-fastcgi-php.conf.

John Siu
źródło
0

NGINX korzysta z biblioteki wyrażeń regularnych PCRE.
Od NGINX v0.8.25 server_namedyrektywa zezwala na przechwytywanie nazwane .

Przechwytywanie nazwane w wyrażeniach regularnych tworzy zmienne ( 0.8.25 ), które mogą być później używane w innych dyrektywach Podczas używania nazwanego nawiasu, NGINX automatycznie ustawia zmienną dla każdego nazwanego nawiasu, podczas oceny nazw serwerów (tak sądzę).

Używam następującego fragmentu do „ogrodzenia” środowisk programistów. „Użytkownik” odnosi się do nazwy użytkownika i „proj” projektu, nad którym pracują:

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

Zauważ, że konfiguracja nginx jest deklaratywna i dlatego deklaracje statyczne mogą zawsze być szybsze w porównaniu z wartościami i zmiennymi obliczanymi w czasie wykonywania. Ocena wyrażeń regularnych jest stosunkowo kosztowna, sądzę, że musi być używana z parsimony w środowiskach o dużym obciążeniu (produkcyjnym).

Stphane
źródło