AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1034532
Accepted
Synchro
Synchro
Asked: 2020-09-20 03:00:37 +0800 CST2020-09-20 03:00:37 +0800 CST 2020-09-20 03:00:37 +0800 CST

从 nginx 提供动态缓存的图像

  • 772

我想为图像提供缩略图,这些缩略图是按需生成的,写入磁盘,然后我想将它们交给 nginx 服务。

我的缩略图根文件夹是/var/www/images. 当我收到请求时/thumb/post1/image1.jpg,我想像这样处理它:

  1. 如果图像存在于 中/var/www/images/thumb/post1/image1.jpg,请直接提供。
  2. 如果图像不存在,则需要生成,因此将请求传递给位于 的 API @backend。
  3. API 生成图像并将其写入缩略图文件夹,然后使用标头将其路径返回给 nginx X-Accel-Redirect。
  4. nginx 在步骤 1 重新开始处理,这将成功,因为文件现在存在。
  5. 如果请求 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。

这应该如何配置?

nginx
  • 1 1 个回答
  • 835 Views

1 个回答

  • Voted
  1. Best Answer
    Richard Smith
    2020-09-20T05:38:02+08:002020-09-20T05:38:02+08:00

    您的try_files说法不正确,命名位置需要是最后一个参数。此外,404响应是块产生的,与块中的语句location @backend无关。try_fileslocation /thumb

    您应该尝试处理来自后端proxy_intercept_errors的error_page404 响应。

    例如:

    location / {
        try_files $uri @backend1;
    }
    location /thumb {
        root /var/www/images;
        try_files $uri @backend2;
    }
    
    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_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    
    location @backend1 {
        proxy_pass http://api;
    }
    location @backend2 {
        proxy_intercept_errors on;
        error_page 404 /missing.png;
        proxy_pass http://api;
    }
    
    • 1

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve