我在ECS任务上运行Django时遇到一些问题。
我希望在ECS任务上运行一个Django webapp,并且可以访问世界。
以下是症状:
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
响应。以下是与此类问题相关的一些设置:
All TCP | TCP | 0 - 65535 | 0.0.0.0/0
,以确保它不是防火墙问题。我可以断言,因为我可以完全在同一个ECS实例上的rails服务器上运行ruby。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"]
任何帮助将不胜感激!
为了帮助您调试:
docker ps
。curl http://localhost:8000
或wget等命令直接在服务器上访问您的webappdocker ps -a
,看看哪一个刚刚停止并检查docker logs -f
使用此方法,您可以删除所有AWS防火墙设置,以便查看容器是否配置正确。我认为它可以帮助您更轻松地追踪问题。在确定容器运行正常并且您可以使用localhost请求之后,您可以处理安全组入站/出站过滤器。
我解决了这个问题。 它与我的PostgreSQL数据库的防火墙有关,它阻止了我的容器实例IP,因此我只是将防火墙设置为允许所有IP并且问题得到修复。 这就是为什么它在本地运行良好但不在ECS实例上运行。
当我在我的ECS实例上手动运行服务器并将其称为“本地”时,问题是在Django manage.py runserver上触发了一个带有Gunicorn服务器的HTTP 301 Moved Permanently
错误和curl: (56) Recv failure: Connection reset by peer
错误。
关键在于此。如果部署服务器上存在连接问题,请考虑服务器的防火墙和数据库的防火墙!