为啥我在使用 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 @Aison 2016/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 和 gunicorn 运行烧瓶应用程序

nginx+uwsgi 和nginx+gunicorn区别、如何部署

为啥 Nginx 会截断 gRPC 流式响应?

如何使用Nginx和uWSGI或Gunicorn在Ubuntu上部署Flask Web应用

使用 nginx gunicorn 在 digitalocean 上部署 django react