我在 CentOS 5 机器上安装了带有 PHP-FPM 的 nginx,但我很难让它为我的任何文件提供服务——无论是否是 PHP。
Nginx 以 www-data:www-data 运行,默认的“Welcome to nginx on EPEL”站点(由 root:root 拥有,具有 644 权限)加载正常。
nginx 配置文件有一个 /etc/nginx/sites-enabled/*.conf 的包含指令,我有一个配置文件 example.com.conf,因此:
server {
listen 80;
Virtual Host Name
server_name www.example.com example.com;
location / {
root /home/demo/sites/example.com/public_html;
index index.php index.htm index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME /home/demo/sites/example.com/public_html$fastcgi_script_name;
include fastcgi_params;
}
}
尽管 public_html 由具有 2777 文件权限的 www-data:www-data 所有,但该站点无法提供任何内容 -
[error] 4167#0: *4 open() "/home/demo/sites/example.com/public_html/index.html" failed (13: Permission denied), client: XX.XXX.XXX.XX, server: www.example.com, request: "GET /index.html HTTP/1.1", host: "www.example.com"
我发现了许多其他用户从 nginx 获得 403 的帖子,但我看到的大多数帖子要么涉及使用 Ruby/Passenger 进行更复杂的设置(过去我实际上已经成功),要么只在上游 PHP 时收到错误- 涉及FPM,因此它们似乎没有什么帮助。
我在这里做了什么傻事吗?
一个经常被忽视的权限要求是用户需要在文件的每个父目录中拥有 x 权限才能访问该文件。检查 /、/home、/home/demo 等的权限以获取 www-data x 访问权限。我的猜测是 /home 可能是 770 并且 www-data 不能通过它来访问任何子目录。如果是,请尝试 chmod o+x /home (或任何拒绝请求的目录)。
编辑:要轻松显示路径上的所有权限,您可以使用 namei -om /path/to/check
如果您在验证父文件夹的权限后仍然看到 permission denied
,则可能是 SELinux 限制了访问。
检查 SELinux 是否正在运行:
# getenforce
要在下次重新启动之前禁用 SELinux:
# setenforce Permissive
重启 Nginx 看看问题是否依然存在。允许 nginx 为您的 www 目录提供服务(确保在测试之前重新打开 SELinux。即 setenforce Enforcing
)
# chcon -Rt httpd_sys_content_t /path/to/www
有关详细信息,请参阅我的 answer here
open() "/usr/share/nginx/logs/xxxxxx.com-error_log" failed (13: Permission denied)
。我遇到了这个,发现 SELinux 已启用。我禁用了它,现在它可以正常工作了。谢谢!
setsebool httpd_read_user_content on
(对于从主目录托管的静态文件,chmod'ed 为世界可读) - 虽然我猜@KapiteinWitbaard 的上述方法更安全。
我通过添加用户设置解决了这个问题。
在 nginx.conf
worker_processes 4;
user username;
用 linux 用户名更改“用户名”。
我遇到了这个错误,我终于用下面的命令解决了。
restorecon -r /var/www/html
当您将某物从一个地方移动到另一个地方时,就会出现此问题。当你移动它时,它会保留原始的 selinux 上下文,所以如果你在 /home 或 /tmp 中解压某些东西,它会得到一个与其位置匹配的 selinux 上下文。现在您将其 mv 到 /var/www/html 并且它使用上下文说它属于 /tmp 或 /home 并且策略不允许 httpd 访问这些文件。
如果你 cp 文件而不是 mv 文件,selinux 上下文会根据你复制到的位置而不是它的来源来分配。运行 restorecon 会将上下文恢复为默认值并对其进行修复。
我尝试了不同的情况,只有当所有者设置为 nginx (chown -R nginx:nginx "/var/www/myfolder"
) - 它开始按预期工作。
如果您使用的是 SELinux,只需键入:
sudo chcon -v -R --type=httpd_sys_content_t /path/to/www/
这将解决权限问题。
老问题,但我有同样的问题。我尝试了上面的每个答案,没有任何效果。为我解决的问题是删除域并再次添加它。我正在使用 Plesk,并且在域已经存在之后我安装了 Nginx。
不过,首先对 /var/www/backups 进行了本地备份。所以我可以轻松地复制回文件。
奇怪的问题....
我们在使用 Plesk Onyx 17 时遇到了同样的问题。解决方案是将 nginx 用户添加到 psacln 组中,而不是弄乱权限等,其中所有其他域所有者(用户)都是:
usermod -aG psacln nginx
现在 nginx 有权访问 .htaccess 或正确显示内容所需的任何其他文件。
另一方面,还要确保 Apache 在 psaserv 组中,以提供静态内容:
usermod -aG psaserv apache
并且不要忘记之后在 Plesk 中重新启动 Apache 和 Nginx! (并使用 Ctrl-F5 重新加载页面)
usermod -aG username www-data
。
我面临同样的问题,但上述解决方案没有帮助。
因此,经过大量的努力,我发现 sestatus 被设置为强制阻止所有端口,并通过将其设置为允许所有问题都得到了解决。
sudo setenforce 0
希望这可以帮助像我这样的人。
通过错误地运行 setfacl
命令,我对这个问题进行了轻微的修改。我跑了:
sudo setfacl -m user:nginx:r /home/foo/bar
我放弃了这条路线,转而将 nginx
添加到 foo
组,但自定义 ACL 阻止了 nginx 访问文件的尝试。我通过运行清除它:
sudo setfacl -b /home/foo/bar
然后 nginx 能够访问这些文件。
如果您使用的是 PHP,请确保 server 块中的 index
NGINX 指令包含 index.php:
index index.php index.html;
有关详细信息,请查看官方文档中的 index directive。
chmod -4 +x /mypath
为我工作)nginxlibrary.com/403-forbidden-error