Percorso di root del dominio nginx dinamico basato sul nome host?


11

Sto cercando di configurare il mio server nginx / PHP di sviluppo con una configurazione di base vhost master / catch-all in modo da poter creare ___.framework.locdomini illimitati, se necessario.

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

Tuttavia, nginx risponde con un errore 404 per questa configurazione. So che nginx e PHP funzionano e hanno i permessi perché la localhostconfigurazione che sto usando funziona bene.

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

        include /etc/nginx/php.conf;
}

Cosa devo controllare per trovare il problema? Ecco una copia di quel php.conf che stanno caricando entrambi.

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;

}

Risposte:


12

Perché non usare solo:

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

Questo è proprio quello che stavo cercando!
Xeoncross,

13

Nginx config non è un programma, è una dichiarazione. Quando si utilizza Config in questo modo:

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

Non c'è modo di assicurarsi che la setdirettiva venga eseguita prima root.

Ma c'è un trucco con la mapdirettiva che mi piace usare. Si basa sul fatto che mapviene valutato primalocation

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

Sembra divertente, ho intenzione di giocare di più con la mappa ora. Inoltre non ero a conoscenza del fatto che i file di configurazione non fossero elaborati in modo lineare.
Xeoncross,

Che senso ha $mypathqui? Non è usato da nessuna parte.
kodeart,

@kodeart $mypathè il gruppo di risultati per regex ~^(.?<mypath>+)\.frameworks\.loc$ed $rootpathè il risultato di tutto il trucco della mappa.
Fabio Montefuscolo,

4

Oltre alla grande risposta di DukeLion , avevo bisogno di cambiare linea

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

per

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

nel mio /etc/nginx/nginx.conffile come suggerito qui .

Aggiunta

root /var/www/frameworks/$rootpath

in /etc/nginx/sites-available/defaultfunzionato benissimo dopo.


0

Forse puoi anche guardare in lighttpd. Ha un supporto integrato esattamente per quello che stai chiedendo qui. Si chiama mod_evhost .

Abilita evhost

Aggiungi le seguenti righe nel tuo lighttpd.conf. Se stai usando la distribuzione di base Debian / Ubuntu, basta un soft link o copia da /etc/lighttpd/conf-available/10-evhost.confa /etc/lighttpd/conf-enabled/.

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

Il %_(carattere jolly) in evhost.path-patten significa utilizzare il nome di dominio completo (ad es. Www.example.com). Una richiesta per www.example.com verrà indirizzata automaticamente alla radice del documento /home/www/www.example.com/.

Aggiungere un sito aggiuntivo è facile come creare un'altra directory /home/wwwcon il nome di dominio completo. Nessuna modifica al file di configurazione di Lighttpd.

Esistono altri caratteri jolly e possono essere utilizzati per creare la struttura di directory. Sono come segue

    %% =>% sign
    % 0 => nome dominio + tld
    % 1 => tld
    % 2 => nome di dominio senza tld
    % 3 => nome del sottodominio 1
    % 4 => nome del sottodominio 2
    % _ => nome di dominio completo

Le informazioni dettagliate sono qui .

PS: Abilitare PHP è anche facile se sei su piattaforma debian / ubuntu. Basta abilitare 10-fastcgi.confe 15-fastcgi-php.conf.


0

NGINX utilizza la libreria di espressioni regolari PCRE.
A partire dalla server_namedirettiva NGINX v0.8.25 consente acquisizioni con nome .

Le acquisizioni denominate nelle espressioni regolari creano variabili ( 0.8.25 ) che possono essere successivamente utilizzate in altre direttive Durante l'utilizzo della parentesi denominata, NGINX imposta automaticamente una variabile per ciascuna parentesi denominata, durante la valutazione dei nomi dei server (immagino).

Uso lo snippet seguente per "recintare" gli ambienti degli sviluppatori. «Utente» si riferisce al loro nome utente e «proj» il progetto su cui lavorano:

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

Si noti che la configurazione di nginx è dichiarativa e, in quanto tale, le dichiarazioni statiche potrebbero essere sempre più veloci rispetto ai valori e alle variabili calcolati in fase di esecuzione. La valutazione delle espressioni regolari è relativamente costosa, immagino che debba essere usata con parsimonia in ambienti carichi (di produzione) pesanti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.