proxy - Nginx 代理到本地磁盘或 S3 上的文件

标签 proxy amazon-s3 nginx

所以我将我的网站从 Apache 移到 Nginx,我在这种情况下遇到了麻烦:

用户上传照片。这张照片被调整大小,然后复制到 S3。如果磁盘上有合适的空间(或文件无法传输到 S3),则会保留本地版本。

我希望对这些图像的请求(例如 http://www.mysite.com/p/1_1.jpg )首先在 p/目录中查找。如果不存在本地文件,我想将请求代理到 S3 并呈现图像(但不重定向)。

在 Apache 中,我是这样做的:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^p/([0-9]+_[0-9]+\.jpg)$ http://my_bucket.s3.amazonaws.com/$1 [P,L]

我在 Nginx 中复制这种行为的尝试是这样的:
location /p/ {
    if (-e $request_filename) {
        break;
    }
    proxy_pass http://my_bucket.s3.amazonaws.com/;
}

发生的情况是,每个请求都尝试访问 Amazon S3,即使该文件存在于磁盘上(如果它在 Amazon 上不存在,我也会收到错误消息。)如果我删除了 proxy_pass 行,则对磁盘上文件的请求会起作用.

有想法该怎么解决这个吗?

最佳答案

这不应该是使用 try_files 的示例吗? ?

location /p/ {
    try_files $uri @s3;
}

location @s3{ 
    proxy_pass http://my_bucket.s3.amazonaws.com;
}

确保 S3 url 上没有以下斜杠

关于proxy - Nginx 代理到本地磁盘或 S3 上的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2045869/

相关文章:

html - Amazon s3 文件上传到存储桶成功后不重定向

php - Laravel 5 nginx domain.com/index.php 和 domain.com/both 工作。如何重定向/index.php?

linux - 适用于 Linux 和 Mac 的 HTTP 调试代理

javascript - 使用 grunt-contrib-proxy 重定向

Python requests.get 代理不工作?

angularjs - 如何使用反向代理处理 Express 应用程序中的重定向

spring - nginx 'interfering' 缓存响应?

mongodb - 如何使用代理后面的 Studio 3t 连接到 mongo 服务器?

java - s3 : streaming file(s) with embedded ':' in title

node.js - 适用于 Node.js 的 AWS S3 SDK V3 - GetObjectCommand v/s getSignedUrl