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的一部分。另一方面-foralias
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:putlog_格式脚本“$document_root |$uri |>$request”代码>进入http
部分和access\u log/var/log/nginx/scripts.log脚本代码>进入nginx config的服务器
部分。谢谢!实际上,别名上的尾随斜杠是必需的,否则我在“alias”指令中得到了nginx:[emerg]无效的参数数,并且服务器在重新启动时宕机。@mafrosis为什么它是必需的?感谢您的回答。我知道这是3年后的事了,但有人能解释一下,在使用别名和root之间是否存在性能和/或安全性的权衡吗?@Mina如果可以的话,最好使用root。(文件中有评论)这正是我第一次来这里的目的