Nginx + Django: ModuleNotFoundError: Нет модуля с именем 'app'
Я пытаюсь запустить мое приложение Django с Nginx и Gunicorn в Docker
В журналах docker compose у меня следующая ошибка: (полный лог: https://pastebin.com/EXd3Bsii)
File "/usr/local/lib/python3.9/site-packages/gunicorn/util.py", line 359, in import_app
django_1 | mod = importlib.import_module(module)
django_1 | File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
django_1 | return _bootstrap._gcd_import(name[level:], package, level)
django_1 | File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
...
django_1 | File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
django_1 | ModuleNotFoundError: No module named 'app'
Как я могу решить проблему?
Нужно ли указывать конфигурацию wsgi?
Мой код wsgi,py
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'potok.settings')
application = get_wsgi_application()
nginx-conf.conf
upstream app {
server django:8000;
}
server {
listen:80;
server_name: localhost;
location / {
proxy_pass http://app;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect_off;
}
location /staticfiles/ {
alias /var/www/html/staticfiles/;
}
}
docker-compose.yml
version: '3.9'
services:
django:
build: . # path to Dockerfile
command: sh -c "gunicorn --bind 0.0.0.0:8000 app.wsgi"
volumes:
- .:/project
- static_data:/project/static
expose:
- 8000
environment:
- DATABASE_URL=postgres://postgres:XXXXXXXXX@localhost:5432/lk_potok_2"
- DEBUG=1
...
nginx:
image: nginx:1.19.8-alpine
depends_on:
- django
ports:
- "80:80"
volumes:
- static_data:/var/www/html/static
- ./nginx-conf.d:/etc/nginx/conf.d
volumes:
pg_data:
static_data:
Ваш nginx.conf имеет проблему: proxy_pass http://django:8000;
upstream app {
server django:8000;
}
server {
listen:80;
server_name: localhost;
location / {
proxy_pass http://django:8000;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect_off;
}
location /staticfiles/ {
alias /var/www/html/staticfiles/;
}
}
Nginx и django находятся в одной сети, nginx может получить доступ к экземплярам django, созданным gunicorn, используя имя контейнера и порт, к которому guniconr привязывает рабочих.
А также вам нужно изменить docker-compose.yaml. Gunicorn не может получить доступ к приложению, потому что вы назвали его application
, а не app.
version: '3.9'
services:
django:
build: . # path to Dockerfile
command: sh -c "gunicorn --bind 0.0.0.0:8000 wsgi:application"
volumes:
- .:/project
- static_data:/project/static
expose:
- 8000
environment: