【发布时间】:2019-10-08 19:14:44
【问题描述】:
我已经安装了 nginx (openresty/1.13.6.2) 作为包括 Grafana 在内的不同服务的反向代理(已经运行了一年多)。
现在我想通过 nginx 提供 PDF 文档,这样我就可以创建从 Grafana 仪表板到运营团队文档的链接。 我在 Windows 10 机器上(无法更改),我无法通过 nginx 成功提供静态 PDF 文件。我在将 nginx 设置为反向代理或 linux 机器上的 html 网络服务器方面有一些经验(已经做过几次),但现在在 Windows 上我遇到了问题。每当我尝试通过 http 访问/下载文件时,都会出现“403 Forbidden”问题。 nginx 作为服务运行 - 用户“SYSTEM”
我尝试将文件夹的权限设置为 nginx 的同一用户,但 nginx 在 windows 下以“SYSTEM”用户身份运行,因此它应该具有对该文件夹的完全访问权限。我检查了Access denied to Nginx folder with folders and files not being created,但这似乎是上游服务问题。
自动索引有效,它显示可用 PDF 文件的列表,但每当我单击文件时,都会出现错误。
以下 sn -p 显示我的 nginx 配置
server {
listen 8080 ssl;
server_name localhost;
ssl_certificate certificates\TEST.pem;
ssl_certificate_key certificates\TEST.key;
location /grafana/ {
....
proxy_pass http://127.0.0.1:3000/;
}
location /public/doc/ {
autoindex on;
include mime.types;
autoindex_format html;
}
}
在windows中PDF文件位于nginx目录下的./html/public/doc下。
这是error.log中的日志条目:
[error] 547220#547264: *320 CreateFile() "./html/public/doc/document.pdf" failed (5: Access is denied), client: xx.xx.xx.xx, server: localhost, request: "GET /public/doc/document.pdf HTTP/1.1"
我想“下载”PDF 文件,但我拒绝访问这些文件。
在 cmets 之后我编辑了 server 块,以包含根目录(绝对路径):
server {
listen 8080 ssl;
server_name localhost;
root D:\software\nginx\html;
ssl_certificate certificates\TEST.pem;
ssl_certificate_key certificates\TEST.key;
location /grafana/ {
....
proxy_pass http://127.0.0.1:3000/;
}
location /public/doc/ {
autoindex on;
include mime.types;
autoindex_format html;
}
}
进一步更新:
我将服务器块更新为:
server {
listen 8080 ssl;
server_name localhost;
root "D:/software/nginx/html";
ssl_certificate certificates\TEST.pem;
ssl_certificate_key certificates\TEST.key;
location /grafana/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_pass http://127.0.0.1:3000/;
}
location /public/doc {
alias "D:/software/nginx/html/public/doc";
autoindex on;
include mime.types;
autoindex_format html;
}
location /public/images {
rewrite ^/public/images/(.*) /$1 break;
root "D:/data/images";
add_header Cache-Control public;
add_header Cache-Control must-revalidate;
expires 1s;
}
}
我现在收到文件路径正确的错误:
[error] 1628392#1627684: *14 CreateFile() "D:/software/nginx/html/public/doc/Test.pdf" failed (5: Access is denied), client: xx.xx.xx.xx, server: localhost, request: "GET /public/doc/Tausch_QR_Cam.pdf HTTP/1.1", host: "xx.xx.x.x:8080", referrer: "https://xx.xx.x.x:8080/public/doc/"
“public/doc”中的目录列表有效,grafana有效,图片下载也有效,仍然无法访问PDF文件:(
更新: 显然 nginx 在“SYSTEM”帐户下运行。我认为这个帐户可以访问所有内容。即使将目录/文件的所有权从“admin”更改为“SYSTEM”也无济于事。 有什么帮助:将 nginx 服务的用户从“SYSTEM”更改为“admin”,如下所示(德语版)。我不完全知道为什么,但现在它可以工作了(“SYSTEM”拥有的文件,“admin”拥有完全访问权限,nginx 在“admin”帐户下运行)。 所以问题解决了,即使我不知道是否解决正确。
【问题讨论】:
-
请附上你的完整代码,你似乎在编辑它,我不能不看全部
-
嗨,你的意思是哪个代码 - nginx.conf?
-
location /public/doc/ { 没有root ,你也没有为服务器设置root ,怎么定义?
-
好的,我在任何地方都没有定义根。但是目录监听适用于正确的目录。它显示了目录中可用的文件。我尝试使用 root ./html;和根html;但行为没有变化。为了完整起见,这里是conf的顶部:
-
root ,表示主文件夹的完整路径,如 /home/www/