Elastic Beanstalk Django 502 Ошибка плохого шлюза
Фон
В настоящее время я пытаюсь развернуть приложение django на AWS Elastic Beanstalk Environment на Amazon Linux 2 Instance. Я следовал инструкциям по настройке в соответствии с документацией, предоставленной Amazon, а также следовал другим руководствам, поскольку AWS не охватил некоторые ключевые моменты. Вначале я столкнулся с проблемами при попытке успешного развертывания моего приложения Django в среде EB, но мне удалось загрузить мое приложение. Однако теперь среда выдает мне статус Severe health status, в котором при проверке eb.engine.logs я обнаружил следующий журнал ошибок
Что я знаю
Моя догадка заключается в том, что я либо неправильно настроил один из моих файлов ebextensions, либо, основываясь на том, что я вижу в логе выше, я неправильно запустил одно из моих приложений. Я говорю так, потому что мое приложение Django также использует websocket, т.е. Daphne (я думаю, так называется зависимость). Поэтому я считаю, что, возможно, я неправильно настроил это. Если проблема не в этом, что можно сделать вывод из этого журнала ошибок, тогда я не имею понятия.
Я надеюсь, что все понимают, что мне только поручили заниматься развертыванием, а Django не совсем моя сильная сторона. Поэтому я собираюсь разместить здесь некоторые из ключевых файлов для всеобщего ознакомления.
requirements.txt
aioredis==1.3.1
asgiref==3.3.4
async-timeout==4.0.2
attrs==21.4.0
autobahn==21.2.1
Automat==20.2.0
CacheControl==0.12.10
cachetools==5.0.0
certifi==2021.5.30
cffi==1.14.5
channels==3.0.4
channels-redis==3.3.1
chardet==4.0.0
charset-normalizer==2.0.11
constantly==15.1.0
cryptography==3.1.1
daphne==3.0.2
dj-database-url==0.4.2
Django==3.2.4
django-cors-headers==3.7.0
django-environ==0.8.1
django-rest-auth==0.9.5
djangorestframework==3.12.4
et-xmlfile==1.1.0
fcm-django==1.0.8
firebase-admin==5.2.0
google-api-core==2.5.0
google-api-python-client==2.36.0
google-auth==2.6.0
google-auth-httplib2==0.1.0
google-cloud-core==2.2.2
google-cloud-firestore==2.3.4
google-cloud-storage==2.1.0
google-crc32c==1.3.0
google-resumable-media==2.2.0
googleapis-common-protos==1.54.0
grpcio==1.43.0
grpcio-status==1.43.0
gunicorn==19.7.1
hiredis==2.0.0
httplib2==0.20.4
hyperlink==21.0.0
idna==2.10
incremental==21.3.0
lml==0.1.0
msgpack==1.0.3
mysqlclient==2.1.0
numpy==1.20.3
opencv-contrib-python==4.5.2.54
openpyxl==3.0.9
packaging==21.3
Pillow==8.2.0
proto-plus==1.20.0
protobuf==3.19.4
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycparser==2.20
pyexcel-io==0.6.6
pyexcel-xls==0.7.0
pyexcel-xlsx==0.6.0
PyJWT==1.7.1
pyOpenSSL==19.1.0
pyparsing==3.0.7
python-dateutil==2.8.2
pytz==2021.1
pyzbar==0.1.8
qrcode==6.1
requests==2.27.1
rsa==4.8
service-identity==21.1.0
six==1.16.0
sqlparse==0.4.1
sweetify==2.0.0
twilio==6.60.0
Twisted==22.1.0
txaio==21.2.1
typing_extensions==4.0.1
uritemplate==4.1.1
urllib3==1.26.5
whitenoise==3.3.1
xlrd==2.0.1
xlwt==1.3.0
zope.interface==5.4.0
wsgi.py
import os
# from django.core.asgi import get_asgi_application
from django.core.wsgi import get_wsgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import strol.routing as routing
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'strol.settings')
application = get_wsgi_application()
settings.py
routing.py
from django.urls.conf import re_path
from django.urls import path
from app.consumers import NoseyConsumer, AssetSocket, CompanySocket
from django.core.asgi import get_asgi_application
websocket_urlpatterns = [
path("app/", NoseyConsumer),
re_path(r"camera/socket/(?P<location_id>\w+)/", AssetSocket.as_asgi()),
re_path(r"company/socket/(?P<company_name>[-\w\s]+)/", CompanySocket.as_asgi()),
]
asgi.py
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'strol.settings')
x = get_asgi_application()
from channels.routing import ProtocolTypeRouter, URLRouter
from routing import websocket_urlpatterns
from channels.auth import AuthMiddlewareStack
application = ProtocolTypeRouter({
"http": x, #http
"websocket":
AuthMiddlewareStack( #websocket
URLRouter(
websocket_urlpatterns
)
),
})
.ebextensions/django.config
option_settings:
aws:elasticbeanstalk:application:environment:
DJANGO_SETTINGS_MODULE: "strol.settings"
PYTHONPATH: "/var/app/current:$PYTHONPATH"
aws:elasticbeanstalk:container:python:
WSGIPath: strol.wsgi:application
aws:elbv2:listener:80:
DefaultProcess: http
ListenerEnabled: 'true'
Protocol: HTTP
Rules: ws
aws:elbv2:listenerrule:ws:
PathPatterns: /ws/*
Process: websocket
Priority: 1
aws:elasticbeanstalk:environment:process:http:
Port: '80'
Protocol: HTTP
aws:elasticbeanstalk:environment:process:websocket:
Port: '5000'
Protocol: HTTP
container_commands:
01_collectstatic:
command: "source /var/app/venv/*/bin/activate && python3 manage.py collectstatic --noinput"
leader_only: true
Что я пробовал
Я искал далеко и широко другие сообщения (включая те, которые находятся за пределами stackoverflow) с подобными проблемами, которые, как я полагаю, есть, и я видел некоторые из них. Именно поэтому моя догадка была направлена на Daphne и Websocket в моем приложении. К сожалению, реализация любого из приведенных решений, похоже, не работает на моей стороне. Я надеюсь, что кто-нибудь сможет помочь мне с этим.