web-dev-qa-db-fra.com

Comment servir tous les fichiers statiques existants directement avec NGINX, mais en utilisant un serveur proxy pour 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; # backend server listening
        break;
        }
    }

Ci-dessus servira directement tous les fichiers existants en utilisant Nginx (par exemple, Nginx affiche simplement PHP), sinon transmettez une demande à Apache. Je dois exclure les fichiers * .php de la règle afin que les demandes de * .php sont également transmis à Apache et traités.

Je veux que Nginx gère tous les fichiers statiques et Apache traite tous les éléments dynamiques.

EDIT: Il y a une approche de liste blanche, mais ce n'est pas très élégant, Voir toutes ces extensions, je ne veux pas 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, utilisez try_files au lieu http://wiki.nginx.org/HttpCoreModule#try_files

76
F. Malina

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

Mise à jour: L'hypothèse de cette configuration est qu'il n'existe aucun script php sous /path/to/root/of/static/files. Ceci est courant dans la plupart des frameworks php modernes. Si vos projets php héritent de scripts php et de fichiers statiques mélangés dans le même dossier, vous devrez peut-être ajouter tous les types de fichiers que vous souhaitez que nginx serve.

144
Chuan Ma

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. Les expressions rationnelles ont une priorité plus élevée que les chaînes simples, donc toutes les demandes se terminant par .php devrait être transmis à Apache si seulement un .php le fichier existe. Reste sera traité comme des fichiers statiques. L'algorithme actuel d'évaluation de l'emplacement est ici .

18
Jasiu

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 à Apache tout ce qui porte une extension non statique. 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 à l'adresse suivante: http://code.google.com/p/scalr/wiki/NginxStatic

6
lo_fye