Faça proxy de todas as solicitações do Nginx para um back-end, exceto um arquivo estático

Faça proxy de todas as solicitações do Nginx para um back-end, exceto um arquivo estático

Eu uso o Nginx para reverter o proxy de uma API de back-end. No entanto, gostaria que o Nginx servisse um arquivo estático chamado "readme.html" quando uma solicitação fosse feita para "/".

Fiz uma extensa pesquisa. A solução mais promissora parecia ser esta:https://stackoverflow.com/a/15467555/2237433.

Tentando aplicar essa solução ao meu caso, aqui está o meu código. Aqui está meu Dockerfile:

# syntax=docker/dockerfile:1
FROM nginx:1.22.0-alpine
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./readme.html /www/
EXPOSE 80

Com meu contêiner Nginx em execução, posso me conectar a um shell nele e executar cat /www/readme.htmlpara confirmar se o arquivo está realmente presente.

Agora aqui está meu nginx.conf:

# a lot of stuff
http {
    # a lot of stuff
    proxy_cache_path  /data/nginx/cache keys_zone=my-zone:10m;
    server {

        listen 80;
        add_header X-Cache-Status $upstream_cache_status always;

        location / {
            root /www/;
            try_files readme.html @backend;
        }

        location @backend {
            proxy_pass http://api:8080;
            proxy_cache my-zone;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
            proxy_cache_lock on;
        }

    }
}

Com esta configuração, todos os meus caminhos funcionam conforme o esperado, exceto que quando executo uma solicitação em "/", recebo um erro 404. O 404, na verdade, vem do backend. Aqui está o log do back-end após a solicitação:

[20/Jun/2022 01:51:06] "GET / HTTP/1.0" 404 -

Portanto, a solicitação "/" foi realmente passada para o back-end.

Tentei um grande número de ajustes nessa configuração, mas sem sucesso. Obrigado pela ajuda!

Responder1

Você pode reescrever explicitamente o URI da solicitação "raiz":

location = / {
    root /www;
    rewrite ^ /readme.html break;
}
location / {
    proxy_pass http://api:8080;
    ...
}

Ou você pode usar readme.htmlcomo arquivo de índice:

location / {
    root /www;
    index readme.html;
    try_files $uri $uri/ @backend;
}

Responder2

Encontrei uma solução funcional. Acontece que o location /bloco tinha que ser assim:

location / {
    root /www;
    try_files $uri/readme.html @backend;
}

Não posso dizer que realmente entendo o porquê, então se alguém puder explicar o motivo por trás disso, ficaria grato.

informação relacionada