在上一篇文章中,我們學習了如何設置Logger系統、Middleware和CORS。
[DAY7] Django與Docker Compose後端開發實戰 - 建立Logger系統、Middleware和CORS
本篇文章中,我們將探討如何使用Nginx作為反向代理,並配置正式環境的Docker Compose設置,以確保應用程序的性能和安全性。
Nginx是一個高性能的HTTP服務器和反向代理服務器,廣泛應用於Web服務器中。使用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
,並在其中新增一個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支持被代理:
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
在正式環境中,我們需要確保應用程序的性能和穩定性。使用Gunicorn替代開發環境中的runserver
可以提供更好的並發處理能力。此外,我們還需要設置靜態文件的服務,以便更高效地處理靜態資源請求。
首先,我們將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
設定允許連線的主機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
加入安裝依賴:
requirements.txt
gunicorn==20.1.0
完成以上配置後,重建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雲端上,作為後端的正式環境: