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.