www.nico.schottelius.org/blog/nginx-prioritise-x-accel-be...

57 lines
1.5 KiB
Markdown

[[!meta title="Nginx: Use X-Accel with conflicting regular expressions"]]
## Background
At [[!ungleich]] we use [[!nginx]] for [[!rails]]
hostings of our customers. Nginx is configured to
deliver static files using [[!xaccel]].
We also want to have a longer expiry time for static files,
which is configured seperately in nginx.
## Configuration Options
To support X-Accel, we have added this configuration block into nginx:
# Support for X-Accel
location /protected/ {
internal;
root /home/app/app/shared;
}
To support longer expiry times, we have added this configuration
block:
location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
expires 1y;
# Need to enable proxying in this location as well
try_files $uri @unicorn;
}
## The Problem
Using the configuration as stated above, we encounter the problem that
if an application wants to send a JPEG using X-Accel, the regular
expression block is selected (it has higher priority and matches
the .jpeg ending) and thus the application delivers it, instead of nginx
directly.
## The Solution
Luckily though, [nginx supports giving the prefix based
location block precedence](http://nginx.org/en/docs/http/ngx_http_core_module.html#location):
Instead of using **location /protected/**, we can use **location ^~**. Thus our
previous block can be rephrased to:
location ^~ /protected/ {
internal;
root /home/app/app/shared;
}
And now the application can serve JPEG files via X-Accel.
[[!tag hosting nginx rubyonrails ungleich]]