하나의 정적 파일을 제외하고 Nginx의 모든 요청을 백엔드로 프록시합니다.

하나의 정적 파일을 제외하고 Nginx의 모든 요청을 백엔드로 프록시합니다.

Nginx를 사용하여 백엔드 API를 역방향 프록시합니다. 그러나 Nginx가 "/"에 대한 요청이 있을 때 "readme.html"이라는 하나의 정적 파일을 제공하고 싶습니다.

나는 광범위한 연구를 했다. 가장 유망한 솔루션은 다음과 같습니다.https://stackoverflow.com/a/15467555/2237433.

해당 솔루션을 내 사례에 적용하려고 하면 여기에 내 코드가 있습니다. 내 Dockerfile은 다음과 같습니다.

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

Nginx 컨테이너가 실행 중인 상태에서 셸에 연결하고 실행하여 cat /www/readme.html파일이 실제로 존재하는지 확인할 수 있습니다.

이제 내 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;
        }

    }
}

이 구성을 사용하면 "/"에 대한 요청을 실행할 때 404 오류가 발생하는 것을 제외하고 모든 경로가 예상대로 작동합니다. 404는 실제로 백엔드에서 나옵니다. 요청 후 백엔드의 로그는 다음과 같습니다.

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

따라서 "/" 요청이 실제로 백엔드로 전달되었습니다.

해당 구성에서 여러 가지 조정을 시도했지만 소용이 없었습니다. 도와주셔서 감사합니다!

답변1

"루트" 요청 URI를 명시적으로 다시 작성할 수 있습니다.

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

readme.html또는 색인 파일로 사용할 수 있습니다 .

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

답변2

나는 효과적인 해결책을 찾았습니다. 블록 location /은 다음과 같아야 했습니다.

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

하지만 그 이유를 정말로 이해한다고 말할 수는 없으므로 누구든지 이 이유를 설명해 주시면 감사하겠습니다.

관련 정보