django errno 104 连接被对等方重置

Posted

技术标签:

【中文标题】django errno 104 连接被对等方重置【英文标题】:django errno 104 Connection reset by peer 【发布时间】:2016-10-10 19:39:21 【问题描述】:

我正在尝试在 AWS EC2 上的 Ubuntu 实例上运行我的 django 服务器。我正在使用 gunicorn 像这样运行服务器:

gunicorn --workers 4 --bind 127.0.0.1:8000 woc.wsgi:application --name woc-server --log-level=info --worker-class=tornado --timeout=90 --graceful-timeout=10

当我发出请求时,我在浏览器上收到 502,Bad Gateway。这是服务器日志http://pastebin.com/Ej5KWrWs

settings.py 文件中根据主机名更改行为的部分是

iUbuntu 是我笔记本电脑的主机名

if socket.gethostname() == 'iUbuntu':
    '''
    Development mode
    "iUbuntu" is the hostname of Ishan's PC
    '''
    DEBUG = TEMPLATE_DEBUG = True
else:
    '''
    Production mode
    Anywhere else than Ishan's PC is considered as production
    '''
    DEBUG = TEMPLATE_DEBUG = False

if socket.gethostname() == 'iUbuntu':
    '''Development'''
    ALLOWED_HOSTS = ['*', ]
else:
    '''Production Won't let anyone pretend as us'''
    ALLOWED_HOSTS = ['domain.com', 'www.domain.com',
                     'api.domain.com', 'analytics.domain.com',
                     'ops.domain.com', 'localhost', '127.0.0.1']

(我不明白这部分代码的目的是什么。由于我从某人那里继承了代码并且服务器正在工作,所以我不会在不了解它的作用的情况下将其删除)

if socket.gethostname() == 'iUbuntu':
    MAIN_SERVER = 'http://localhost'
else:
    MAIN_SERVER = 'http://domain.com'

我无法弄清楚这里有什么问题。相同的代码在我的笔记本电脑上使用 gunicorn 运行良好。

我还制作了一个小 hello world node.js 服务于端口 8000 以测试 nginx 配置,它运行良好。所以没有 nginx 错误。

更新:

我将 DEBUG 设置为 True 并复制了 Traceback http://pastebin.com/ggFuCmYW

更新:

感谢@ARJMP 的回复。这确实是芹菜消费者没有连接到经纪人的问题。

我正在像这样配置 celery:app.config_from_object('woc.celeryconfig') 和 celeryconfig.py 的内容是:

BROKER_URL = 'amqp://celeryuser:celerypassword@localhost:5672/MyVHost' CELERY_RESULT_BACKEND = 'rpc://'

我正在这样运行工人:celery worker -A woc.async -l info --autoreload --include=woc.async -n woc_celery.%h

我得到的错误是:

consumer: Cannot connect to amqp://celeryuser:**@127.0.0.1:5672/MyVHost: [Errno 104] Connection reset by peer.

【问题讨论】:

请发布完整的堆栈跟踪 我将 DEBUG 设置为 True 并复制了 Traceback http://pastebin.com/ggFuCmYW 堆栈跟踪似乎表明您的 celery 工作人员无法连接您的消息队列 (amqp) 服务器。 A similar issue 已通过升级他们的 celery 版本解决。 【参考方案1】:

好的,据我所知,您的问题是您的 celery worker 无法连接到代理。你有一些中间件试图调用一个 celery 任务,所以每次请求都会失败(除非analyse_urls.delay(**kw) 是有条件的)

我发现a similar 的问题已通过升级他们的 celery 版本得到解决。

另一个原因可能是 EC2 实例无法连接到消息队列服务器,因为 EC2 安全组不允许。如果消息队列在单独的服务器上运行,您可能必须确保您已允许 EC2 实例与消息队列之间通过 AWS EC2 Security Groups 进行连接

【讨论】:

删除对 celery 的调用是可行的,但是我需要 celery 来完成很多任务。我正在像这样app.config_from_object('woc.celeryconfig') 配置芹菜,而 celeryconfig.py 的内容是 BROKER_URL = 'amqp://celeryuser:celerypassword@localhost:5672/MyVHost' CELERY_RESULT_BACKEND = 'rpc://' 我正在像这样运行工人 celery worker -A woc.async -l info --autoreload --include=woc.async -n woc_celery.%h 而我得到的错误是 consumer: Cannot connect to amqp://celeryuser:**@127.0.0.1:5672/MyVHost: [Errno 104] Connection reset by peer.【参考方案2】:

尝试将 rabbitmq 连接超时设置为 30 秒。这通常可以解决无法连接到服务器的问题。

您可以将connection_timeout 添加到您的连接字符串中:

BROKER_URL = 'amqp://celeryuser:celerypassword@server.example.com:5672/MyVHost?connection_timeout=30'

注意带问号的格式:?connection_timeout=30

这是a query string parameter for the RMQ connection string。

另外 - 确保 url 在您的生产环境中指向您的生产服务器名称/url,而不是 localhost

【讨论】:

以上是关于django errno 104 连接被对等方重置的主要内容,如果未能解决你的问题,请参考以下文章

Python 处理 socket.error:[Errno 104] 连接由对等方重置

Python socket.error:[Errno 104] 对等方重置连接

芹菜错误“对等方重置连接”

http 403 错误 +“readv() 在读取上游时失败(104:对等方重置连接)”

PHP 警告:socket_read():无法从套接字 [104] 读取:连接被对等方重置

在 docker 和 ubuntu 中从上游读取响应标头时失败(104:对等方重置连接)