使用Nginx部署Django发送邮件时出现504 Gateway Time-out错误求助
排查与解决Nginx部署Django发送SMTP邮件出现504 Gateway Time-out的问题
可能的原因及解决步骤
1. 服务器出站端口被防火墙/安全组拦截
Yandex SMTP的465端口(SSL)可能被当前服务器的防火墙或云服务商安全组禁止出站请求。
- 排查:在服务器终端执行以下命令测试连通性:
如果无法建立连接,说明存在网络拦截。openssl s_client -connect smtp.yandex.ru:465 # 或用telnet(若已安装) telnet smtp.yandex.ru 465 - 解决:
- 服务器防火墙:用
ufw allow out 465/tcp(Ubuntu/Debian)或firewall-cmd --add-port=465/tcp --permanent && firewall-cmd --reload(CentOS/RHEL)开放端口。 - 云安全组:在服务商控制台添加出站方向的TCP 465端口允许规则。
- 服务器防火墙:用
2. SMTP配置的端口与加密方式不匹配
你当前配置EMAIL_PORT=465但EMAIL_USE_TLS=True存在冲突:465是SMTP over SSL(SMTPS)的标准端口,对应Django的EMAIL_USE_SSL=True;而EMAIL_USE_TLS=True通常搭配587端口使用。
- 解决:修改为以下两种正确组合之一:
或# 组合1:465端口 + SSL加密 EMAIL_PORT = 465 EMAIL_USE_SSL = True EMAIL_USE_TLS = False# 组合2:587端口 + TLS加密 EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_USE_SSL = False - 说明:另一台服务器可能因环境兼容性支持错误组合,但当前服务器环境不兼容导致连接超时。
3. Nginx超时设置过短
Nginx默认proxy_read_timeout为60秒,若邮件发送流程耗时超过该时长,会触发504错误。
- 解决:在Nginx的server或location配置块中调整超时参数:
修改后重启Nginx:proxy_read_timeout 120s; proxy_connect_timeout 30s; proxy_send_timeout 120s;sudo systemctl restart nginx
4. 服务器DNS解析故障
当前服务器无法正确解析smtp.yandex.ru的IP地址,导致连接超时。
- 排查:执行
nslookup smtp.yandex.ru或dig smtp.yandex.ru,查看是否能返回有效IP。 - 解决:修改服务器DNS配置,例如在
/etc/resolv.conf中添加nameserver 8.8.8.8,或在云服务商控制台更换实例DNS服务器。
5. Django进程的网络权限限制
若用systemd运行Django(如gunicorn),可能存在网络限制;容器部署场景下,容器网络策略也可能禁止出站。
- 解决:
- 检查systemd服务文件,确保无
PrivateNetwork=true等限制网络的配置。 - 容器部署时,确认容器网络模式(如host模式)或防火墙规则未拦截出站请求。
- 检查systemd服务文件,确保无
快速定位问题的验证步骤
先在服务器本地直接运行Django shell测试邮件发送:
python manage.py shell
然后粘贴你的发送邮件代码执行:
from django.core.mail import EmailMessage from django.template.loader import render_to_string # 替换为你的上下文和用户邮箱 context = {} user = type('User', (), {'email': 'test@example.com'})() message = render_to_string('user/email_confirmation.html', context=context) email = EmailMessage( '124', message, to=[user.email], ) email.send()
- 若本地执行也超时:问题出在服务器网络或Django配置,与Nginx无关。
- 若本地执行成功:问题出在Nginx的超时设置或反向代理配置。
内容的提问来源于stack exchange,提问作者fleys
相关产品推荐
相关产品推荐

