Django+Vue电商站点POST请求返回Nginx 502 Bad Gateway错误求助
问题1:Gunicorn启动端口冲突解决
你遇到的端口占用是因为Nginx已经在配置中声明了监听8000端口,两者不能同时绑定同一个端口。你当前的Nginx配置已经通过upstream指定了转发到Unix套接字,不需要让Gunicorn绑定IP端口,按如下命令启动即可:
gunicorn --bind unix:/webapps/perulab/venv/run/gunicorn.sock core.wsgi
如果需要后台常驻运行,可以添加--daemon参数,更稳定的方式是编写systemd配置文件托管Gunicorn服务,避免进程意外退出。
启动前如果sock文件目录不存在,需要先创建对应目录并赋予运行Gunicorn的用户读写权限:
mkdir -p /webapps/perulab/venv/run/ chown -R 你的运行用户:用户组 /webapps/perulab/venv/run/
问题2:调用send_mail()触发502错误解决
该问题的根本原因是Django默认的send_mail()为同步执行逻辑,当邮件配置错误、服务器无法连接SMTP服务时,会触发长时间阻塞,超出Gunicorn的worker超时阈值后worker被强制终止,Nginx无法拿到响应就返回502错误,排查修复步骤如下:
- 校验邮件配置正确性
检查Django settings.py中的邮件配置项,确保EMAIL_BACKEND、EMAIL_HOST、EMAIL_PORT、EMAIL_HOST_USER、EMAIL_HOST_PASSWORD、EMAIL_USE_TLS/EMAIL_USE_SSL所有参数和你使用的邮件服务商要求完全一致。同时确认VPS的出站规则、防火墙没有拦截邮件服务对应的端口。 - 手动测试邮件发送
进入项目虚拟环境,执行Django shell手动触发邮件发送,查看具体报错:
python manage.py shell >>> from django.core.mail import send_mail >>> send_mail('测试标题', '测试内容', '你的发件邮箱地址', ['测试收件邮箱地址'], fail_silently=False)
根据返回的报错信息针对性调整:如果是连接超时,检查网络连通性;如果是认证失败,核对用户名密码、授权码配置。
3. 临时验证定位问题
如果暂时无法排查邮件配置,可以先将EMAIL_BACKEND修改为django.core.mail.backends.console.EmailBackend,重启Gunicorn后测试对应POST接口,如果不再报502即可确认是邮件配置导致的问题。
4. 生产环境优化建议
生产环境建议引入Celery等异步任务框架处理邮件发送逻辑,避免邮件发送阻塞主接口响应,从根本上避免这类超时导致的502问题。
内容的提问来源于stack exchange,提问作者Ivan Stepanchuk
相关产品推荐
相关产品推荐

