当我使用 Djoser 进行用户注册和登录管理时,我在 Django 生产环境中遇到问题。当用户请求创建帐户时,API 需要大约一分钟的时间,然后返回
504 Gateway Time-out
错误。在我的本地环境中,该过程正常工作,并且发送激活电子邮件没有任何问题。
我尝试过的:
-
增加了 Nginx 中的超时选项
server { listen ${LISTEN_PORT}; location /static { alias /vol/web/static; } location / { uwsgi_pass ${APP_HOST}:${APP_PORT}; include /etc/nginx/uwsgi_params; client_max_body_size 10M; # new code uwsgi_read_timeout 300s; proxy_read_timeout 300s; proxy_connect_timeout 300s; proxy_send_timeout 300s; } }
这改变了错误。现在超过 2 分钟后我收到错误
Server Error (500)
但我仍然没有收到电子邮件。需要注意的是,我在本地几乎立即收到了电子邮件。
-
在电子邮件发送函数中添加了日志。
class ActivationEmail(email.ActivationEmail): template_name = "user/email/activation.html" def send(self, to, *args, **kwargs): print(f"Sending activation mail to {to}") try: super().send(to, *args, **kwargs) except: print(f"Couldn't send mail to {to}") raise print(f"Activation mail sent successfully to {to}")
该函数似乎被正确调用,但
super().send(to, *args, **kwargs)
永远不会返回。
我还检查了环境变量以确保它们在本地和生产环境之间保持一致。本地和生产中的电子邮件配置相同。但是,在生产中,电子邮件不会到达收件箱,并且 504 或 500 错误仍然存在。
我认为错误来自 nginx,因为本地我没有 nginx 配置。这是两种环境之间的主要区别。但到目前为止,我在 nginx 中的超时选项中所做的更改只是更改了错误,而没有解决问题。
问题:
在生产中发送电子邮件时可能导致 504 错误和 500 错误的原因是什么?我应该在 Nginx 或电子邮件设置中检查任何其他配置吗?我该如何诊断和解决这个问题?
“504 网关超时”错误以及电子邮件发送函数挂起且永不返回的事实强烈表明问题出在你的 Django 应用程序试图连接到的 外部邮件服务器 上。Nginx 只是充当反向代理,在达到超时限制后报告问题。
以下是你可以采取的一些故障排除步骤:
1. 检查邮件服务器的连接性:
-
从你的服务器/生产环境中,尝试 ping 你的邮件服务器。
这将验证是否存在网络连接问题。
bash ping your_mail_server_hostname
-
尝试使用
telnet
连接到你的邮件服务器的 SMTP 端口(通常为 25 或 587)。 这将帮助你了解端口是否可访问且服务器是否响应。bash telnet your_mail_server_hostname 25
2. 检查邮件服务器的日志:
- 你的邮件服务器的日志应包含有关连接尝试以及可能发生的任何错误的信息。查看这些日志以获取有关 Django 应用程序为何无法发送电子邮件的线索。
- 具体查找在用户尝试在你的应用程序中注册时发生的任何错误消息或拒绝连接。
3. 验证你的电子邮件设置:
-
双重、三重检查你的生产 Django 设置中的电子邮件配置是否正确。
- 主机名和端口: 确保这些是正确的,并且你的应用程序可以从其运行的环境中访问它们。
- 凭据: 如果你的邮件服务器需要身份验证,请验证你使用的是正确的用户名和密码。
- TLS/SSL: 确认你是否正确配置了 TLS/SSL 设置以匹配你的邮件服务器的要求。
4. 测试不同的电子邮件后端(可选,但有助于排除故障):
-
为了隔离问题是否与你的电子邮件设置或邮件服务器有关,请尝试暂时切换到像
console
后端这样的不同后端,该后端将在你的终端中打印电子邮件,或者像 Mailgun 或 SendGrid 这样的基于事务性电子邮件的服务。- 如果切换后端解决了该问题,那么问题几乎肯定出在你的原始邮件服务器配置上。
5. 分析代码以进行长时间运行的任务:
-
虽然不太可能,但如果你确定邮件服务器连接正常,请仔细检查你的
ActivationEmail
类或send
方法中的代码以查找任何可能导致延迟的意外长时间运行的任务或逻辑。- 例如,是否进行了任何不必要的数据库查询或 API 调用?
额外的提示:
- 详细日志记录: 在你的电子邮件发送代码周围添加更多详细的日志记录(尝试/捕获块),包括发送的电子邮件参数和收到的任何异常或错误消息。
- 逐步调试: 如果可能,请尝试使用调试器逐步执行代码,以查看在尝试发送电子邮件时究竟发生了什么。
通过系统地完成这些步骤,你应该能够找出问题的原因并实施解决方案以确保你的 Django 应用程序能够在生产环境中可靠地发送电子邮件。
标签:python,django,nginx,djoser From: 78818581