Quero entender por que isso acontece. Quando uso proxy_pass sem expressões regulares, tudo funciona muito bem , o DNS é resolvido, e assim por diante.
location /images/ {
proxy_pass http://sfs-filer:8888;
proxy_set_header Host $host;
}
Mas assim que adiciono expressões regulares, ele começa a gerar um ERRO.
[erro] 29#29: *442 nenhum resolvedor definido para resolver sfs-filer, cliente: 172.18.0.1, servidor: , solicitação: "GET /9395123a-39bd-4951-acd9-e759fae2e7f4.webp HTTP/1.1", host: "localhost"
location ~ ([a-zA-Z0-9-]+\.(jpg|jpeg|png|gif|webp|bmp|avif))$ {
proxy_pass http://sfs-filer:8888/$1;
proxy_set_header Host $host;
}
Observe que em proxy_pass eu não altero o domínio de forma alguma , ele permanece 1 para 1 como no primeiro exemplo. Como isso é possível? Por que o resolver depende de expressões regulares?
Sim, eu posso adicionar resolver 127.0.0.11 valid=10s;
e vai funcionar. Mas a essência disso é um mistério absoluto para mim.
Quando seu
proxy_pass
argumento de diretiva inclui variáveis, o nginx não resolve seu IP upstream no momento da inicialização, como normalmente faz, mas tenta fazer isso durante o processamento da solicitação, precisando, portanto, que um resolvedor seja definido. Sua pergunta é quase a mesma da pergunta Como usar o nginxproxy_pass
com$remote_addr
? , e a resposta pode ser encontrada em uma postagem de blog referenciada pela segunda resposta: Proxy pass and resolver :Eu tenho minha própria resposta lá também, mostrando como o problema pode ser resolvido sem usar a
resolver
diretiva. A única diferença é que você está usando regex location, e você precisa de capturas nomeadas para usar a mesma técnica, já que quaisquer capturas numeradas serão sobrescritas durante arewrite
execução da diretiva:Há outras maneiras de evitar a
resolver
diretiva. Por exemplo, a seguinte configuração não deve requerê-la:(aqui o
sfs-filer
endereço IP do servidor de backend será resolvido na inicialização do nginx.)Definir seu servidor backend usando endereço IP em vez do nome de domínio também não exigirá que o resolver seja definido. Por exemplo, a seguinte diretiva
exigirá um resolvedor, enquanto o
a diretiva não exigirá isso.