Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in AWS by (19.1k points)

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 ) 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 behaviour 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?

1 Answer

0 votes
by (44.3k points)

Use try_files:

location /p/ {

    try_files $uri @s3;

}

location @s3{ 

    proxy_pass http://my_bucket.s3.amazonaws.com;

}

A following slash should not be on the S3 URL

Related questions

0 votes
1 answer

Want to get 50% Hike on your Salary?

Learn how we helped 50,000+ professionals like you !

0 votes
1 answer
asked Dec 8, 2020 in AWS by devin (5.6k points)

Browse Categories

...