运行ECS任务的Django不起作用。请求webapp时“连接被拒绝”或“无数据响应”

问题描述 投票:0回答:2

我在ECS任务上运行Django时遇到一些问题。

我希望在ECS任务上运行一个Django webapp,并且可以访问世界。

以下是症状:

  • 当我使用Django python manage.py runserver 0.0.0.0:8000作为我的容器的入口点运行ECS任务时,我有一个connection refused响应。
  • 当我使用gunicorn --bind 0.0.0.0:8000 my-project.wsgi使用Gunicorn运行任务时,我有no data响应。
  • 我没有看到CloudWatch上的日志,当我ssh到ECS实例时,我找不到任何服务器的日志。

以下是与此类问题相关的一些设置:

  • 我已将我的ECS实例安全组设置为All TCP | TCP | 0 - 65535 | 0.0.0.0/0,以确保它不是防火墙问题。我可以断言,因为我可以完全在同一个ECS实例上的rails服务器上运行ruby。
  • 在我的容器任务定义中,我将端口映射设置为80:8000,另一个设置为8000:8000。 在我的settings.py,我设置了ALLOWED_HOSTS = ["*"]DEBUG = False
  • 本地我的服务器在执行docker run -it -p 8000:8000 my-image gunicorn --bind=0.0.0.0:8000 wsgi或与manage.py runserver相同时在相同的docker镜像上完美运行。

这是我的Gunicorn Web服务器的docker文件。

FROM python:3.6

WORKDIR /usr/src/my-django-project
COPY my-django-project .
RUN pip install -r requirements.txt

EXPOSE 8000
CMD ["gunicorn","--bind","0.0.0.0:8000","wsgi"]
# CMD ["python","manage.py", "runserver", "0.0.0.0:8000"]

任何帮助将不胜感激!

python django docker gunicorn amazon-ecs
2个回答
1
投票

为了帮助您调试:

  1. 当您尝试访问Web应用程序时,作业的状态是什么。
  2. 找出作业正在运行的实例,并在该ecs实例上为正在运行的作业尝试docker ps
  3. 如果您能够在实例上看到容器或作业,请尝试使用curl http://localhost:8000或wget等命令直接在服务器上访问您的webapp
  4. 如果容器未运行。尝试docker ps -a,看看哪一个刚刚停止并检查docker logs -f

使用此方法,您可以删除所有AWS防火墙设置,以便查看容器是否配置正确。我认为它可以帮助您更轻松地追踪问题。在确定容器运行正常并且您可以使用localhost请求之后,您可以处理安全组入站/出站过滤器。


0
投票

我解决了这个问题。 它与我的PostgreSQL数据库的防火墙有关,它阻止了我的容器实例IP,因此我只是将防火墙设置为允许所有IP并且问题得到修复。 这就是为什么它在本地运行良好但不在ECS实例上运行。

当我在我的ECS实例上手动运行服务器并将其称为“本地”时,问题是在Django manage.py runserver上触发了一个带有Gunicorn服务器的HTTP 301 Moved Permanently错误和curl: (56) Recv failure: Connection reset by peer错误。

关键在于此。如果部署服务器上存在连接问题,请考虑服务器的防火墙和数据库的防火墙!

© www.soinside.com 2019 - 2024. All rights reserved.