Comment servir tous les fichiers statiques existants directement avec Nginx, mais le reste proxy à un serveur de back-end.

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

Question

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 sert tous les fichiers existants en utilisant directement Nginx (par exemple Nginx qu'afficher code source PHP), sinon avant une demande d'Apache. Je dois exclure des fichiers * .php de la règle afin que les demandes de * .php sont également transmises à Apache et traitées.

Je veux Nginx gérer tous les fichiers statiques et Apache pour traiter toutes les choses dynamiques.

EDIT:. Il approche de liste blanche, mais il est très élégant, Voir toutes ces extensions, je ne veux pas

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 versions plus récentes d'utilisation Nginx au lieu try_files rel="noreferrer"> http://wiki.nginx.org / HttpCoreModule # try_files

Était-ce utile?

La solution

Utilisez try_files et bloc d'emplacement nommé ( '@apachesite'). Cela supprimera match regex inutile et si le bloc. 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: La prise en charge de cette configuration est qu'il n'existe pas de script php sous /path/to/root/of/static/files. Cette situation est commune dans la plupart des cadres php modernes. Dans le cas où vos anciens projets php ont deux scripts php et les fichiers statiques mélangés dans le même dossier, vous pouvez avoir à la liste blanche tous les types de fichiers que vous souhaitez nginx servir.

Autres conseils

Essayez ceci:

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 régulières ont une priorité plus élevée que les chaînes simples, si toutes les demandes se terminent par devraient être forwared .php à Apache si seulement existe correspondante fichier <=>. Reste seront traitées sous forme de fichiers statiques. L'algorithme d'évaluation réelle emplacement est .

Si vous utilisez mod_rewrite pour cacher l'extension de vos scripts, ou si vous comme jolies URL qui se terminent par /, alors vous voudrez peut-être aborder ce dans l'autre sens. Dites-nginx de laisser quoi que ce soit 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top