I need to serve my app through my app server at 8080
, and my static files from a directory without touching the app server. The nginx config I have is something like this...
# app server on port 8080
# nginx listens on port 8123
server {
listen 8123;
access_log off;
location /static/ {
# root /var/www/app/static/;
alias /var/www/app/static/;
autoindex off;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Now, with this config, everything is working fine. Note that the root
directive is commented out.
If I activate root
and deactivate the alias
-- it stops working. However, when I remove the trailing /static/
from the root
it starts working again.
Can someone explain what's going on. Also please explain clearly and verbosely what are the differences between root
and alias
, and their purposes.
Just a quick addendum to @good_computer's very helpful answer, I wanted to replace to root of the URL with a folder, but only if it matched a subfolder containing static files (which I wanted to retain as part of the path).
For example if file requested is in
/app/js
or/app/css
, look in/app/location/public/[that folder]
.I got this to work using a regex.
as say as @treecoder
A picture is worth a thousand words
for
root
:for
alias
:I have found answers to my confusions.
There is a very important difference between the
root
and thealias
directives. This difference exists in the way the path specified in theroot
or thealias
is processed.In case of the
root
directive, full path is appended to the root including the location part, whereas in case of thealias
directive, only the portion of the path NOT including the location part is appended to the alias.To illustrate:
Let's say we have the config
In this case the final path that Nginx will derive will be
This is going to return
404
since there is nostatic/
withinstatic/
This is because the location part is appended to the path specified in the
root
. Hence, withroot
, the correct way isOn the other hand, with
alias
, the location part gets dropped. So for the configthe final path will correctly be formed as
See the documentation here: http://wiki.nginx.org/HttpCoreModule#alias
Server block to live the static page on nginx.
In your case, you can use
root
directive, because$uri
part of thelocation
directive is the same with lastroot
directive part.and
root
directive will append$uri
to the path.