我需要通过我的应用程序服务器提供我的应用程序8080,并从一个目录提供我的静态文件,而无需接触应用程序服务器。我拥有的 nginx 配置是这样的......
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; } }
现在,有了这个配置,一切正常。请注意,该root指令已被注释掉。
root
如果我激活root和停用alias-- 它会停止工作。但是,当我/static/从它中删除尾随时,root它又开始工作了。
alias
/static/
有人可以解释发生了什么。还请清楚详细地解释 和 之间的区别root及其alias用途。
root和alias指令之间有一个非常重要的区别。这种差异存在于处理root或alias处理中指定的路径的方式上。
location
为了显示:
假设我们有配置
location /static/ { root /var/www/app/static/; autoindex off; }
在这种情况下,Nginx 将派生的最终路径将是
/var/www/app/static/static
这将返回404,因为没有static/内部static/
404
static/
这是因为位置部分附加到root. 因此,与root,正确的方法是
location /static/ { root /var/www/app/; autoindex off; }
另一方面,随着alias,位置部分被丢弃。所以对于配置
location /static/ { alias /var/www/app/static/; autoindex off; ↑ } | pay attention to this trailing slash
最终路径将正确形成为
/var/www/app/static
在某种程度上,这是有道理的。alias只需让您定义一条新路径来表示现有的“真实”路径。位置部分是新路径,因此它被替换为真实路径。将其视为符号链接。
另一方面,根不是一条新路径,它包含一些必须与其他信息进行比较才能形成最终路径的信息。因此,位置部分被使用,而不是被丢弃。