nginx:リバースプロキシで特定のファイル名(* .txt)に対して404を直接処理する方法は?

nginx:リバースプロキシで特定のファイル名(* .txt)に対して404を直接処理する方法は?

nginxポート80と443のフロントエンドがnginxTLSを含むすべての外部アクセスを処理する複雑な設定があります。

frontend-nginxにあるファイルの場合、/texts要求は、CPUやその他のリソースを消費する複雑なプロセスで既存のテキストファイルを動的に変更する2番目の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

おすすめ記事