获取502 Bad Gateway错误并使用django,nginx,gunicorn发送电子邮件

时间:2014-04-12 21:11:46

标签: python django nginx gunicorn supervisor

我正在尝试使用我的网络服务器上的django send_mail函数gmail SMTP发送电子邮件,并且我收到了502 Bad Gateway错误。

我正在使用nginx和gunicorn。

这是我的error.log:

2014/04/12 16:46:55 [error] 26846#0: *11 upstream prematurely closed connection while                
reading response header from upstream, client: 179.162.163.62, server: example.com, 
request: "POST /contact/ HTTP/1.1", upstream: "http://127.0.0.1:9000/contact/", host: 
"example.com", referrer: "http://example.com/contact/"  

Ngnix文件:

upstream example_gunicorn {
    server 127.0.0.1:9000 fail_timeout=0;
}

server {
    listen 80;
    client_max_body_size 4G;
    server_name .example.com;

    keepalive_timeout 5;

    location /static/ {
        alias /deploy/sites/example/static/; # STATIC_ROOT
        expires 30d;
    }

    location /media/ {
        alias /deploy/sites/example/media/; # MEDIA_ROOT
        expires 30d;
    }

    location / {
        # checks for static file, if not found proxy to app
        try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        proxy_pass   http://example_gunicorn;
    }
}

谢谢你们。

3 个答案:

答案 0 :(得分:3)

502并没有说明实际错误是什么......我会给你画一幅画:

Client/Browser              Server                   Web Server               
    |         request         |                           |
    |------------------------>|                           |
    |                         |  attempt to send mail     |
    |                         |-------------------------> |
    |                         |                         ERROR 
    |                         |       error message       |          
    |                         |<--------------------------|
    |       502               |                           |
    |<----------------------- |                           |

箭头代表沟通。向下移动图像时,时间会增加。

因此,网络服务器隐藏了最终用户的实际错误,这在生产环境中是非常明显的行为。您需要查看Web服务器日志。

答案 1 :(得分:2)

我在DigitalOcean上使用CentOS7 Droplet时遇到了类似的问题。我正在使用Django 1.6.5和gunicorn。

我通过在EMAIL_HOST = "74.125.22.108"中明确指定EMAIL_HOST = "smtp.gmail.com"而非settings.py来解决此问题。就我而言,这是一个IPv6问题,如DigitalOcean does not allow SMTP over IPv6。

注意:出于安全考虑,请务必在盲目地将其粘贴到代码中之前验证smtp.gmail.com的IPv4地址(使用dig或类似内容)。

答案 2 :(得分:0)

尝试编辑/ etc / hosts

127.0.0.1 localhost.localdomain localhost example.com
127.0.0.1 localhost

在服务器配置中增加proxy_read_timeout 60s;也很有用。默认情况下它是60秒,但你可以做360秒或其他东西。 并且不要忘记重新启动服务(网络,nginx,后缀等)