در پروژه ای که در بستر داکر روی لینوکس پیاده سازی شده است نرم افزار از performance قابل قبولی برخوردار نیست. بخشی از نرم افزار با websocket کار میکند اما اکثرا در بستر http. دیتابیس، و بخشهای دیگر مثل celery, rabbitMQ و … هر کدام یک کانتینر هستند.
ایرادات استقرار یا deployment:
جنگو در یک کانتینر با دستور runserver اجرا شده است.
کل پروژه از Daphne به عنوان اپلیکیشن وب سرور ASGI استفاده میکند در حالی که بخش کوچکی از نرم افزار asyn است و با websocket کار میکند.
وب سروری مثل Nginx یا Apache وجود ندارد که فایلهای استاتیک را ارائه دهد.
بهتر بود در بخشهای Sync از اپلیکیشن سروری مثل uWSGI که یک WSGI هست استفاده میشد.
بنابراین معماری به شکل زیر تغییر یافت:
NGINX درخواست های websocket رو به Daphne و سایر درخواست ها را به uWSGI ارسال میکند. فایل های کانفیگ از قرار زیر است.
compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
version: '3.8' services: elastic: image: elasticsearch:7.17.11 container_name: elastic restart: always hostname: es environment: discovery.type: single-node ES_JAVA_OPTS: -Xms512m -Xmx512m ports: - 9200:9200 mysql: image: mysql container_name: mysql restart: always hostname: mysql.local environment: discovery.type: single-node MYSQL_ROOT_PASSWORD: ... MYSQL_DATABASE: ... ports: - 3306:3306 volumes: - mysql_data:/var/lib/mysql nasim: build: context: . dockerfile: DockerfileNasim hostname: nasim container_name: nasim volumes: - ./app:/opt/app - ./data:/opt/data expose: - "8000" environment: - DJANGO_SETTINGS_MODULE=core.settings daphne: build: context: . dockerfile: DockerfileNasim hostname: daphne container_name: daphne volumes: - ./app:/opt/app - ./data:/opt/data expose: - "8001" command: ["daphne", "-b", "0.0.0.0", "-p", "8001", "core.asgi:application"] environment: - DJANGO_SETTINGS_MODULE=core.settings nginx: build: context: . dockerfile: DockerfileNginx hostname: nginx container_name: nginx ports: - "80:80" depends_on: - nasim - daphne volumes: - ./app/static:/static - ./nginx/nginx.conf:/etc/nginx/nginx.conf volumes: mysql_data: |
nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# nginx/nginx.conf events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream nasim { server nasim:8000; } server { listen 80; location / { proxy_pass http://nasim; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /ws/ { proxy_pass http://daphne:8001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /static/ { alias /static/; } } } |
DockerfileNginx
1 2 3 4 5 6 7 8 |
# DockerfileNginx FROM nginx:alpine # Remove the default configuration file RUN rm /etc/nginx/conf.d/default.conf # Copy the nginx configuration file COPY nginx/nginx.conf /etc/nginx/nginx.conf |
DockerfileNasim
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
FROM python:3.11-slim-bullseye AS nasim_core # Install system dependencies with retry logic RUN apt-get update --fix-missing RUN apt-get install apt-utils -y RUN apt-get install build-essential -y RUN apt-get install gcc -y RUN apt-get install graphviz -y RUN apt-get install graphviz-dev -y RUN apt-get install vim -y RUN apt-get install libmagickwand-dev -y RUN apt-get install curl -y RUN apt-get install iputils-ping -y RUN apt-get install python3-dev -y RUN apt-get install default-libmysqlclient-dev -y RUN apt-get install pkg-config -y RUN apt-get install libffi-dev -y # Create and set work directory RUN mkdir /opt/app && chown www-data:www-data /opt/app WORKDIR /opt/app COPY ./app/requirements.txt /opt/app RUN pip install --upgrade pip RUN pip install --upgrade -r requirements.txt --no-cache-dir RUN pip install uwsgi # Create logs directory and set permissions RUN mkdir /opt/app/logs && touch /opt/app/logs/operation.log /opt/app/logs/system.log RUN mkdir -p /opt/app/uploads/documents RUN chmod -R 777 /opt/app/logs # Set environment variables ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # Copy project COPY ./app /opt/app/ # Run Daphne CMD ["uwsgi", "--http", "0.0.0.0:8000", "--module", "core.wsgi:application", "--master", "--processes", "4", "--threads", "4"] |
لینک های مرتبط:
