Como servir todos os arquivos estáticos existentes diretamente com NGINX, mas procuração o resto para um servidor back-end.

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

Pergunta

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

Acima servirá todos os arquivos existentes directamente utilizando Nginx (por exemplo Nginx apenas exibe PHP código fonte), caso contrário, apresentou uma solicitação para Apache. Eu preciso excluir * .php arquivos da regra para que as solicitações para * .php também são passados ??para Apache e processados.

Eu quero Nginx para lidar com todos os arquivos estáticos e Apache para processar todo o material dinâmico.

EDIT:. Há abordagem lista branca, mas não é muito elegante, ver todas aquelas extensões, eu não quero que isso

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: Em versões mais recentes do Nginx uso try_files vez http://wiki.nginx.org/HttpCoreModule #try_files

Foi útil?

Solução

Use try_files e nomeado bloco localização ( '@apachesite'). Isto irá remover match regex desnecessária e se bloco. Mais eficiente.

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

Update: O pressuposto desta configuração é que não existe qualquer script php sob /path/to/root/of/static/files. Isso é comum na maioria dos frameworks PHP modernos. No caso de seus projetos PHP legados têm ambos os scripts PHP e arquivos estáticos misturados na mesma pasta, você pode ter que whitelist todos os tipos de arquivo que você quer nginx para servir.

Outras dicas

Tente isto:

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

Esperamos que ele funciona. As expressões regulares têm prioridade maior do que seqüências de caracteres simples, de modo que todas as solicitações que terminam em .php deve ser forwared de Apache, se existe apenas um arquivo .php correspondente. Restante será tratado como arquivos estáticos. O algoritmo real de localização avaliar é aqui .

Se você usar mod_rewrite para esconder a extensão de seus scripts, ou se você apenas como URLs bonitas que terminam em /, então você pode querer abordar esta questão de outra direção. Diga nginx para deixar qualquer coisa com uma extensão não-estático que percorrer para apache. Por exemplo:

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

Eu encontrei a primeira parte deste trecho mais em: http://code.google .com / p / Scalr / wiki / NginxStatic

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top