Nginx(13:Permission denied)连接到上游时出错。

12

我正在将我的Django应用程序部署到VPS上,遵循下面链接中的步骤来配置我的应用程序使用Gunicorn和Nginx。

如何在Ubuntu 16.04上设置Django与Postgres、Nginx和Gunicorn

教程中一切都进行得很顺利(gunicorn和nginx正在运行),但问题是当我通过静态IP访问VPS时,它显示一个始终重新加载的白屏。

检查了nginx日志后,我发现以下内容:

连接到upstream时出现(13: Permission denied)错误,客户端: <client_ip>, 服务器:<server_ip>, 请求:"GET / HTTP/1.1, upstream: "http://unix:/root/myproject/myproject.sock:/", host: "<server_ip>", referrer: "http://<server_ip>/"

5个回答

29

在搜索了大约7个小时后,我终于在Nginx论坛上找到了一个解决此问题的方法:

Nginx连接.sock失败(13:拒绝访问)- 502错误网关

我所做的仅仅是更改/etc/nginx/nginx.conf文件中第一行的用户名称。

在我的情况下,默认用户为www-data,我将其更改为我的root机器用户名。


6
永远不要将您的Web服务器进程设置为root用户。 - Sævar
为什么我不应该这样做?@Sævar - Osama Radwan
2
如果您的Web应用程序受到攻击,攻击者将获得特权root访问服务器,而不仅仅是非特权用户。 - Sævar
谢谢。我会努力修复它的。@Sævar - Osama Radwan
1
它对我有用!谢谢 但是我使用了自己定制的用户,而不是root。 - Asad Ali
这对我有效。但默认情况下,nginx.conf 中定义的用户是 "nginx",我将其更改为我的用户名。非常感谢。 - Fravel

1
我遇到了类似的问题。问题原来是微不足道的,只需要将目录权限更改为755即可。
chmod 755 /path/to/Project

0
发布一个完全不同的解决方案,以防有人遇到相同症状但不同问题的情况。在我的情况下,我正在运行启用了安全增强型 Linux 的 RHEL。
SELinux 可能会阻止 Nginx 访问套接字,即使文件系统权限看起来是正确的。要检查 SELinux 是否是罪魁祸首,可以使用以下命令将其临时置于宽容模式:sudo set enforce 0 它是否有效? 如果有效,您可能希望对规则进行例外处理。
记得恢复!sudo setenforce 1 Red Hat 有一个关于创建 SELinux 策略的教程(RHEL 文档)
这是一个捷径——如果您尝试启动 Nginx 但被拒绝访问 Gunicorn 套接字,那么拒绝将被记录在审计日志中。您可以使用这些日志生成自定义的 SELinux 策略模块。
sudo grep gunicorn /var/log/audit/audit.log | sudo audit2allow -M nginx_gunicorn

看着套接字的上下文,ls -lZ /run/gunicorn.sock,我看到了:

system_u:object_r:var_run_t:s0

而对于nginx,ps -eZ | grep nginx

system_u:system_r:httpd_t:s0

注意上下文中的var_run_thttpd_tcat nginx_gunicorn.te显示了策略,它可能应该包含允许这两个上下文进行交互的内容。

allow httpd_t var_run_t:sock_file write;

在向SELinux守护程序祈祷的同时,您可以尝试启用该策略。
sudo semodule -i nginx_gunicorn.pp
sudo systemctl restart nginx

**如果这个方法不起作用,你可以尝试一种变体的神圣Grep咒语来搜索nginx的审计日志。首先,禁用你添加的策略,然后再创建并启用它。**
sudo semodule -r nginx_gunicorn
sudo grep nginx /var/log/audit/audit.log | sudo audit2allow -M nginx_gunicorn
sudo semodule -i nginx_gunicorn.pp

祝一路顺风。

0
在nginx.conf文件的顶部有一个用户名(user nginx;)。只需将此用户添加到与您的站点或项目相同的组中。www-data或任何其他都可以。对于英语表示抱歉。

您的回答可通过提供额外支持信息得到改善。请编辑以添加更多详细信息,例如引用或文档,以便他人可以确认您的答案是正确的。您可以在帮助中心找到有关撰写良好答案的更多信息。 - Community

0
我刚在我的系统中创建了一个新用户,并将项目的所有权交给了该用户,然后在我的/etc/nginx/nginx.conf文件中,我将用户标记为我创建的用户。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接