【问题标题】:Nginx - how to return a proxy generated file?Nginx - 如何返回代理生成的文件?
【发布时间】:2014-04-16 11:30:28
【问题描述】:

说明:

我想实现一个服务于静态文件的 http 服务器(使用 nginx)。

如果请求的文件不存在,nginx 将向服务(REST API)发送请求,该服务将创建文件并返回其路径。

之后,我希望 nginx 返回创建的静态文件。

问题:

创建文件后返回文件的最佳方式是什么?

到目前为止,我设法通过更改 REST API 以返回创建的文件路径以及 302 状态代码和位置标头作为重定向来做到这一点,但我不确定这是否是一件好事.是吗?

有 nginx 端的解决方案吗?我必须创建自定义模块吗?

配置文件:

http {
    server {
        listen 80;

        location /files {
            try_files $uri @rest;
        }

        location @rest {
            rewrite ^(.*)$ /api/ break;
            proxy_set_header Host      $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass       http://localhost:8080;
        }
    }
}

【问题讨论】:

  • 听起来你想要的实际上是 REST API 前面的缓存,这是 ngx_http_proxy_module 已经可以自己处理的东西......
  • @DaveRandom 我不确定缓存是否是答案。创建文件后,它应该可用作以下请求的静态内容(直接由 nginx 提供服务)。缓存只能提供临时内容吧?
  • 如果您在 REST API 中设置标头以使文件缓存 10 年,那么 Nginx 将有效地静态服务该文件 10 年。这取决于您的目标是什么——如果您只是想避免在 API 中多次执行昂贵的任务,那么您真正需要的只是缓存。如果您确实特别希望文件存在(例如,因为其他一些本地进程需要它们),那么我想您唯一能做的就是创建一个自定义模块。下面的解决方案并不理想,因为您需要调整 REST API 响应。

标签: http rest nginx reverse-proxy


【解决方案1】:

编辑:实际上,总的来说,这应该更简单:

location @rest {
    ...
    proxy_intercept_errors on;
    error_page     404 = $uri;
}

配置命名位置以拦截返回的“错误”(我选择了 404),然后使用error_page 指令将导致再次加载给定的 URI。由于该文件现在存在,因此请求应该成功。

旁注:我原以为try_files $uri @rest $uri 会起作用,但内部重定向只发生在最后一个参数上。


这里最简单的选项可能是让您的 REST 服务使用 X-Sendfile/X-Accel 返回创建文件后 Nginx 应提供的相关 URI。您的 REST 服务可以使用标头 X-Accel-Redirect 返回目标 URI。

在您的情况下,您的 API 实际上可能只是返回它收到的与 X-Accel-Redirect 标头相同的 URI,然后 Nginx 将重新使用相同的位置块并找到发生子请求的文件。

但是,如果失败,请按照 http://wiki.nginx.org/XSendfilehttp://wiki.nginx.org/X-accel 的示例使用内部 Nginx 位置:

location /files-protected {
    internal;
    root /path/to/files;
}

并返回相关的 URI 也可以。

【讨论】:

  • 谢谢!这似乎可行,但我想知道是否有 NGINX 方面的解决方案。我对更改响应标头持怀疑态度,因为在我看来,这样做是在创建依赖项,因为我使用 REST API 发送 nginx 标头,对吧?
  • 查看上面的更新编辑。从 REST API 拦截错误并配置 error_page 将使您能够再次尝试访问新创建的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2021-03-06
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
相关资源
最近更新 更多