方案设计图:
需求背景
- 前端是小程序端 小程序端,线上小程序端需要接口是https 的并且要通过域名来访问,功能开发阶段采用的ip+ 端口的方式来测试
- 后端 Django 服务, 采用uwsgi 应用程序服务器来启动Django的服务
- 将Django服务使用docker-compose 一键部署启动
实施步骤
I、修改主机nginx 文件
配置https的时候一定要注意配置证书;我使用的是阿里云,阿里云一年有20个免费的证书可以供使用,将证书下载下来放在/etc/nginx/cert 目录中;需要注意的是,静态文件的路径设置以及免费证书只能绑定单域名,也就是说你想用子域名做转发必须,给子域名单独申请证书
# 新建一个server, 多个子域名服务转发,配置多个server就完事了
server{
listen 80;
listen 443 ssl;
server_name your_server_name; # 可以写自己的域名
ssl_certificate /etc/nginx/cert/your_server_name.pem;
ssl_certificate_key /etc/nginx/cert/your_server_name.key;
ssl_session_timeout 5m; #缓存有效期
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:7070; # uwsgi 内部服务端口
index index.html index.htm;
client_max_body_size 35m;
}
# 这个地方注意,静态文件指定docker 数据卷的位置,默认docker 的书卷的位置是在/var/lib/docker/volumes
location /static/ {
alias /var/lib/docker/volumes/django_docker_static_vol/_data/;
}
location /media {
alias /var/lib/docker/volumes/django_docker_static_media/_data/;
}
}
||、docker-compose.yml 编排文件 数据卷,可以编排多个容器,例如redis容器,mysql 容器等等
不同的目录下可以有多个不同的Dockerfile 以及配置文件,docker-compose 会从编排关系中去执行对应的Do ckerfile
version: "3"
volumes: # 自定义数据卷
#db_vol: #定义数据卷同步存放容器内mysql数据
#redis_vol: #定义数据卷同步存放redis数据
media_vol: #定义数据卷同步存放web项目用户上传到media文件夹的数据
static_vol: #定义数据卷同步存放web项目static文件夹的数据
networks: # 自定义网络(默认桥接), 不使用links通信
nginx_network:
driver: bridge
services:
web:
restart: always
build: ./ArtBackend # 当前目录
ports: # 端口映射
- "7070:7070"
expose: # 暴露端口
- "7070"
volumes:
- ./ArtBackend:/var/www/html/ArtBackend # 挂载项目代码
- static_vol:/var/www/html/ArtBackend/static # 以数据卷挂载容器内static文件
- media_vol:/var/www/html/ArtBackend/media # 以数据卷挂载容器内用户上传媒体文件
- ./compose/uwsgi:/tmp # 挂载uwsgi日志
networks:
- nginx_network
tty: true
stdin_open: true
# 主nginx 已存在 临时注释
# nginx:
# build: ./Compose/nginx
# ports:
# - "80:80"
# - "443:443"
# expose: # 只暴露容器端口不进行主机映射
# - "8080"
# volumes:
# - ./Compose/nginx/nginx.conf:/etc/nginx/conf.d/nginx.conf # 挂载nginx配置文件
# - ./Compose/nginx/ssl:/usr/share/nginx/ssl # 挂载ssl证书目录
# - ./Compose/nginx/log:/var/log/nginx # 挂载日志
# - static_vol:/usr/share/nginx/html/static # 挂载静态文件
# - media_vol:/usr/share/nginx/html/media # 挂载用户上传媒体文件
# networks:
# - nginx_network
# depends_on:
# - web
# restart: always
|||、编写Dockerfile文件,进行镜像构建
# 从仓库拉取 带有 python 3.8 的 Linux 环境
FROM python:3.8
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
MAINTAINER sunboy
# 添加Debian 清华源
RUN echo \
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free\
> /etc/apt/sources.list
# 设置liux时区,不然会出现时区问题
ENV TIME_ZONE=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone
# 复制pip 镜像文件
COPY pip.conf /root/.pip/pip.conf
ENV APP_HOME=/var/www/html/ArtBackend
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
# 将当前目录加入到工作目录中(. 表示当前目录)
ADD . $APP_HOME
# 更新 pip
RUN pip install pip -U
# 将 requirements.txt 复制到容器的 code 目录
ADD requirements.txt $APP_HOME
# 安装库
RUN pip install -r requirements.txt
# 给start.sh可执行权限
RUN chmod +x ./start.sh
# 使用uwsgi 启动服务
ENTRYPOINT /bin/bash ./start.sh
IV、 启动脚本 收集静态文件
#!/bin/bash
# 收集静态文件
python manage.py collectstatic --noinput&&
# 迁移数据库 暂不操作
# uwsgi 启动django 服务
uwsgi --ini uwsgi.ini&&
# 6. tail空命令防止web容器执行脚本后退出
tail -f /dev/null
exec "$@"
VI、配置uwsgi 文件
[uwsgi]
project=ArtBackend
uid=www-data
gid=www-data
base=/var/www/html
chdir=%(base)/%(project)
module = %(project).wsgi:application
master = True #设置是否允许主进程存在
process = 2 #设置进程数量
# uWSGI服务器启动占用的地址和端口, 注意这里是socket 不是 http
socket = 0.0.0.0:7070
chown-socket=%(uid):www-data
chmod-socket=664
#设置服务器退出时自动清理环境
vacuum = true
max-requests=5000
pidfile=/tmp/%(project)-master.pid
daemonize=/tmp/%(project)-uwsgi.log
#static-map=/static=/art/static
#设置django静态文件夹的路径
#设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri = 60
post buffering = 8192
buffer-size= 65535
#当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose = true
#开启内存使用情况报告
memory-report = true
#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy = 10
#设置工作进程使用虚拟内存超过N MB就回收重启
reload-on-as= 1024
VII、 拉取最新的代码,然后在docker-compose.yml 文件所在路径使用如下命令
#构建镜像
docker-compose build
# 后台启动容器
docker-compose up -d
碰到的问题
- 碰到一个django的安全问题,4.0 之后 使用第三方js的库的时候 会碰到跨源开启策略SECURE_CROSS_ORIGIN_OPENER_POLICY 问题,默认是“same-origin”,可以设置为None来规避这个问题
- 静态文件的路径一定要注意,斜杠匹配,因为/static/ 数据卷路径最后为加/而导致问题,一定要注意看nginx的日志文件。
鸡腿🍗