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 diretamente usando Nginx (por exemplo, Nginx apenas exibe o código-fonte PHP), caso contrário, encaminhará uma solicitação ao Apache. Preciso excluir arquivos * .php da regra para que as solicitações para * .php também sejam passadas para o Apache e processadas.
Eu quero que o Nginx trate todos os arquivos estáticos e o Apache para processar todas as coisas dinâmicas.
EDIT: Existe uma abordagem de lista branca, mas não é muito elegante, veja todas essas extensões, eu não quero 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 uso Nginx try_files
vez http://wiki.nginx.org/HttpCoreModule#try_files
nginx
reverse-proxy
static-files
Fmalina
fonte
fonte
Respostas:
Use try_files e bloco de localização nomeado ('@apachesite'). Isso removerá a correspondência de regex desnecessária e se bloquear. Mais eficiente.
Update: O pressuposto desta configuração é que não existe nenhum script php sob
/path/to/root/of/static/files
. Isso é comum na maioria dos frameworks php modernos. No caso de seus projetos legados de php terem scripts php e arquivos estáticos misturados na mesma pasta, você pode ter que colocar na lista de permissões todos os tipos de arquivos que deseja que o nginx sirva.fonte
$uri/
então funciona.root /path/to/root/of/*static*/files;
. Os arquivos php devem ser colocados em uma pasta diferente, não acessível diretamente da Internet.Experimente isto:
Espero que funcione. Expressões regulares têm maior prioridade do que strings simples, portanto, todas as solicitações que terminam em
.php
devem ser encaminhadas ao Apache se houver apenas um.php
arquivo correspondente . O resto será tratado como arquivos estáticos. O algoritmo real de avaliação da localização está aqui .fonte
Se você usa mod_rewrite para ocultar a extensão de seus scripts, ou se você apenas gosta de URLs bonitos que terminam em /, então você pode querer abordar isso de outra direção. Diga ao nginx para deixar qualquer coisa com uma extensão não estática passar para o apache. Por exemplo:
Encontrei a primeira parte deste snippet em: http://code.google.com/p/scalr/wiki/NginxStatic
fonte