我正在为一个新网站设置一个 nginx 网络服务器,我想将网络服务器的根目录设置为srv
,因此我创建了目录并将所有网络服务器文件放在那里,但 nginx 无法在其中找到任何文件。每次访问我都会收到错误 404。但是,当设置为/srv
时,它能够找到文件。(或 /var/www 内的任何目录)。我正在运行 OpenBSD。以下是我的文件:root
/var/www/html
/etc/nginx/nginx.conf
user www;
worker_processes 1;
events {
worker_connections 800;
}
http {
index index.html;
server {
root /srv/foo;
listen 80;
listen [::]:80;
server_name example.com www.example.com;
sendfile on;
tcp_nopush on;
access_log /var/log/nginx/access.log;
location / {
add_header X-uri "$uri" always;
add_header X-docroot "$document_root" always;
add_header X-realroot "$realpath_root" always;
try_files $uri $uri.html $uri/ =404;
}
}
}
所有目录和文件都已设置读取权限。此外,我还尝试将文件托管在名为 /usr/srv 的新目录中,但遇到了同样的问题。我添加了标头,希望提供一些调试信息,但在 curl GET 请求中一切看起来都很正常。我确实收到了 realpath_root 标头的错误。以下是日志:
2023/06/25 16:30:01 [crit] 14127#0: *32 realpath() "/srv/foo" failed (2: No such file or directory), client: 127.0.0.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com"
有什么线索可以解释为什么我无法从/var/www
子目录以外的任何子目录提供服务?
答案1
在 OpenBSD 上,Nginx 是 chrooted。从OpenBSD 5.6 nginx(8)手册页:
-u
默认情况下,nginx 将chroot(2)到运行守护进程的用户的主目录,通常是“www”,或者到用户在nginx.conf。 这-u选项禁用此行为,并将 nginx 返回到原始的“不安全”行为。
您所需的配置会降低安全性。是否有真正理由使用/srv/foo
而不是/var/www/foo
?