django errno 104连接由同行重置

时间:2016-06-10 00:01:36

标签: python django amazon-ec2 rabbitmq celery

我正在尝试在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运行相同的代码。

我还在端口8000上提供了一个小的hello world node.js来测试nginx配置,它运行正常。所以没有nginx错误。

更新:

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

更新:

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

我正在配置像这样的芹菜: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 个答案:

答案 0 :(得分:0)

好的,所以我的问题是你的芹菜工人无法连接到经纪人。你有一些中间件试图调用芹菜任务,所以每次请求都会失败(除非analyse_urls.delay(**kw)是有条件的)

我发现a similar问题是通过升级他们的芹菜版本来解决的。

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

允许EC2实例与消息队列之间的连接

答案 1 :(得分:0)

尝试将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

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