You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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配置块中调整超时参数:
    proxy_read_timeout 120s;
    proxy_connect_timeout 30s;
    proxy_send_timeout 120s;
    
    修改后重启Nginx: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模式)或防火墙规则未拦截出站请求。

快速定位问题的验证步骤

先在服务器本地直接运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:10:33