Nginx Proxy to Files on Local Disk or S3

amazon-s3, nginx, proxy

Solution

Shouldn't this be an example of using `try_files`?

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

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

Make sure there isn't a following slash on the S3 url

Problem

So I'm moving my site away from Apache and onto Nginx, and I'm having trouble with this scenario: User uploads a photo. This photo is resized, and then copied to S3. If there's suitable room on disk (or the file cannot be transferred to S3), a local version is kept. I want requests for these images (such as http://www.mysite.com/p/1_1.jpg) to first look in the p/ directory. If no local file exists, I want to proxy the request out to S3 and render the image (but not redirect). In Apache, I did this like so: ``` RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^p/([0-9]+_[0-9]+\.jpg)$ http://my_bucket.s3.amazonaws.com/$1 [P,L] ``` My attempt to replicate this behavior in Nginx is this: ``` location /p/ { if (-e $request_filename) { break; } proxy_pass http://my_bucket.s3.amazonaws.com/; } ``` What happens is that every request attempts to hit Amazon S3, even if the file exists on disk (and if it doesn't exist on Amazon, I get errors.) If I remove the proxy_pass line, then requests for files on disk DO work. Any ideas on how to fix this?

Original source

Related problems