Nginx——静态文件服务与root&;别名

Nginx——静态文件服务与root&;别名,nginx,Nginx,我需要通过位于8080的应用服务器为我的应用程序提供服务,并在不接触应用服务器的情况下从目录中提供静态文件。我的nginx配置是这样的 # app server on port 8080 # nginx listens on port 8123 server { listen 8123; access_log off; location /static/ {

我需要通过位于
8080
的应用服务器为我的应用程序提供服务,并在不接触应用服务器的情况下从目录中提供静态文件。我的nginx配置是这样的

    # 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;
            }
    }
现在,有了这个配置,一切正常。请注意,
root
指令已注释掉

如果我激活
根目录
并停用
别名
,它将停止工作。但是,当我从
根目录
中删除尾部的
/static/
时,它会重新开始工作


有人能解释一下发生了什么事吗。另外,请清楚详细地解释
root
alias
之间的区别以及它们的用途。

我已经找到了我困惑的答案

root
alias
指令之间有一个非常重要的区别。这种差异存在于
根目录
别名
中指定的路径的处理方式上

root
指令的情况下,完整路径被附加到包含位置部分的根,而在
alias
指令的情况下,只有路径中不包含位置部分的部分被附加到别名

举例说明:

假设我们有配置文件

location /static/ {
    root /var/www/app/static/;
    autoindex off;
}
location /static/ {
    alias /var/www/app/static/;
    autoindex off;           ↑
}                            |
                             pay attention to this trailing slash
在这种情况下,Nginx将派生的最终路径是

/var/www/app/static/static
这将返回
404
,因为
static/
中没有
static/

这是因为位置部分被附加到
根目录中指定的路径中。因此,使用
root
,正确的方法是

location /static/ {
    root /var/www/app/;
    autoindex off;
}
另一方面,使用
别名
,位置部分将被删除。因此,对于配置

location /static/ {
    root /var/www/app/static/;
    autoindex off;
}
location /static/ {
    alias /var/www/app/static/;
    autoindex off;           ↑
}                            |
                             pay attention to this trailing slash
最终路径将正确形成为

/var/www/app/static
alias
指令的尾部斜杠 关于尾随斜杠是否是强制性的,目前还没有明确的指南,但这里和其他地方的人们的普遍观察似乎表明它是强制性的

还有一些地方对此进行了讨论,但没有得出结论


这只是@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;
 }

在您的情况下,您可以使用
root
指令,因为
location
指令的
$uri
部分与最后一个
root
指令部分相同

也建议:
当位置与指令值的最后一部分匹配时:

location /images/ {
    alias /data/w3/images/;
}
最好改用root指令:

location /images/ {
    root /data/w3;
}
并且
root
指令将
$uri
附加到路径。

如@treecoder所示

root
指令的情况下,将完整路径附加到包含位置部分的根,而在
alias
指令的情况下,仅将不包含位置部分的路径部分附加到别名

一幅画抵得上千言万语

对于
根目录

对于
别名


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

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


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

别名
用于替换请求路径中的位置部件路径(LPP),而
用于在请求路径前加前缀

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

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


alias
root
不能在位置块中一起使用。

虽然不需要我的答案,但我认为有必要添加这一点,
root
alias
在regex中的工作方式不同

 location ~ /static/my.png$ {
 alias /var/www/static/;
 access_log off;
 expires max;}
在这种情况下,regex匹配不会与别名一起添加,nginx将只搜索“/var/www/static/”not“/var/www/static/my.png”。您必须使用正则表达式捕获

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

在本例中,匹配的url将与root一起添加,nginx将搜索“/var/www/static/my.png”。

别名路径上的尾随斜杠至关重要!这一切都很棒(它帮助我解决了配置问题),但我想知道人们可以使用哪些日志设置来帮助诊断此类问题?比如,任何可以打印到日志的东西,比如“接收到[…]的请求,匹配“位置[…]”配置块,搜索目录[…]”@Pistos:put
log_格式脚本“$document_root |$uri |>$request”进入
http
部分和
access\u log/var/log/nginx/scripts.log脚本进入nginx config的
服务器
部分。谢谢!实际上,别名上的尾随斜杠是必需的,否则我在“alias”指令中得到了
nginx:[emerg]无效的参数数,并且服务器在重新启动时宕机。@mafrosis为什么它是必需的?感谢您的回答。我知道这是3年后的事了,但有人能解释一下,在使用别名和root之间是否存在性能和/或安全性的权衡吗?@Mina如果可以的话,最好使用root。(文件中有评论)这正是我第一次来这里的目的