NGINX está dando erros 404 em todas, exceto nas páginas HTML

5

Eu configurei o nginx como um proxy reverso em um contêiner docker para vincular a sites fora do contêiner. Eu tenho uma configuração de configuração vhost da seguinte forma (eu tentei adicionar o ^ ~ antes da localização para o home-assistant):

server { # simple reverse-proxy
    listen       80;

    location / {
        proxy_pass http://192.168.1.99:6789;
    }

    location ^~ /home-assistant {
        proxy_pass http://192.168.1.99:8123/;
    }

    location /calibre-web/ {
        proxy_pass http://192.168.1.99:8181/;
    }

  }

Para sites de home-assistant e caliber-web, a página é carregada, mas recebo erros 404 para todos os outros itens (imagens, CSS, etc ...). Se eu tentar clicar em um link nos aplicativos, ele me vinculará a 192.168.1.99/file e não a 192.168.1.99/site-folder/file como deveria . Abaixo estão alguns registros dos logs (observe a resposta 200 e as outras 404 respostas). O que eu estou fazendo errado aqui? Agradecemos antecipadamente pela ajuda.

192.168.1.6 - randy [15/Aug/2016:03:15:42 +0000] "GET /frontend/panels/dev-template-0a099d4589636ed3038a3e9f020468a7.html HTTP/1.1" 404 199 "http://192.168.1.99/home-assistant/" "Mozilla/5.0 (X11; CrOS x86_64 8350.60.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.85 Safari/537.36"

192.168.1.6 - randy [15/Aug/2016:03:15:42 +0000] "GET /frontend/panels/logbook-66108d82763359a218c9695f0553de40.html HTTP/1.1" 404 199 "http://192.168.1.99/home-assistant/" "Mozilla/5.0 (X11; CrOS x86_64 8350.60.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.85 Safari/537.36"

192.168.1.6 - randy [15/Aug/2016:03:17:54 +0000] "GET /home-assistant/ HTTP/1.1" 200 1654 "-" "Mozilla/5.0 (X11; CrOS x86_64 8350.60.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.85 Safari/537.36"

192.168.1.6 - randy [15/Aug/2016:03:17:55 +0000] "GET /static/icons/favicon-192x192.png HTTP/1.1" 404 91 "http://192.168.1.99/home-assistant/" "Mozilla/5.0 (X11; CrOS x86_64 8350.60.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.85 Safari/537.36"

192.168.1.6 - randy [15/Aug/2016:03:17:55 +0000] "GET /static/core-457d5acd123e7dc38947c07984b3a5e8.js HTTP/1.1" 404 91 "http://192.168.1.99/home-assistant/" "Mozilla/5.0 (X11; CrOS x86_64 8350.60.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.85 Safari/537.36"

Aqui está uma cópia do meu root nginx.conf . Eu estou supondo que o erro está aqui em algum lugar, eu apenas não consigo descobrir onde.

    
por Randy 15.08.2016 / 19:11

2 respostas

2

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.

    
por 16.08.2016 / 02:37
2

Uma solução pode não ser passar um URI na diretiva proxy_pass :

location ^~ /home-assistant {
    proxy_pass http://192.168.1.99:8123;
}

location ^~ /calibre-web/ {
    proxy_pass http://192.168.1.99:8181;
}

Observe o caractere / ausente após o número da porta na instrução proxy_pass . Isso significa que o nginx passará o URI enviado ao servidor para o servidor de aplicativos.

Com o caractere / (URI), ele substituirá o URI de solicitação por isso.

Esse comportamento está documentado no link

    
por 17.08.2016 / 01:52