iT邦幫忙

0

[DAY8] Django與Docker Compose後端開發實戰 - 建立Nginx與正式環境配置

  • 分享至 

  • xImage
  •  

在上一篇文章中,我們學習了如何設置Logger系統、Middleware和CORS。

[DAY7] Django與Docker Compose後端開發實戰 - 建立Logger系統、Middleware和CORS

本篇文章中,我們將探討如何使用Nginx作為反向代理,並配置正式環境的Docker Compose設置,以確保應用程序的性能和安全性。

建立Nginx

Nginx是一個高性能的HTTP服務器和反向代理服務器,廣泛應用於Web服務器中。使用Nginx作為反向代理可以提升應用程序的性能和安全性,提供負載均衡、靜態文件處理和緩存功能。此外,Nginx還能夠有效地管理和分配流量,防止應用程序過載。

配置Nginx容器

首先,我們在Docker Compose文件中定義一個Nginx容器:

  • docker-compose-local.yml
version: "3.9"

services:
  backend:
    container_name: backend-api-services
    build:
      context: .
      dockerfile: Dockerfile
    command: python manage.py runserver 0.0.0.0:8000
    env_file:
      - .env
    volumes:
      - ./backend:/app
    ports:
      - "8000:8000"
    restart: always
    depends_on:
      - mariadb
    networks:
      - backend_net

  redis:
    container_name: backend-redis
    image: redis:alpine
    networks:
      - backend_net

  mariadb:
    container_name: backend-mariadb
    image: mariadb:10.5
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    volumes:
      - mariadb_data:/var/lib/mysql
    networks:
      - backend_net

  nginx:
    image: nginx:latest
    container_name: backend-nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx:/etc/nginx/conf.d
    depends_on:
      - backend
    networks:
      - backend_net

volumes:
  mariadb_data:

networks:
  backend_net:
    driver: bridge

配置Nginx

在專案根目錄下創建一個新目錄nginx,並在其中新增一個default.conf文件:

  • nginx/default.conf
server {
    listen 80;

    location /static/ {
        alias /var/www/static/;
        expires 30d;
    }

    location / {
        proxy_pass http://backend:8000;
        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;
    }
}

更新Django設置

更新Django設置文件,使Django支持被代理:

  • backend/settings.py
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

重啟容器

完成以上配置後,重啟Docker容器:

docker-compose -f docker-compose-local.yml down
docker-compose -f docker-compose-local.yml up --build -d

建立正式環境用的Docker Compose配置

在正式環境中,我們需要確保應用程序的性能和穩定性。使用Gunicorn替代開發環境中的runserver可以提供更好的並發處理能力。此外,我們還需要設置靜態文件的服務,以便更高效地處理靜態資源請求。

配置正式環境的Docker Compose文件

首先,我們將runserver替換為更適合正式環境的gunicorn,並對靜態文件進行配置:

  • docker-compose.yml
version: "3.9"

services:
  backend:
    container_name: backend-api-services
    build:
      context: .
      dockerfile: Dockerfile
    command: gunicorn backend.wsgi:application --bind 0.0.0.0:8000 --workers 3
    env_file:
      - .env
    volumes:
      - static_volume:/var/www/static
      - media_volume:/app/media
    depends_on:
      - mariadb
      - redis
    networks:
      - backend_net

  redis:
    container_name: backend-redis
    image: redis:alpine
    networks:
      - backend_net

  mariadb:
    container_name: backend-mariadb
    image: mariadb:10.5
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    volumes:
      - mariadb_data:/var/lib/mysql
    networks:
      - backend_net

  nginx:
    image: nginx:latest
    container_name: backend-nginx
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - static_volume:/var/www/static
    ports:
      - "80:80"
    depends_on:
      - backend
    networks:
      - backend_net

volumes:
  mariadb_data:
  static_volume:
  media_volume:

networks:
  backend_net:
    driver: bridge

更新Django設置

設定允許連線的主機IP和靜態文件路徑:

  • backend/settings.py
ALLOWED_HOSTS = ['localhost', '127.0.0.1']

extra_hosts = os.getenv('DJANGO_ALLOWED_HOSTS')
if extra_hosts:
    ALLOWED_HOSTS.extend(extra_hosts.split(','))

STATIC_URL = "/static/"
STATIC_ROOT = "/var/www/static/"

添加環境變量文件範例

為了便於配置,我們可以添加一個環境變量設置的範例文件:

  • .env.example
MYSQL_ROOT_PASSWORD=example_root_password
MYSQL_DATABASE=exampledatabase
MYSQL_USER=exampleuser
MYSQL_PASSWORD=examplepassword
DJANGO_ALLOWED_HOSTS=12.345.678.90

安裝Gunicorn

最後,我們需要將gunicorn加入安裝依賴:

  • requirements.txt
gunicorn==20.1.0

重建Docker容器

完成以上配置後,重建Docker容器:

docker-compose -f docker-compose-local.yml down
docker-compose -f docker-compose-local.yml up --build -d

結論

在這篇文章中,我們學習了如何使用Nginx作為反向代理,並配置了正式環境的Docker Compose設置。我們替換了開發環境中的runserver,使用Gunicorn來提升應用程序的性能,並設置了靜態文件的服務。通過這些配置,我們的Django項目變得更加穩定和高效。在下一篇文章,將帶各位讀者學會如何將後端專案部署到GCP雲端上,作為後端的正式環境:


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言