Problem with Nginx returning correct content, but with 404

Maxim Dounin mdounin at mdounin.ru
Thu Jan 20 19:56:14 MSK 2011


Hello!

On Thu, Jan 20, 2011 at 11:23:17AM -0500, austinmills wrote:

> We have a setup where we have requests coming into a cache server which
> is in front of an app server. The requests hit nginx on the cache
> server, which makes the request to a process running on the cache
> server. That process will return either the requested content (if in the
> cache) or a 404. In the case of a 404, nginx on the cache server should
> then turn around and make the same request to the app server. The app
> server serves the content, and then nginx on the app server should turn
> around and return the response to the client.
> 
> The problem we are seeing is that this works fine for requests of the
> form /admin/fan_pages, but when requesting css or png content (like
> /stylesheets/common.css , or /images/admin/fan_pages/refresh.png ), it
> is returning the correct content, but with a 404 code. In this case, the
> local process on the cache server is returning a 404, the nginx on the
> cache server is requesting the page from the app server (which returns
> the page with a 200), but then the cache server is turning around and
> serving the correct content to the client with a 404. 
> 
> Anybody have any ideas on how/why this is happening? I'll include config
> files and output below. If there's a simpler or better setup to
> accomplish what we're trying to do, I'm happy to try that as well.

Request to /stylesheets/common.css will generate 404 as long 
as you don't have static file on disk, as it's matched by this 
location in your config:

> # set Expire header on assets: see http://developer.yahoo.com/performance/rules.html#expires
> location ~ ^/(images|javascripts|stylesheets)/ {
>   expires 10y;
> }

You have 404 error_page set without overwriting status code:

> error_page 404 /404.html;

I.e. 404 code will be preserved regardless of future processing.  
This explains 404 status code.

Future processing will happen here:

>   location / {
>     proxy_next_upstream http_404 http_500 http_502 http_503 http_504 error timeout;
>     proxy_pass http://switching_backend;
>   }

As proxy_pass without uri component is used, it will preserve 
original request uri when asking backend.  This explains correct 
content.

Maxim Dounin



More information about the nginx mailing list