我需要通过我的应用程序服务器在8080服务我的应用程序,我的静态文件从一个目录不接触应用程序服务器。

    # 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;
            }
    }

现在,有了这个配置,一切工作正常。注意,根指令被注释掉了。

如果我激活根并停用别名,它将停止工作。然而,当我从根目录中删除尾随的/static/时,它又开始工作了。

有人能解释一下这是怎么回事吗?


当前回答

虽然我的答案是不需要的,但我认为有必要添加这一点,根和别名的工作方式不同,当涉及到正则表达式。

 location ~ /static/my.png$ {
     alias /var/www/static/;
     access_log off;
     expires max;
 }

在这种情况下,regex匹配不会添加alias, nginx只会搜索/var/www/static/而不是/var/www/static/my.png你必须使用正则表达式捕获。

 location ~ /static/my.png$ {
     root /var/www;
     access_log off;
     expires max;
 }

在这种情况下,匹配的url将添加根,nginx将搜索/var/www/static/my.png

其他回答

换句话说,保持简单:对于根,指定的位置参数是文件系统路径和URI的一部分。另一方面,location语句的alias指令参数只是URI的一部分

因此,alias是将特定URI映射到文件系统中特定路径的不同名称,而root将位置参数附加到根路径,作为根指令的参数。

在你的例子中,你可以使用根指令,因为location指令的$uri部分与上一个根指令部分相同。

Nginx文档也给出了建议: 当location匹配指令值的最后一部分时: 位置/图像/ { 别名/数据/ w3 /图像/; } 最好使用root指令: 位置/图像/ { 根/数据/ w3; }

根指令会将$uri附加到路径中。

只是@good_computer的非常有用的答案的一个快速附录,我想用一个文件夹替换URL的根,但只有当它匹配包含静态文件的子文件夹(我想保留作为路径的一部分)。

例如,如果请求的文件在/app/js或/app/css目录下,则在/app/location/public/[那个文件夹]中查找。

我得到了这个工作使用正则表达式。

 location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
     alias /home/user/sites/app/public/$1;
     access_log off;
     expires max;
 }

alias用于替换请求路径中的位置部分路径(LPP),而根用于添加到请求路径之前。

它们是将请求路径映射到最终文件路径的两种方法。

别名只能在位置块中使用,它将覆盖外部根。

别名和根不能在位置块中同时使用。

server {
    server_name xyz.com;
    root /home/ubuntu/project_folder/;

    client_max_body_size 10M;
    access_log  /var/log/nginx/project.access.log;
    error_log  /var/log/nginx/project.error.log;

    location /static {
        index index.html;
    }

    location /media {
        alias /home/ubuntu/project/media/;
    }
}

服务器块在nginx上运行静态页面。