2015-10-09 7 views
9

Sto provando a servire CachetHQ in nginx + php-fpm in una posizione specifica. Il docs dà questo come esempio, che serve a status.example.com (che funziona):Nginx per ospitare l'app in un'altra posizione

server { 
    listen 80; 
    server_name status.example.com; 

    root /var/www/Cachet/public; 
    index index.php; 

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

    location ~ \.php$ { 
     include fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_index index.php; 
     fastcgi_keep_conn on; 
    } 
} 

Tuttavia, invece di servire in status.example.com, vorrei servire in example.com/status.

mi aspettavo che questo dovrebbe funzionare, ma da error.log vedo che sta cercando /etc/nginx/htmlindex.php, ma dovrebbe essere /mnt/data/site/www-cachet/public/index.php:

location /status/ { 
    index index.php; 
    root /mnt/data/site/www-cachet/public; 

    try_files $uri index.php$is_args$args; 

    location ~ ^/status/.+\.php$ { 
     root /mnt/data/site/www-cachet/public; 
     include fastcgi_params; 
     fastcgi_pass unix:/tmp/php-fpm.sock; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_index index.php; 
     fastcgi_keep_conn on; 
    } 
} 
+0

La priorità non è giusta. La prima risposta è 'location /' – zywj

+0

@ZYWJ bene 'location /' non dovrebbe essere un problema dato che non dovrei trovarmi in '/ status' – rodorgas

+0

@rodorgas, la mia risposta funziona per te, giusto? – cnst

risposta

0

Dopo tante ore a cercare un sacco di combinazioni, il modo in cui ho capito di lavoro era:

location ^~ /status { 
    alias /mnt/data/site/www-cachet/public; 
    try_files $uri $uri/ @status; 

    location = /status/ { 
     rewrite /status/$ /status/index.php; 
    } 

    location ~ ^/status/(.+\.php)$ { 
     fastcgi_pass unix:/tmp/php-fpm.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME /mnt/data/site/www-cachet/public/$1; 
     include fastcgi_params; 
    } 
} 

location @status { 
    rewrite /status/(.*)$ /status/index.php?/$1 last; 
} 

la cosa più importante è stata fastcgi_param, ho dovuto impostare su un percorso assoluto invece di $document_root$fastcgi_script_name o qualcosa di simile. Non sono sicuro che sia una buona pratica, ma l'aggiunta di alias al blocco non funziona e nginx o FastCGI non mostrano il percorso del file che stanno cercando di leggere.

Tuttavia, CachetHQ non è riuscito a funzionare correttamente. Il problema è che tutti i percorsi nel codice sorgente sono assoluti, quindi non puntano alla sottodirectory in cui sono ospitati i nostri file. La soluzione era fare qualcosa che ero riluttante dall'inizio: ospitarlo in un sottodominio.

2

tuo try_files non è corretto.
Si può fare in questo modo:

index index.php; 
root /mnt/data/site/www-cachet/public; 

location/{ 
    if (!-e $request_filename) { 
     rewrite ^(.*)$ /index.php?$1 last; 
     break; 
    } 
} 

location ~ ^/status/.+\.php$ { 
    root /mnt/data/site/www-cachet/public; 
    include fastcgi_params; 
    fastcgi_pass unix:/tmp/php-fpm.sock; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_index index.php; 
    fastcgi_keep_conn on; 
} 
+0

Il test di configurazione di Nginx fallisce, dicendo che "posizione"/"è fuori posizione"/stato "'. Ho modificato per sbarazzarmi degli errori. Quindi, log mi ha mostrato che nginx invia lo script a FastCGI, ma la risposta HTTP è "File not found". In error.log, il messaggio è "Script primario sconosciuto". C'è un modo in cui vediamo quale percorso sta tentando di accedere? – rodorgas

2

Vorrei iniziare con la configurazione originaria che si sostiene le opere, e cercare di modificarlo per le vostre esigenze, risultati di seguito:

location ^~ /status { 
    alias /var/www/Cachet/public; 
    index index.php; 

    location = /status { 
     return 302 /status/; 
    } 
    location/{ 
     try_files $uri /status/index.php$is_args$args; 
    } 

    location ~ \.php$ { 
     include fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     rewrite ^/status/(.*) /$1; 
     rewrite ^(.*)/ $1/index.php; # who knows what fastcgi_index is for? 
     fastcgi_param SCRIPT_FILENAME $document_root$uri; 
     fastcgi_keep_conn on; 
    } 
} 

In sostanza, si vuoi usare alias invece di root qui, e probabilmente anche avere un percorso assoluto nel try_files finale. Non penso che sia necessario aggiungere ulteriori prefissi all'interno delle posizioni nidificate, ma è necessario assicurarsi che la posizione di root sia una corrispondenza finale con il modificatore ^~.

Il trucco principale, credo, è che anche con le cose alias direttiva non sono così Dandy come con una vera e propria root, quindi, è necessario fare in modo che il SCRIPT_FILENAME è impostato correttamente. Questa parte non sembra essere documentata molto chiaramente, e sono troppo pigro per verificare se la direttiva $fastcgi_script_namengx variable e fastcgi_index gioca bene con alias - invece di cercare di determinare come funzionano (o meno), facciamo semplicemente un un paio di regole rewrite applicabili e costruire SCRIPT_FILENAME in base ai risultati delle nostre regole di riscrittura. :-)

Tuttavia, con quello detto, penserei che la seconda regola di riscrittura (così come lo fastcgi_index che sostituisce) potrebbe anche essere un no-op, perché come dovevamo finire in un \.php$location se $uri non terminava già nello .php? (Allo stesso modo, sei libero di cercare di rimuovere la prima regola di riscrittura, troppo, e sostituire $uri in SCRIPT_FILENAME con $fastcgi_script_name, e vedere se le cose funzionano ancora, ma internet from 2009 potrebbe indicare che non lo fecero.)

+0

Il test di configurazione di Nginx dice che "posizione"/"è fuori posizione"/stato "'. Sto usando nginx/1.8.0. Ho modificato 'posizione /' in 'posizione/stato /' e ottengo 404, in error.log vedo che sta provando ad accedere a /etc/nginx/htmlindex.php. – rodorgas

+0

@rodorgas, come si ottiene esattamente tale errore 404? Non ho mai visto nessuno che abbia errori a indicare '/ etc/nginx/htmlindex.php', ci deve essere qualcos'altro molto strano sul tuo file di configurazione o sul modo in cui copi e incolli il mio esempio. Per '/' outside '/ status', sicuro, basta cambiarlo in'/status', e dovrebbe andare bene. – cnst

+0

'curl http: // site/status /' (arriccia in modo che la risposta non sia memorizzata nella cache),/status/setup e roba, tutti provano la stessa strana posizione. Ho cercato attraverso TUTTI i file in '/ etc/nginx /', dove sono collocati i file conf.d e altri, e nessuno di loro ha il percorso '/ etc/nginx/html'. Ho raddoppiato anche il mio copia-incolla, funziona come previsto. Sta succedendo qualcosa di strano, e potrebbe essere risolto solo impostando un percorso assoluto invece delle variabili (buggy?). – rodorgas