Você está tentando proxy_pass solicitações de um local desconhecido para o aplicativo original. No aplicativo de contêiner do Docker ainda acredita que ele é acessado a partir da raiz do site ( http://192.168.1.99:8123/
), portanto, ele gera todas as URLs relativas a /
, não ao seu /home-assistant/
ou /calibre-web/
.
Existem várias maneiras de resolver esse problema. Você deve escolher o que funciona melhor para você:
1. Substituindo links no html com proxy
Antes de mais nada, ele está substituindo cada link recebido do aplicativo proxy antes de enviar o resultado para o cliente com ngx_http_sub_module . Ele não está ativado por padrão, então você pode ter que compile o nginx da fonte se a sua distro não o tiver (para verificar a disponibilidade deste módulo, execute nginx -V
, que deve exibir --with-http_sub_module
em algum lugar nos parâmetros de configuração).
Se você escolher esse método, adicione as seguintes diretivas à sua configuração:
location ^~ /home-assistant {
rewrite ^/home-assistant(/.*)$ $1 break;
proxy_pass http://192.168.1.99:8123/;
sub_filter "<head>" "<head><base href=\"${scheme}://${host}/home-assistant\">";
}
2. Alterando o caminho do aplicativo dentro do contêiner
Mover o aplicativo dentro do contêiner do docker para o /home-assistant
em vez de raiz, para gerar todos os URLs no conteúdo veiculado relacionados a esse caminho, em vez do root /
. Esta é uma solução óbvia (e provavelmente a mais fácil), que não requer tocar nas configurações do nginx (em vez disso, você edita a configuração dentro do docker)
3. Escolhendo upstream com base no cabeçalho Referer
Determinando qual upstream deve ser usado com base no cabeçalho Referer
. Extraído daqui . Parece muito inteligente, apesar de eu não usá-lo na produção (note que só funciona para arquivos css / js).
location ~* ^/(css|js)/.+\.(css|js)$ {
#checking if referer is from home-assistant
if ($http_referer ~ "^.*/home-assistant"){
return 417;
}
#checking if referer is from calibre-web
if ($http_referer ~ "^.*/calibre-web"){
return 418;
}
}
error_page 417 /home-assistant$request_uri;
error_page 418 /calibre-web$request_uri;
location ^~ /home-assistant {
proxy_pass http://192.168.1.99:8123/;
}
location /calibre-web {
proxy_pass http://192.168.1.99:8181/;
}
Se eu fosse você, escolheria o # 2 - mover aplicativos dentro do contêiner como o mais fácil & a maneira menos propensa a erros de obter o que você precisa.
P.S. Eu esqueci completamente que você pode servir arquivos estáticos diretamente do seu disco rígido, já que seu back-end está no mesmo servidor que o nginx. Isso exigirá alguma configuração dependente de aplicativo, mas, como resultado, você obterá a solução mais eficiente.