Problemi relativi alla posizione di Nginx

Attualmente sto cercando di separare 3 applicazioni da un repository in 3, ma mantenendo la struttura url, quindi le posizioni fondamentalmente diverse sotto lo stesso dominio devono essere consegnate da diverse applicazioni.

Quello che sto combattendo è che una delle applicazioni debba essere il fallback per urls inesistenti, quindi se il primo non corrisponde, e il secondo non lo fa, allora il terzo dovrebbe gestire la richiesta

La struttura che ho è:

/ etc / nginx / sites-enabled / main_site, in qui, a parte nome_server e registri che ho include /etc/nginx/subsites-enabled/* , where ho 3 file di configuration, uno per ciascuna delle applicazioni .

Ciascuno dei 3 file di configuration contiene un block di posizione.

Ho provato lookahead negativo in regex (fondamentalmente cercando di codificare gli URL degli altri app) ma non sono riusciti.

Quindi, per riassumere:

/ e / community dovrebbe essere consegnato da /etc/nginx/subsites-enabled/example.org/home (alcuni script perl)

/ news dovrebbe essere consegnato da /etc/nginx/subsites-enabled/example.org/news (wordpress)

tutto il resto dovrebbe essere consegnato da /etc/nginx/subsites-enabled/example.org/app (applicazione torta)

Il bit perl funziona bene. Il problema che sto avendo è che l'applicazione sta assumendo notizie (probabilmente perché corrisponde). Ho provato varie opzioni (sono stato a questo per 2 giorni) ma nessuno di loro ha risolto tutti i problemi (a volte le attività statiche non functionrebbero, ecc.).

La mia configuration è:

/etc/nginx/sites-enabled/example.org:

 server { listen 80; server_name example.org; error_log /var/log/nginx/example.org.log; include /etc/nginx/subsites-enabled/example.org/*; } 

/etc/nginx/subsites-enabled/example.org/home:

 location = / { rewrite ^.*$ /index.pl last; } location ~* /community(.*) { rewrite ^.*$ /index.pl last; } location ~ \.pl { root /var/www/vhosts/home; access_log /var/log/nginx/home/access.log; error_log /var/log/nginx/home/error.log; include /etc/nginx/fastcgi_params; fastcgi_index index.pl; fastcgi_param SCRIPT_FILENAME /var/www/vhosts/home$fastcgi_script_name; fastcgi_pass unix:/var/run/fcgiwrap.socket; } 

/ Etc / ngins / siti secondari abilitati / notizie

 location /news { access_log /var/log/nginx/news/access.log; error_log /var/log/nginx/news/error.log debug; error_page 404 = /news/index.php; root /var/www/vhosts/news; index index.php; if (!-e $request_filename) { rewrite ^.*$ /index.php last; } location ~ \.php { include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/vhosts/news$fastcgi_script_name; } } 

/ Etc / nginx / siti secondari-enabled / app:

 location ~ .* { access_log /var/log/nginx/app/access.log; error_log /var/log/nginx/app/error.log; rewrite_log on; index index.php; root /var/www/vhosts/app/app/webroot; if (-f $request_filename) { expires 30d; break; } if (!-e $request_filename) { rewrite ^.*$ /index.php last; } location ~ \.php { include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/vhosts/app/app/webroot$fastcgi_script_name; } } 

  • Servire i file protetti usando l'intestazione X-Accel-Redirect di Nginx
  • Perché PHP-FPM utilizza solo un process?
  • Proxying webmin con nginx
  • nginx proxy_pass utilizzando la sottocartella
  • È ansible vedere collegamenti attivi in ​​nginx?
  • Globally setting ipv6only = distriggersto
  • Perché 'multi_accept' 'distriggersto' come impostazione predefinita in Nginx?
  • Tutte le rotte Laravel "non trovate" su nginx
  • One Solution collect form web for “Problemi relativi alla posizione di Nginx”

    Ci sono poche cose sbagliate con il tuo config, le due pertinenti sono:

    1. I routes all'interno di un block di posizione includono ancora il path corrispondente.
    2. Riscrivi con l'ultima volta continuare guardando tutte le posizioni disponibili per una partita (esplodono dal block di posizione corrente).

    Ad esempio, prendi l'URL example.org/news/test.htm

    • Il block location /news corrisponderà
    • Il path utilizzato è quindi /news/test.htm – questo non cambia, solo perché è nel block di posizione
    • Aggiungendo il path al file document_root, si ottiene: /var/www/vhosts/news/news/test.htm
    • L'istruzione if (!-e $request_filename) dovrebbe catturare questo file inesistente
    • Riscrivi il path su /index.php
    • Dato che state usando last i processi iniziano (rompendo il block di posizione)
    • /index.php è ora acquisito dal location /app block .

    Il problema sopra indicato, con la direttiva root, è aggravato quando si passa al block di posizione dell'app. A differenza del block "notizie", in cui è ansible eliminare semplicemente "notizie" dal path (poiché verrà aggiunto nuovamente), non è ansible eseguire questa operazione per il path app, che termina in "webroot".

    La soluzione consiste nella direttiva alias . Questo non modifica il file document_ro, ma modifica il path di file utilizzato per eseguire la richiesta. Purtroppo, la rewrite e try_files tendono a comportrsi un po 'inaspettatamente con alias .

    Cominciamo con un semplice esempio – nessun PHP – solo HTML e il tuo block Perl – ma con una struttura di cartelle corrispondente a te (testato su Nginx 1.0.12, CentOS 6):

     server { server_name example.org; error_log /var/log/nginx/example.org.error.log notice; access_log /var/log/nginx/example.org.access.log; rewrite_log on; location = / { rewrite ^ /index.pl last; } location ^~ /community { rewrite ^ /index.pl last; } location ~ \.pl { root /var/www/vhosts/home; [fastcgi_stuff...] } location ^~ /news { alias /var/www/vhosts/news; index index.htm; try_files $uri $uri/ /news/index.htm; } location ^~ /app { alias /var/www/vhosts/app/app/webroot; index index.htm; try_files $uri $uri/ /app/index.htm; } location / { rewrite ^/(.*) /app/$1 last; } } 
    • location = / – corrisponde solo al path root
    • location ^~ /community – corrisponderà a each path che inizia con / community
    • location ~ \.pl – corrisponderà a tutti i file che contengono .pl
    • location ^~ /news – corrisponderà a each path che inizia con / news
    • location ^~ /app – corrisponderà a each path che inizia con / app
    • location / – corrisponderà a tutti i routes non corrispondenti sopra

    Dovresti essere in grado di rimuovere il ^~ – ma può offrire un leggero miglioramento delle performance, poiché smette di cercare una volta trovato un incontro.

    Mentre dovrebbe essere una semplice questione per rimandare i blocchi PHP, c'è purtroppo una leggera difficoltà – try_files (e la tua riscrittura) non finiscono per passare il path desiderato al block di posizione annidato – e utilizzare l' alias solo quando l'estensione è specificata nel block di posizione non funziona.

    Una soluzione è quella di utilizzare blocchi di posizionamento separati che eseguono una cattura insieme alla direttiva alias – non è abbastanza elegante, ma per quanto posso dire, funziona (ancora una volta, testato su Nginx 1.0.12, CentOS 6 – Certo, non ho installato CakePHP, WordPress e Perl – ho usato solo un paio di file PHP e HTML in ciascuna cartella)

     server { server_name example.org; error_log /var/log/nginx/example.org.error.log notice; access_log /var/log/nginx/example.org.access.log; rewrite_log on; location = / { rewrite ^ /index.pl last; } location ^~ /community { rewrite ^ /index.pl last; } location ~ \.pl { root /var/www/vhosts/home; access_log /var/log/nginx/home.access.log; error_log /var/log/nginx/home.error.log; include /etc/nginx/fastcgi_params; fastcgi_index index.pl; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/fcgiwrap.socket; } location /news { access_log /var/log/nginx/news.access.log; error_log /var/log/nginx/news.error.log notice; alias /var/www/vhosts/news; index index.php; try_files $uri $uri/ /news/index.php; } location ~* ^/news/(.*\.php)$ { access_log /var/log/nginx/news.php.access.log; error_log /var/log/nginx/news.php.error.log notice; alias /var/www/vhosts/news/$1; try_files "" /news/index.php; include /etc/nginx/fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_NAME $1; fastcgi_param SCRIPT_FILENAME /var/www/vhosts/news/$1; fastcgi_pass 127.0.0.1:9000; } location /app { alias /var/www/vhosts/app/app/webroot; access_log /var/log/nginx/app.access.log; error_log /var/log/nginx/app.error.log notice; index index.php; try_files $uri $uri/ /app/index.php; } location ~* ^/app/(.*\.php)$ { access_log /var/log/nginx/news.access.log; error_log /var/log/nginx/news.error.log notice; alias /var/www/vhosts/app/app/webroot/$1; try_files "" /app/index.php; include /etc/nginx/fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_NAME $1; fastcgi_param SCRIPT_FILENAME /var/www/vhosts/app/app/webroot/$1; fastcgi_pass 127.0.0.1:9000; } location / { rewrite ^/(.*) /app/$1 last; } } 

    La configuration sopra, prende la semplice sopra e fa due modifiche:

    • Aggiungi due blocchi di posizione:
      • location ~* ^/news/(.*\.php)$ – corrisponderà a tutti i file che terminano in .php, con routes che iniziano con / news /
      • location ~* ^/app/(.*\.php)$ – corrisponderà a tutti i file che terminano in .php, con routes che iniziano con / app /
    • Rimuovi la corrispondenza di ^~ – questo è necessario affinché i due blocchi di posizione aggiunti possano corrispondere ai routes (altrimenti la corrispondenza si arresta sui blocchi / news o / app).

    Va notato che l'ordine di corrispondenza delle posizioni è molto importnte qui:

    • Le corrispondenze esatte (usando = )
    • Corrisponde con ^~ secondo
    • Blocchi di regex corrispondenti
    • Le stringhe convenzionali – solo se non è stata trovata alcuna corrispondenza regex

    Una regex corrispondente sostituirà una string retta!

    Un punto importnte di menzione è che quando le acquisizioni vengono utilizzate con alias, l'integer URL viene sostituito – non solo la cartella principale. Purtroppo, questo significa che $fastcgi_script_name è rimasto vuoto – quindi, ho usato $1 sopra invece.

    Sono sicuro che dovrai fare qualche cambiamento, ma la premessa fondamentale dovrebbe essere funzionale. Dovresti essere in grado di separare i blocchi in più file, se necessario – l'ordinazione non dovrebbe influenzare la configuration.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.