nginx proxy_pass 后备位置

nginx proxy_pass 后备位置

我使用 nginx 作为我的 Web 应用程序的反向代理,并使用 proxy_pass 作为 api。这是我当前的配置,其中我已设置 nginx 指令位置,/data/其中显示来自我的 docker 容器的 /data 目录的图像。

location /data/ {
    alias /data/;
    error_page 404 = @api;
    recursive_error_pages on;
    log_not_found off;
    autoindex off;
    include cache.conf;
}

location /api/ {
    error_page 418 = @api;
    return 418;
}

location @api {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    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-Forwarded-Proto $scheme;
    proxy_set_header X-NginX-Proxy true;
    proxy_buffering off;
    proxy_request_buffering off;

    proxy_http_version 1.1;
    proxy_pass http://api:1338;
    proxy_cache_bypass $http_upgrade;
}

如何将后备位置添加到同一命名位置 nginx 指令/data/,我需要在其中添加公共 s3 存储桶的 url,proxy_pass并首先尝试使用 proxy_pass 在该 s3 存储桶内搜索该图像,如果找到则从那里提供该图像,如果返回 403 或 404 则使用别名指令,/data/它将从容器的 /data 目录中提供该图像。

我已经尝试使用此配置文件,但是当我使用命令验证 nginx 配置时,它无法通过 nginx 配置规则检查nginx -t,并显示错误nginx: [emerg] the "alias" directive cannot be used inside the named location

server {
    location /data/ {
        proxy_pass http://bucket_url;
        error_page 404 500 502 503 504 = @fallback;
    }

    location @fallback {
        alias /data/;
    }
}

答案1

如果您的/data/字符串来自location /data/ { ... }和别名/data/相等,则可以root在命名位置使用指令:

location @fallback {
    root /;
}

如果这些字符串不同,比如说/data1//data2/,则可以采用以下解决方法:

location @fallback {
    root /;
    rewrite ^/data1(/.*) /data2$1 break;
}

相关内容