夹层联系表产生“上游过早关闭”错误

Posted

技术标签:

【中文标题】夹层联系表产生“上游过早关闭”错误【英文标题】:Mezzanine contact form produces "upstream prematurely closed" error 【发布时间】:2018-11-12 00:48:48 【问题描述】:

我的网站使用 Mezzanine 4.2.3 与 Django-Oscar 1.5.2 和 Django 1.10.8,在 Digitalocean 上的 Ubuntu 16.04 上运行。当我在使用createdb 创建的演示页面上使用夹层联系表并从我自己的计算机上时,它成功发送了电子邮件。但是当我在运行 Ubuntu 16.04 的 Digitalocean droplet 上对其进行测试时,我得到 502 bad gateway。

nginx错误日志记录了这个错误:*13 upstream prematurely closed connection while reading response header from upstream, client: [an IP I can't identify], server: [my website url], request: "POST /contact/ HTTP/1.1", upstream: "http://unix:/home/my-django-app/my-django-app.sock:/contact/", host: "[my website url]", referrer: "[my website url]/contact/"。数字在*1*7*13 之间变化,但文字相同。

我搜索了这个并找到了各种可能的解决方案:

Increasing the timeout for nginx proxy_pass。这涉及将proxy_connect_timeout 75s;proxy_read_timeout 300s; 添加到nginx 配置,然后将--timeout 300 添加到gunicorn。这产生了一个实际的超时错误:*21 upstream timed out (110: Connection timed out) while reading response header from upstream,

Uncommenting precedence ::ffff:0:0/96 100 in /etc/gai.conf..

在 UFW 中允许端口 587。这应该没关系,因为如果我使用的是 gmail,那么这应该是 Google 方面的一个端口,对吧?我这样做只是因为我看到各种解决方案(大多数未解决)都在谈论解除阻塞此端口的必要性。

让 nginx 监听 587 端口:server listen 80; listen 587; ... list 443 ssl; ...

使用 nginx 监听 587 端口,sudo netstat -tulnp | grep 587 显示:

tcp        0      0 0.0.0.0:587             0.0.0.0:*               LISTEN      12815/nginx -g daem

我的电子邮件设置看起来不错:

EMAIL_USE_TLS = True
EMAIL_HOST = "smtp.gmail.com"
EMAIL_HOST_USER = "!#%%&&*%^#$^*%@gmail.com"
EMAIL_HOST_PASSWORD = "^*#^@#$%&@$%%#$"
EMAIL_PORT = 587
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"

我也尝试了使用端口 465 的 SSL。它适用于我的本地副本,但不适用于服务器。与 502 相同的错误消息。

我认为“上游”意味着gunicorn,所以我为它设置了一个错误日志,但它记录的只是页面加载时的状态代码200和302。 502 发生时它没有记录任何内容。

我没有想法。我错过了什么?

2018 年 6 月 3 日更新:

$ telnet smtp.gmail.com 587
Trying 108.177.96.109...
Trying 108.177.96.108...
Trying 2a00:1450:4013:c01::6c...
telnet: Unable to connect to remote host: Network is unreachable

也用 465 和 25 试过这个。这是否意味着 Digitalocean 正在阻止连接?有precedent。

【问题讨论】:

【参考方案1】:

是的,Digitalocean 阻止 SMTP。他们对我的电子邮件的回复:

为了帮助限制您帐户的 SMTP 服务,您可以 请告诉我们以下信息:

    你的名字。 您将代表什么企业或个人发送邮件以及他们的网站(如果存在)。 您要发送什么样的邮件(密码重置、新闻通讯、营销邮件、交易邮件,如订单 确认)。 如果您代表不是您自己的企业或个人发送邮件,您与该企业或个人的关系是什么? 个人。

另外,由于我们是一家美国公司,我想确保您 了解我们要求我们网络的所有用户都遵循 CAN-SPAM 的要求( https://www.ftc.gov/tips-advice/business-center/guidance/can-spam-act-compliance-guide-business )就发送给任何订阅者的任何非交易性邮件采取行动 世界任何地方,以及 CASL ( http://fightspam.gc.ca/eic/site/030.nsf/eng/home) 发送给您的任何电子邮件 发送给加拿大的任何订阅者。

此外,发送电子邮件至 由欧盟本身及其成员创建的欧洲用户 国家,并建议您调查并遵循所有 任何欧洲订阅者所在国家/地区的相关指南 可能有。

我回答了他们,他们回答:

感谢您提供的信息。

我们已查看信息并已从 您的帐户。

重申一下 - 我们要求订阅者关注 CAN-SPAM 代表所有电子邮件,而 CASL 代表发送给订阅者的任何电子邮件 加拿大。

如果您不这样做,并且我们收到违规投诉,我们可以撤销 自行决定访问 SMTP,无需进一步警告。

【讨论】:

以上是关于夹层联系表产生“上游过早关闭”错误的主要内容,如果未能解决你的问题,请参考以下文章

AWS Nginx“从上游读取响应标头时上游过早关闭连接”

Nginx上游过早关闭连接,同时从上游读取响应标头,用于大型请求

uwsgi + nginx + flask:上游过早关闭

nginx uwsgi websockets 502 Bad Gateway上游过早关闭连接,同时从上游读取响应标头

nginx,uwsgi,DJango,502 当 DEBUG=False,“上游过早关闭连接”

Ruby 1.9.3 / Passenger 3.0.9 升级导致上游过早关闭