我想为图像提供缩略图,这些缩略图是按需生成的,写入磁盘,然后我想将它们交给 nginx 服务。
我的缩略图根文件夹是/var/www/images
. 当我收到请求时/thumb/post1/image1.jpg
,我想像这样处理它:
- 如果图像存在于 中
/var/www/images/thumb/post1/image1.jpg
,请直接提供。 - 如果图像不存在,则需要生成,因此将请求传递给位于 的 API
@backend
。 - API 生成图像并将其写入缩略图文件夹,然后使用标头将其路径返回给 nginx
X-Accel-Redirect
。 - nginx 在步骤 1 重新开始处理,这将成功,因为文件现在存在。
- 如果请求 thumb 的项目不存在,API 将返回 404,并且 nginx 应该提供位于的占位符图像
/var/www/images/missing.png
。
我的 nginx 配置如下所示:
upstream api {
server localhost:7440 fail_timeout=0;
}
server {
root /var/www/www.example.com/public;
location / {
try_files $uri @backend;
}
location /thumb {
root /var/www/images;
try_files $uri @backend /missing.png;
}
location @backend {
root /var/www/api.example.com/public;
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 Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
proxy_pass http://api;
#For websocket compatibility
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
我的缩略图保存在项目文件夹之外,因此我需要在该位置添加一个root
指令/thumb
以使其在该位置查找图像。该/
位置处理 API 请求和其他静态资产,并且该/thumb
位置执行相同的操作,但也具有回退到missing.png
.
一个怪癖:由于历史原因,我的整个root
文件夹与我的@backend
命名位置使用的文件夹不同,但是,我在两个location
指令中都覆盖了它,并且没有顶级try_files
.
但是,这不起作用。丢失图像的请求不会发送到 API,但丢失图像的后备会发送!如果我删除回退,请求确实会发送到 API,但是切换x-accel-redirect
失败,即使文件现在存在;当拇指图像确实存在时,nginx 不会提供它——它只是再次访问 API。
这应该如何配置?
您的
try_files
说法不正确,命名位置需要是最后一个参数。此外,404响应是块产生的,与块中的语句location @backend
无关。try_files
location /thumb
您应该尝试处理来自后端
proxy_intercept_errors
的error_page
404 响应。例如: