我使用 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;
}