nginx: 역방향 프록시에서 특정 파일 이름(*.txt)에 대해 404를 직접 처리하는 방법은 무엇입니까?

nginx: 역방향 프록시에서 특정 파일 이름(*.txt)에 대해 404를 직접 처리하는 방법은 무엇입니까?

nginx포트 80 및 443의 프런트엔드가 nginxTLS를 포함한 모든 외부 액세스를 처리하는 복잡한 설정이 있습니다 .

frontend-nginx에 있는 파일의 경우 /texts요청은 CPU 및 기타 리소스를 소비하는 복잡한 프로세스에서 기존 텍스트 파일을 동적으로 수정하는 두 번째 backend-nginx로 프록시되어야 합니다.

존재하지 않는 파일 *.txt(404)의 경우 백엔드를 전혀 방해하지 않고 기본 파일을 클라이언트에 직접 제공하고 싶습니다 /texts/default.txt. 그러나 현재 존재하지 않는 파일은 여전히 error_page 404​​백엔드 회로에서만 처리될 수 있습니다. 기존 파일을 제공하는 데 문제가 없으며 프록시가 작동합니다.

내 구성은 다음과 같습니다.

frontend-nginx.conf:
http {
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  frontend.example.org;
        root         /srv/www;

        location /texts/ {

            location ~ \*.txt$ {
                root /srv/www/backend;

                ####### the next line has absolutely no effect
                try_files $uri /texts/default.txt;
            }

            proxy_pass          http://localhost:90;
            proxy_redirect      http://localhost:90/ /;
            proxy_set_header    Host             $host;
            proxy_set_header    X-Real-IP        $remote_addr;
            proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header    X-Client-Verify  SUCCESS;
            proxy_set_header    Upgrade          $http_upgrade;
            proxy_set_header    Connection       "upgrade";
            proxy_http_version  1.1;

            proxy_redirect off;
        }
    }
    # https goes here, all the same except TLS
}
backend-nginx.conf:
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    server {
        listen       127.0.0.1:90;

        root /srv/www/backend;
        charset utf-8;

        expires -1;  # no-cache
        location ~ /..*\.txt$ {
            # longer cache time for text files
            expires 10m;

            # this actually works but only here in the backend
            error_page  404 @404;
        }

        location @404 {
            return 302 $scheme://frontend.example.org/texts/default.txt
        }
    }
}

내 프런트엔드 구성 파일에 404 리디렉션을 처리하는 것처럼 보이는 쓸모없는 설명이 있지만 default.txt실제로는

wget -v http://frontend.example.org/texts/notexist.txt

백엔드 내부에서만 리디렉션을 받습니다(따라서 프록싱이 발생합니다).

답변1

location /texts/ {
    proxy_set_header ...;
    proxy_pass ...;

    location ~ \.txt$ {
        root /path/to/root;
        try_files $uri /texts/default.txt;
        proxy_pass ...;
    }
}
location = /texts/default.txt {
    root /path/to/root;
}

이 명령문에 대한 올바른 정규식을 기록해 두십시오 location. 이러한 proxy_set_header문은 상속되지만 proxy_pass문은 중첩된 location.

try_files명령문은 파일이 존재하는지 확인하고 존재하지 않으면 URI를 변경합니다.

기본 파일에는 location파일을 올바른 루트 디렉터리에서 정적 파일로 사용할 수 있도록 전용 파일이 있습니다.

파일 경로는 의 값 과 URI를 root연결하여 구성 되므로 파일은 /texts/default.txt에 위치합니다 /path/to/root/texts/default.txt.

관련 정보