80 votes

Comment servir tous les fichiers statiques existants directement avec NGINX, mais le proxy à Apache le reste?

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; # Apache listening
        break;
        }
    }

Ci-dessus serviront de tous les fichiers existants directement à l'aide de Nginx (par exemple, Nginx affiche simplement le code source PHP), autrement transmettre une demande de Apache. J'ai besoin d'exclure *.les fichiers php à partir de la règle ainsi que les demandes d' *.php sont également transmis à Apache et traitées.

Je veux Nginx pour gérer tous les fichiers statiques et Apache ensemble des processus de dynamique des choses.

EDIT: Il y a une liste blanche approche, mais il n'est pas très élégant, Voir tous ces extensions, je ne veux pas de cela.

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: Sur les nouvelles versions de Nginx utiliser try_files au lieu http://wiki.nginx.org/HttpCoreModule#try_files

147voto

Chuan Ma Points 3191

Utilisez try_files et le bloc d'emplacement nommé ('@apachesite'). Cela supprimera les correspondances inutiles et si elles sont bloquées. Plus efficace.

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

18voto

Jasiu Points 1346

Essaye ça:

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

Espérons que cela fonctionne. La priorité des expressions rationnelles est supérieure à celle des chaînes en clair. Par conséquent, toutes les demandes se terminant par .php doivent être annulées par Apache si seul un fichier correspondant .php existe. Reste sera traité comme des fichiers statiques. L'algorithme actuel d'évaluation de l'emplacement est ici .

6voto

lo_fye Points 4422

Si vous utilisez mod_rewrite pour masquer l’extension de vos scripts, ou si vous aimez simplement les jolies URL se terminant par /, vous voudrez peut-être aborder cette question dans l’autre sens. Dites à nginx de laisser n'importe quoi avec une extension non statique passer par apache. Par exemple:

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

J'ai trouvé la première partie de cet extrait sur: http://code.google.com/p/scalr/wiki/NginxStatic

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X