django前后端项目部署
一、安装docker
注意:使用docker cp 完成文件的修改编辑操作 不要下载vim了
$PWD 当前路径
(1)yum 包更新到最新
sudo yum update
(2)安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(3)设置yum源为阿里云
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
(4)安装docker
sudo yum install docker-ce
(5)安装后查看docker版本
docker -v
(6) 配置docker仓库
vi /etc/docker/daemon.json
在该文件中输入如下内容:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl start docker
sudo systemctl status docker
二、安装git
(1) yum命令安装:
sudo yum install -y git
(2) 查看版本
git --version
(3) 拉取项目
cd /opt
mkdir software
cd software
mkdir project
# 后端
git clone https://gitee.com/wy-kang/fullstack_api.git
# 前端
git clone https://gitee.com/wy-kang/fullstack_vue.git
git pull origin master
git config --global user.name "wy-kang"
git config --global user.email "1519676228@qq.com"
ssh-keygen -t rsa -C "1519676228@qq.com"
git config --list
cd /root/.ssh/
(4) 项目更新
# 修改完成以后,直接编译 npm run build
# 使用git提交代码版本
# git add .
# git commit -m "重新编译修改host地址"
# git push origin dev:dev
# 在公网服务器中,使用git pull 拉取最新代码
三、项目部署
前端项目
nginx安装配置
# 拉取镜像
docker pull nginx
# 创建文件夹
mkdir nginx
cd nginx
mkdir conf
# 初始化配置文件 - 配置在下面
cd conf
vim nginx.conf
# 创建容器
docker run -id --name=fullstack_vue \
-p 80:80 \
-v /opt/software/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/software/docker/nginx/logs:/var/log/nginx \
-v /opt/software/project/fullstack_vue/dist:/usr/share/nginx/html \
nginx
# 进入容器
docker exec -it fullstack_vue /bin/bash
nginx.conf 配置如下
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
后端项目
安装mysql
(1)拉取mysql镜像
docker pull centos/mysql-57-centos7
(2)创建容器,设置端口映射、目录映射
# 有问题 - 连接有问题
docker run \
--restart always \
-p 3306:3306 \
-v /opt/mysql/conf:/etc/mysql/conf.d \
-v /opt/mysql/logs:/var/log/mysql \
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d -it --name mysql centos/mysql-57-centos7
# 用这个简单的
docker run -di --name=fullstack_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=fullstack123456 centos/mysql-57-centos7
(3) 进入容器,操作mysql
docker exec –it fullstack_mysql /bin/bash
(4) 数据导入
方式很多,推荐使用navicate 等数据库工具导入
安装redis
(1)拉取镜像
docker pull redis:5.0
(2)创建容器,设置端口映射
docker run -di --name=fullstack_redis -p 6379:6379 redis:5.0
(3)进入容器,操作mysql
docker container exec -it fullstack_redis bash
./redis-cli.exe -h 192.168.149.135 -p 6379
安装python环境
使用dockerfile完成python环境的搭建
# 建立 python3.9 环境
FROM centos:7.5.1804
FROM python:3.9
# RUN apt-get update
# RUN apt-get install vim
MAINTAINER django:v3
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
# 设置pip源为国内源
WORKDIR ./project
COPY requirements.txt requirement.txt
# 利用 pip 安装依赖
RUN pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/
RUN pip install -r requirement.txt -i https://mirrors.aliyun.com/pypi/simple/
# 暴露端口
# EXPOSE 8000
# CMD python manage_prod.py runserver 0:8000
构建容器
cd /opt/software/project/fullstack_api
git pull origin master
# dockerfile构建镜像
sudo docker build -t django_docker_img:v1 .
# 启动容器
docker run -id --name=fullstack_v1 \
-p 8000:8000 \
-v /opt/software/project/fullstack_api:/project \
django_docker_img:v1
# 进入容器内部
docker exec -it fullstack_v1 /bin/bash
# 有坑
vi /usr/local/lib/python3.9/site-packages/xadmin/plugins/importexport.py
# from import_export.admin import DEFAULT_FORMATS, SKIP_ADMIN_LOG, TMP_STORAGE_CLASS
from import_export.admin import DEFAULT_FORMATS, ImportMixin, ImportExportMixinBase
python manage_prod.py makemigrations
python manage_prod.py migrate
python manage_prod.py runserver 0.0.0.0:8000
# 修改容器名称
docker rename tensquare_mysql fullstack_mysql
# 或者 - d 守护进程,不进入
docker exec -itd fullstack_v1 python manage_prod.py runserver 0.0.0.0:8000
四、项目部署2
收集静态资源
当Django运行在生产环境中,我们会关闭debug调试,那么项目将不再提供静态文件的支持,需要将静态文件交给静态文件的nginx服务器来提供访问。
我们先收集所有静态文件。项目中的静态文件除了我们使用的上传文件之外,django本身还有自己的静态文件,如rest_framework、xadmin、admin、ckeditor等。我们需要收集这些静态文件,集中一起放到静态文件服务器中。
我们要将收集的静态文件放到项目的static目录中,所以先创建目录static。
Django提供了收集静态文件的方法。先在配置文件中配置收集之后存放的目录
settings/prod.py和dev.py ,代码:
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static')
因为目前在本地我们依然使用了dev.py文件运行项目,所以我们在本地项目收集静态文件就需要把配置信息同步到dev.py
# 本地上传
git add .
git commit 'saveresoucre'
git push origin master
# 服务器拉取
git pull origin master
uwsgi启动django服务
-
修改wsgi.py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'fullstack_api.settings.prod')
-
安装uwsgi模块
pip install uwsgi uwsgi --version # 查看 uwsgi 版本
-
在项目根目录下创建uwsgi配置文件uwsgi.ini
[uwsgi] #使用nginx连接时使用,Django程序所在服务器地址 # socket=0.0.0.0:8000 #直接做web服务器使用,Django程序所在服务器地址 http=0.0.0.0:8000 #项目目录 chdir=/project #项目中wsgi.py文件的目录,相对于项目目录 wsgi-file=fullstack_api/wsgi.py # 进程数 processes=4 # 线程数 threads=2 # uwsgi服务器的角色 master=True # 存放进程编号的文件 pidfile=logs/uwsgi.pid # 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的 daemonize=logs/uwsgi.log # 指定依赖的虚拟环境 # virtualenv=/root/.virtualenvs/luffy
-
启动uwsgi服务器
必须在uwsgi.ini配置文件所在的目录中运行下面的命令
注意,在本地环境中必须先把runserver关闭
uwsgi --ini uwsgi.ini
停止uwsgi服务器,还可以通过使用kill命令停止
uwsgi --stop uwsgi.pid
-
上传到服务器
dockerfile
# 建立 python3.9 环境 FROM centos:7.5.1804 FROM python:3.9 MAINTAINER django:v1 # 设置 python 环境变量 ENV PYTHONUNBUFFERED 1 # RUN apt update # RUN apt-get install -y vim # RUN apt-get update && RUN apt-get install -y vim # 设置pip源为国内源 WORKDIR ./project COPY requirements.txt requirements.txt # RUN pip install virtualenv -i https://pypi.douban.com/simple/ # RUN pip install virtualenvwrapper -i https://pypi.douban.com/simple/ # 创建虚拟环境 # RUN mkvirtualenv env -p python3 # 利用 pip 安装依赖 RUN pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/ RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ # 安装uwsgi RUN pip install uwsgi -i https://mirrors.aliyun.com/pypi/simple/
COPY deal_bug/importexport.py /usr/local/lib/python3.9/site-packages/xadmin/plugins/importexport.py
使用
```python
# 创建镜像
sudo docker build -t django_uwsgi_docker_img:v1 .
# 构建容器
docker run -id --name=fullstack_uwsgi_v1 \
-p 8000:8000 \
-v /opt/software/project/fullstack_api:/project \
django_uwsgi_docker_img:v1
# 或者 - d 守护进程,不进入
docker exec -it fullstack_uwsgi_v1 /bin/bash
# 启动
uwsgi --ini uwsgi.ini
# 状态
ps aux | grep uwsgi
# 日志
cat logs/uwsgi.log
cat logs/fullstack_api.log
# 停止
uwsgi --stop logs/uwsgi.pid
python manage_prod.py runserver 0.0.0.0:8000
docker exec -it fullstack_uwsgi_v1 uwsgi --ini uwsgi.ini
nginx反向代理
dockerfile
FROM centos:7.8.2003
FROM nginx
RUN apt-get update && apt-get install -y vim
# dockerfile构建镜像
sudo docker build -t nginx_docker_img:v1 .
使用
# 创建容器
docker run -id --name=nginx_vue \
-p 80:80 \
-v /opt/software/project/fullstack_vue/dist:/usr/share/nginx/html \
nginx_docker_img:v1
# 进入容器
docker exec -it nginx_vue /bin/bash
# 编写
vim /etc/nginx/conf.d/default.conf
# 重启
nginx -s reload
default.conf
# 在文件的末尾添加
upstream fullstack {
server 116.204.113.225:8000;
# server 120.77.220.233:8001;
}
server {
listen 80;
server_name 127.0.0.1:80; # 域名 或 127.0.0.1:80
location / {
include uwsgi_params;
uwsgi_pass fullstack;
}
}
最后一步操作
修改uwsgi.ini
[uwsgi]
#使用nginx连接时使用,Django程序所在服务器地址
socket=0.0.0.0:8000 #使用这个
#直接做web服务器使用,Django程序所在服务器地址
# http=0.0.0.0:8000 # 这个注释掉
#项目目录
chdir=/project
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=fullstack_api/wsgi.py
# 进程数
processes=4
# 线程数
threads=2
# uwsgi服务器的角色
master=True
# 存放进程编号的文件
pidfile=logs/uwsgi.pid
# 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的
daemonize=logs/uwsgi.log
# 指定依赖的虚拟环境
# virtualenv=/root/.virtualenvs/luffy
为网站提供静态资源支持
# 没有实际操作
# dockerfile构建镜像
sudo docker build -t nginx_docker_img:v1 .
# 创建容器
docker run -id --name=nginx_vue_static \
-p 80:80 \
-v /opt/software/project/fullstack_api/static:/usr/share/nginx/static \
-v /opt/software/project/fullstack_vue/dist:/usr/share/nginx/html \
nginx_docker_img:v1
# 进入容器
docker exec -it nginx_vue /bin/bash
# 编写
vim /etc/nginx/conf.d/default.conf
# 重启
nginx -s reload
# 在原本的default.conf 中 添加 一行
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html; # 这个是添加的 , 原本的那个
}
五、完整案例 - 终版
docker 安装
sudo yum update
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce
vi /etc/docker/daemon.json
在该文件中输入如下内容:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
sudo systemctl status docker
git安装与使用
sudo yum install -y git
git --version
git config --global user.name "wy-kang"
git config --global user.email "1519676228@qq.com"
git config --list
ssh-keygen -t rsa -C "1519676228@qq.com"
cat /root/.ssh/id_rsa.pub #上传到git服务器
# 项目
cd /home/
mkdir project
# 后端
git clone https://gitee.com/wy-kang/fullstack_api.git
# 前端
git clone https://gitee.com/wy-kang/fullstack_vue.git
# 拉取项目
git pull origin master
# 项目更新
# 前端 - 做以下操作
npm run build
# 后端 - 无操作
# 上传操作
git add .
git commit -m "提交说明"
git push origin master
数据库
mysql
docker pull centos/mysql-57-centos7
docker run -di --name=fullstack_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=fullstack123456 centos/mysql-57-centos7
docker exec –it fullstack_mysql /bin/bash
# 别忘了对数据做迁移
redis
docker pull redis:5.0
docker run -di --name=fullstack_redis -p 6379:6379 redis:5.0
项目路径
cd /home
mkdir project
# 后端
git clone https://gitee.com/wy-kang/fullstack_api.git
# 前端
git clone https://gitee.com/wy-kang/fullstack_vue.git
# 拉取项目
git pull origin master
前端部署
nginx - dockerfile
# 建立 nginx环境
FROM centos:7.8.2003
FROM nginx
# RUN apt-get update && apt-get install -y vim
使用
# dockerfile构建镜像
sudo docker build -t nginx_docker_img:v1 .
# 创建容器
docker run -id --name=nginx_vue \
-p 80:80 \
-v /home/project/fullstack_api/static:/usr/share/nginx/static \
-v /home/project/fullstack_vue/dist:/usr/share/nginx/html \
nginx_docker_img:v1
# 将容器配置拷贝到宿主机中中
docker cp nginx_vue:/etc/nginx/conf.d/default.conf /home/project/fullstack_vue/conf
# 编写default.conf 配置反向代理内容
vi /home/project/fullstack_vue/conf/default.conf
# 宿主机中的文件拷贝到容器中
docker cp /home/project/fullstack_vue/conf/default.conf nginx_vue:/etc/nginx/conf.d/default.conf
# 进入容器 -d 不进入容器
docker exec -itd nginx_vue nginx -s reload
# 重启
nginx -s reload
default.conf
# 在文件的末尾添加
upstream fullstack {
server 123.249.68.131:8000;
}
server {
listen 80;
server_name 127.0.0.1:80; # 域名 或 127.0.0.1:80
location / {
include uwsgi_params;
uwsgi_pass fullstack;
location /static {
root /usr/share/nginx;
}
}
# 在原本的default.conf 中 添加 一行
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html; # 这个是添加的 , 原本的那个
}
完整版
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# 在文件的末尾添加
upstream fullstack {
server 123.249.68.131:8000;
}
server {
listen 80;
server_name 127.0.0.1:80; # 域名 或 127.0.0.1:80
location / {
include uwsgi_params;
uwsgi_pass fullstack;
}
location /static {
root /usr/share/nginx;
}
}
后端部署
python - django -dockerfile
# 建立 python3.9 环境
FROM centos:7.5.1804
FROM python:3.9
MAINTAINER django:v1
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
# RUN apt update
# RUN apt-get install -y vim
# RUN apt-get update && RUN apt-get install -y vim
# 设置pip源为国内源
WORKDIR ./project
COPY requirements.txt requirements.txt
# RUN pip install virtualenv -i https://pypi.douban.com/simple/
# RUN pip install virtualenvwrapper -i https://pypi.douban.com/simple/
# 创建虚拟环境
# RUN mkvirtualenv env -p python3
# 利用 pip 安装依赖
RUN pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
# 安装uwsgi
RUN pip install uwsgi -i https://mirrors.aliyun.com/pypi/simple/
COPY deal_bug/importexport.py /usr/local/lib/python3.9/site-packages/xadmin/plugins/importexport.py
# 暴露端口
# EXPOSE 8000
# CMD python manage_prod.py runserver 0:8000
uwsgi.ini
[uwsgi]
#使用nginx连接时使用,Django程序所在服务器地址 - 一般来说两个用一个
socket=0.0.0.0:8000
#直接做web服务器使用,Django程序所在服务器地址
# http=0.0.0.0:8000
#项目目录
chdir=/project
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=fullstack_api/wsgi.py
# 进程数
processes=4
# 线程数
threads=2
# uwsgi服务器的角色
master=True
# 存放进程编号的文件
pidfile=logs/uwsgi.pid
# 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的
daemonize=logs/uwsgi.log
# 指定依赖的虚拟环境
# virtualenv=/root/.virtualenvs/luffy
使用
# 创建镜像
sudo docker build -t django_uwsgi_docker_img:v1 .
# 构建容器
docker run -id --name=django_uwsgi \
-p 8000:8000 \
-v /home/project/fullstack_api:/project \
django_uwsgi_docker_img:v1
# 或者 - d 守护进程,不进入
docker exec -it django_uwsgi /bin/bash
# 启动
uwsgi --ini uwsgi.ini
# 状态
ps aux | grep uwsgi
# 日志
cat logs/uwsgi.log
cat logs/fullstack_api.log
# 停止
uwsgi --stop logs/uwsgi.pid
python manage_prod.py runserver 0.0.0.0:8000
docker exec -it django_uwsgi uwsgi --ini uwsgi.ini
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律