为啥我在使用 Nginx 和 Gunicorn 的 Django 应用程序上得到 502 Bad Gateway?
Posted
技术标签:
【中文标题】为啥我在使用 Nginx 和 Gunicorn 的 Django 应用程序上得到 502 Bad Gateway?【英文标题】:Why am I getting 502 Bad Gateway on Django app with Nginx and Gunicorn?为什么我在使用 Nginx 和 Gunicorn 的 Django 应用程序上得到 502 Bad Gateway? 【发布时间】:2017-01-04 11:18:21 【问题描述】:我一直在尝试使用this tutorial 部署一个演示应用程序。我在 Virtualbox 的 CentOS 7 上执行此操作。
但是,我收到了502 Bad Gateway
。我该如何解决这个问题?
nginx.conf 文件中的服务器 块
server
listen 80;
server_name 172.16.16.215;
location = /favicon.ico access_log off; log_not_found off;
location /static/
root /home/michel/myproject;
location /
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unix:/home/michel/myproject/myproject.sock;
gunicorn.service 文件
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=michel
Group=nginx
WorkingDirectory=/home/michel/myproject
ExecStart=/home/michel/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/michel/myproject/myproject.sock myproject.wsgi:application
[Install]
WantedBy=multi-user.target
var/logs/nginx/error.log
2016/08/28 18:55:14 [crit] 17557#0: *4 connect() to unix:/home/michel/myproject/myproject.sock failed (13: Permission denied) while connecting to upstream, client: 172.16.16.23, server: 172.16.16.217, request: "GET / HTTP/1.1", upstream: "http://unix:/home/michel/myproject/myproject.sock:/", host: "172.16.16.217"
【问题讨论】:
你介意看看 nginx 错误信息吗?也许在 var/logs/nginx/error.log @Aison2016/08/28 14:11:35 [crit] 2181#0: *15 connect() to unix:/root/myproject/myproject.sock failed (2: No such file or directory) while connecting to upstream, client: 172.16.16.23, server: 172.16.16.215, request: "GET / HTTP/1.1", upstream: "http://unix:/root/myproject/myproject.sock:/", host: "172.16.16.215"
它告诉你 nginx 找不到你的 sock 文件。我猜你的独角兽或主管的 SOCKET PATH 是错误的。
在哪里可以更改该设置?
@Aison 袜子文件是自动创建的吗?还是我必须手动创建?
【参考方案1】:
Gunicorn 无权保存.sock
文件,或者nginx 无权读取.sock
文件。
将此文件移动到/tmp/
文件夹:
nginx.conf
proxy_pass http://unix:/tmp/myproject.sock:/;
gunicorn.service
ExecStart=/home/michel/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/tmp/myproject.sock myproject.wsgi:application
【讨论】:
srwxrwxrwx. 1 michel nginx 0 Aug 28 18:48 myproject.sock
这是 sock 文件的权限。如果它具有 777 权限,我认为将其移至 /tmp 文件夹不会有任何好处,是吗?
看看这个:unix.stackexchange.com/questions/88083/…/tmp
是最好的选择。
我已经禁用了 SELinux,它现在可以工作了。不过,我会看看你的链接。
如果您不关心安全... 好吧,但没有一个管理员会不同意。【参考方案2】:
我禁用了 SELinux,应用程序正常工作。
sudo vi /etc/sysconfig/selinux
设置SELINUX=disabled
。
保存并退出。重新开始。
【讨论】:
更好的方法是了解为什么您没有权限。阅读一些教程。 SELinux 处理内部安全。你不应该禁用它。相反,您应该使用audit2allow
之类的东西,并让它生成一个 SELinux 策略以允许绑定到套接字。
在不禁用 SELinux 的情况下修复它。检查我的其他答案。【参考方案3】:
sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx
sudo semodule -i mynginx.pp
这是从this answer复制的。
【讨论】:
【参考方案4】:我也遇到了这个问题。为我解决问题的是运行:
chmod 711 on the home directory
这允许 nginx 访问运行文件夹中的 .sock 文件。这个权限错误在 Ubuntu 上没有发生在我身上,但在源自 Cent OS 的 Amazon Linux 2 上出现了。这些django deployment scripts 可能会帮助其他面临此问题的人。
【讨论】:
【参考方案5】:获取502 badgateway的可能性有很多,请查看下面的cmds..
sudo systemctl status gunicorn
sudo systemctl status nginx
gunicorn --log-file=- projectname.wsgi:application
以上结果应该处于活动模式
【讨论】:
以上是关于为啥我在使用 Nginx 和 Gunicorn 的 Django 应用程序上得到 502 Bad Gateway?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Django、Nginx、Gunicorn 和主管进行空日志记录
nginx+uwsgi 和nginx+gunicorn区别、如何部署