Come servire tutti i file statici esistenti direttamente con NGINX, ma proxy il resto a un server di backend.

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

Sopra servirà tutti i file esistenti direttamente usando Nginx (ad es. Nginx mostra solo il codice sorgente PHP), altrimenti inoltra una richiesta ad Apache. Devo escludere i file * .php dalla regola in modo che anche le richieste di * .php vengano passate ad Apache e processate.

Voglio che Nginx gestisca tutti i file statici e Apache per elaborare tutte le cose dinamiche.

EDIT: C’è un approccio alla lista bianca, ma non è molto elegante, vedi tutte quelle estensioni, non voglio 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: sulle versioni più recenti di Nginx usa invece try_files http://wiki.nginx.org/HttpCoreModule#try_files

Usa try_files e named location block (‘@apachesite’). Questo rimuoverà la combinazione di espressioni regolari non necessarie e se il blocco. 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’ipotesi di questa configurazione è che non esiste uno script php in /path/to/root/of/static/files . Questo è comune nella maggior parte dei framework php moderni. Nel caso in cui i progetti di php precedenti abbiano sia script php che file statici misti nella stessa cartella, potrebbe essere necessario autorizzare tutti i tipi di file che si desidera vengano utilizzati da nginx.

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

Spero che funzioni. Le espressioni regolari hanno una priorità più alta delle semplici stringhe, quindi tutte le richieste che terminano con .php devono essere fornite ad Apache se esiste solo un file .php corrispondente. Il resto sarà gestito come file statici. L’algoritmo attuale di valutare la posizione è qui .

Se usi mod_rewrite per hide l’estensione dei tuoi script, o se ti piacciono gli URL piuttosto che terminano in /, allora potresti voler affrontare questo da un’altra direzione. Di ‘a nginx di lasciare che qualsiasi cosa con un’estensione non statica passi attraverso Apache. Per 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 snippet all’indirizzo: http://code.google.com/p/scalr/wiki/NginxStatic