我遇到了一个奇怪的问题,似乎无法弄清楚。
我正在使用 OpenResty。它在该特定服务器上的工作方式是整个配置和 Lua 脚本以及所有内容都来自 Git 存储库。用户应该管理存储库,OpenResty 的工作程序应该以(我在配置中设置)ubuntu
的身份运行。我使用的是 Ubuntu 22.04。www-data
user www-data www-data;
该存储库位于/home/ubuntu/app/my-project
并作为 OpenResty 的前缀。
但是,似乎工作进程无法访问该目录中的任何内容(主进程可以)。Lua 文件未执行(尽管也没有错误),某些配置值似乎被忽略,并且我在尝试写入和读取时收到“错误 13:权限被拒绝”temp/client_body/...
等html/index.html
信息:
open() "/home/ubuntu/app/my-project/temp/client_body/0000093402" failed (13: Permission denied)
项目内的所有文件和目录都设置为组www-data
,并且temp
包含client_body
此类的目录甚至具有所有者的www-data
,并且读/写权限设置正确。当我这样做时sudo -u www-data bash
,我可以在那里读取和写入,但是当 OpenResty 工作进程这样做时,它仍然会得到“权限被拒绝”的结果。
该client_body
目录甚至由 OpenResty 自动创建,如下所示:
drwx------ 2 www-data root 4096 Dec 4 18:49 client_body
我的第一个想法是这ProtectHome
可能是一个问题,但我本来预计这也会干扰主进程而不仅仅是工作者进程,而且我已经将其设置为了false
。
我添加了一个,access_by_lua_block
在其中运行id
并记录其输出,并且正如预期的那样,我得到了以下内容:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
有趣的是,如果我使用/usr/local/openresty/nginx
前缀路径,一切都会正常工作。(但我更希望将 Git 存储库放在/home/ubuntu/app/my-project
...)此外,如果我将 OpenResty 配置为以用户身份运行ubuntu
而不是www-data
,它也会正常工作。
我的知识已经用尽了。还有什么问题吗?
为了记录,这是我的openresty.service
文件:
[Unit]
Description=The OpenResty Application Platform
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
WorkingDirectory=/home/ubuntu/app/my-project
Type=forking
PIDFile=/home/ubuntu/app/my-project/logs/nginx.pid
ExecStartPre=/usr/local/openresty/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;' -p /home/ubuntu/app/my-project
ExecStart=/usr/local/openresty/nginx/sbin/nginx -g 'daemon on; master_process on;' -p /home/ubuntu/app/my-project
ExecReload=/usr/local/openresty/nginx/sbin/nginx -g 'daemon on; master_process on;' -s reload -p /home/ubuntu/app/my-project
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /home/ubuntu/app/my-project/logs/nginx.pid
TimeoutStopSec=5
KillMode=mixed
ProtectHome=false
[Install]
WantedBy=multi-user.target
注意:这个问题建议这可能是 SELinux 问题,但是对我来说sudo sestatus
输出SELinux status: disabled
(并且尝试运行sudo semanage permissive -a httpd_t
无论如何都会导致错误,即策略不受管理,正如预期的那样)。
答案1
我想到了。
问题是,尽管/
、和可供 访问,但/home
却无法访问(它与 一起)。/home/ubuntu/app
/home/ubuntu/app/my-project
www-data
/home/ubuntu
750
ubuntu:ubuntu
我现在决定将整个项目目录移动到/var/www/my-project
,添加ubuntu
到www-data
组并保留/home/ubuntu/app/my-project
符号链接,/var/www/my-project
同时将服务单元文件中的所有路径也更改为/var/www/my-project
。这解决了这个问题。
现在让我感到困惑并阻止我早日意识到这一点的部分是:当我尝试使用或sudo -u www-data bash
时,它确实有效。然而,在更多地玩这个之后,我意识到它ls /home/ubuntu/app/my-project/html
echo hello > /home/ubuntu/app/my-project/temp/client_body/test
仅有的工作当我/home/ubuntu/app/my-project
事先已经有了工作目录时!
ubuntu@my-server:~/app/my-project$ sudo -u www-data bash
www-data@my-server:/home/ubuntu/app/my-project$ echo hello > /home/ubuntu/app/my-project/temp/client_body/test
www-data@my-server:/home/ubuntu/app/my-project$ cat /home/ubuntu/app/my-project/temp/client_body/test
hello
ubuntu@my-server:/var/www$ sudo -u www-data bash
www-data@my-server:/var/www$ echo hello > /home/ubuntu/app/my-project/temp/client_body/test
bash: /home/ubuntu/app/my-project/temp/client_body/test: Permission denied
这很奇怪,因为在我的服务单元文件中WorkingDirectory
曾是定义为那个精确的目录,但也许 OpenResty 在分叉之前对其进行了更改。
无论如何,如果有人对此有解释,请在评论中告诉我!