Entendendo location paths e proxy_pass do Nginx
Essa semana tive um problema um tanto complicado para resolver com o Nginx, mas acabei caindo em um texto excelente com uma explicação simples. Resolvi traduzir, assim tenho como referencia para mim e ajudo outros. O texto é simples porque espera que já se tenha um conhecimento pelo menos básico do Nginx. (reforçando que a pronuncia é EngineX)
Se você tem os seguinte blocos de configuração
location / {
proxy_pass http://127.0.0.1:8080;
}
e
location / {
proxy_pass http://127.0.0.1:8080/;
}
Ambos são a mesma coisa no final, quando chamamos o endereço /abc/def
no nosso servidor ele vai chamar o endereço da request como http://127.0.0.1:8080/abc/def
Mas assim que precisarmos de um novo bloco para uma outra aplicação que não seja o endereço raiz como no caminho abaixo
location /app {
proxy_pass http://localhost:8080;
}
A configuração abaixo já não é mais a mesma da configuração acim
location /app/ {
proxy_pass http://localhost:8080/;
}
A tabela abaixo mostra as diferenças
Cenário | Location | proxy_pass | URL | path |
---|---|---|---|---|
1 | /test1 | http://127.0.0.1:8080 | /test1/abc/test | /test1/abc/test |
2 | /test2 | http://127.0.0.1:8080/ | /test2/abc/test | //abc/test |
3 | /test3/ | http://127.0.0.1:8080 | /test3/abc/test | /test3/abc/test |
4 | /test4/ | http://127.0.0.1:8080/ | /test4/abc/test | /abc/test |
5 | /test5 | http://127.0.0.1:8080/app1 | /test5/abc/test | app1/abc/test |
6 | /test6 | http://127.0.0.1:8080/app1/ | /test6/abc/test | /app1//abc/test |
7 | /test7/ | http://127.0.0.1:8080/app1 | /test7/abc/test | /app1abc/test |
8 | /test8/ | http://127.0.0.1:8080/app1/ | /test8/abc/test | /app1/abc/test |
9 | / | http://127.0.0.1:8080 | /test9/abc/test | /test9/abc/test |
10 | / | http://127.0.0.1:8080/ | /test10/abc/test | /test10/abc/test |
11 | / | http://127.0.0.1:8080/app1 | /test11/abc/test | /app1test11/abc/test |
12 | / | http://127.0.0.1:8080/app2 | /test12/abc/test | /app2/test12/abc/test |
Observe o cenário 4 em que ao ter a barra / no proxy_pass
a parte da url location
no bloco é removida da url e passa para a aplicação o restante após isso.
Você pode encontrar o texto original em inglês aqui.