Come servire tutti i file statici esistenti direttamente con Nginx, ma delega il resto a un server back-end.

StackOverflow https://stackoverflow.com/questions/869001

Domanda

location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    if (-f $request_filename) {
        access_log off;
        expires 30d;
        break;
        }

    if (!-f $request_filename) {
        proxy_pass http://127.0.0.1:8080; # backend server listening
        break;
        }
    }

Soprattutto servirà tutti i file esistenti direttamente utilizzando Nginx (ad esempio Nginx mostra solo il codice sorgente PHP), altrimenti avanti una richiesta di Apache. Ho bisogno di escludere i file * .php dalla regola in modo che le richieste di * .php sono anche passati ad Apache ed elaborati.

Voglio Nginx per gestire tutti i file statici e Apache per elaborare tutta roba dinamica.

EDIT:. C'è approccio lista bianca, ma non è molto elegante, Vedi tutte quelle estensioni, non voglio che questo

location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
    access_log off;
    expires 30d;
    }
location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
    }

EDIT 2: Nelle versioni più recenti di utilizzo Nginx try_files invece http://wiki.nginx.org / HttpCoreModule # try_files

È stato utile?

Soluzione

try_files blocco posizione denominata e ( '@apachesite'). Questo eliminerà partita regex inutili e blocco if. Più efficiente.

location / {
    root /path/to/root/of/static/files;
    try_files $uri $uri/ @apachesite;

    expires max;
    access_log off;
}

location @apachesite {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

Aggiornamento: L'assunzione di questo config è che non esiste alcun script PHP sotto /path/to/root/of/static/files. Questo è comune nella maggior parte dei framework PHP moderni. Nel caso in cui i vostri progetti legacy php avere entrambi i script PHP e file statici mescolati nella stessa cartella, potrebbe essere necessario whitelist tutti i tipi di file che si desidera nginx a servire.

Altri suggerimenti

Prova questo:

location / {
    root /path/to/root;
    expires 30d;
    access_log off;
}

location ~* ^.*\.php$ {
    if (!-f $request_filename) {
        return 404;
    }
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

Speriamo che funziona. Le espressioni regolari hanno una priorità superiore rispetto alle comuni corde semplici, in modo tutte le richieste che terminano in .php dovrebbero essere forwared ad Apache se solo un corrispondente <=> file esiste. Resto sarà gestito come file statici. L'algoritmo effettivo di valutare la posizione è qui .

Se si utilizza mod_rewrite per nascondere l'estensione degli script, o se, proprio come gli URL piuttosto che terminano con /, allora si potrebbe desiderare di avvicinarsi a questo dalla direzione opposta. Dillo nginx di lasciare qualsiasi cosa con un'estensione non statico di passare attraverso ad Apache. Ad esempio:

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
{
    root   /path/to/static-content;
}

location ~* ^!.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ {
    if (!-f $request_filename) {
        return 404;
    }
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

Ho trovato la prima parte di questo frammento sopra a: http://code.google .com / p / scalr / wiki / NginxStatic

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top