我正在从具有慢速旋转磁盘的后端存储服务器提供大型静态文件。此服务器隐藏在快速 nginx 反向代理后面,并在 SSD 上具有本地缓存。它运行良好且速度很快。
现在我想更改存储后端,结果我无法在后端维护存储文件的相同位置。它们将不得不从子目录而不是服务器的根目录提供服务。我如何修改 nginx 反向代理配置,以便它将所有非缓存请求代理到后端的子目录,并且客户端不知道发生了任何变化?
我无法在存储服务器上执行任何操作来维护旧的 URL 方案,因此我必须在前端执行此操作。不应在任何地方传递 301/302 标头。
所以目前我有:
- 客户端看到:https://frontend.com/file.txt
- Nginx 从以下位置获取非缓存文件: https://backend.com/file.txt
我想要实现的目标:
- 客户端看到:https://frontend.com/file.txt(客户端没有明显变化)
- Nginx 从以下位置获取非缓存文件:https://backend.com/directory/file.txt
我尝试了几十种配置,但都没有成功。当我尝试这种配置时,它不是默默地从不同的 URL 获取数据,而是陷入通过正则表达式添加测试的无限循环。
location / {
rewrite /(.*) /test/$1 break;
proxy_pass http://f002.backblazeb2.com;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
proxy_cache_revalidate on;
proxy_read_timeout 2;
proxy_connect_timeout 3;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_cache_valid 200 302 60s;
proxy_cache_valid 404 1m;
limit_conn perip 23;
limit_req zone=dynamic burst=60;
expires 24h;
}
答案1
以下有效:
server {
listen 80;
listen [::]:80;
server_name blablabla.com;
proxy_cache one;
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate ....;
ssl_certificate_key ....;
location / {
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
proxy_pass https://f002.backblazeb2.com/file/some-directory/;##$request_uri appended automatically
[...]
}
答案2
以下应该有效:
location / {
proxy_pass http://f002.backblazeb2.com/test$request_uri;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
proxy_cache_revalidate on;
proxy_read_timeout 2;
proxy_connect_timeout 3;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_cache_valid 200 302 60s;
proxy_cache_valid 404 1m;
limit_conn perip 23;
limit_req zone=dynamic burst=60;
expires 24h;
}