我正在 VPS 上部署 Djano 应用程序,并按照以下链接中的步骤使用 Gunicorn 和 Nginx 配置我的应用程序。
如何在 Ubuntu 16.04 上使用 Postgres、Nginx 和 Gunicorn 设置 Django
本教程一切顺利(gunicorn 和 nginx 正在运行),但问题是,当我通过静态 IP 访问 VPS 时,它会显示一个始终在重新加载的白屏。
检查 nginx 日志后,我发现以下内容:
(13:权限被拒绝)连接到上游时,客户端:
,服务器: ,请求:“GET / HTTP/1.1,上游:“http://unix:/root/myproject/myproject.sock:/”,主持人:“ ”,推荐人:“http:// /”
经过大约7个小时的搜索,我终于在Nginx论坛找到了这个问题的解决方案:
Nginx 连接到 .sock 失败(13:权限被拒绝)- 502 错误网关
我所做的只是更改
/etc/nginx/nginx.conf
文件中第一行的用户名。
在我的例子中,默认用户是
www-data
,我将其更改为我的 root
机器用户名。
我遇到了类似的问题。问题原来是小事,需要把目录权限改为755
chmod 755 /path/to/Project
nginx.conf 文件的顶部是一个用户名(user nginx;)。只需将此用户添加到您的站点或项目所在的同一组中即可。 www-data 或任何数据都是您的。对不起英语。
我刚刚在我的系统中创建了新用户并将项目所有权授予该用户,然后在我的 /etc/nginx/nginx.conf 中我将用户标记为我创建的用户
发布完全不同的解决方案,以防有人遇到具有相同症状的不同问题。就我而言,我在启用了安全增强型 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
:
系统_u:系统_r:httpd_t:s0
注意上下文中的 var_run_t 和 httpd_t。
cat nginx_gunicorn.te
显示策略,它可能应该包含允许两个上下文交互的内容。
允许httpd_t var_run_t:sock_file写入;
在向 SELinux 守护者祈祷的同时,您可以尝试启用该策略。
sudo semodule -i nginx_gunicorn.pp
sudo systemctl restart nginx
**如果这不起作用,您可以尝试在审计日志中搜索 nginx 的 Holy Grep 咒语的变体。首先,禁用您添加的策略,然后再次创建并启用。
sudo semodule -r nginx_gunicorn
sudo grep nginx /var/log/audit/audit.log | sudo audit2allow -M nginx_gunicorn
sudo semodule -i nginx_gunicorn.pp
祝你顺利。