当前位置: 代码迷 >> 综合 >> 基于docker部署前后端分离项目--->docker+Dockerfile+vue+nginx+uwsgi+django+socket+负载均衡
  详细解决方案

基于docker部署前后端分离项目--->docker+Dockerfile+vue+nginx+uwsgi+django+socket+负载均衡

热度:106   发布时间:2023-11-23 18:49:31.0

1. 介绍

  • 本文基于阿里云服务器,安装的ubuntu20.04系统 
  • 适用于conten7.5系列
  • 适用于ubuntu16.04以上系列                           
  • vue已经打包完成,所以不能使用我的vue项目                          

2. 部署

部署步骤

# 下载到opt目录下 
git clone https://gitee.com/yqmc/qq.git
# 进入后端项目目录下
cd /opt/qq/qapi
# uwsgi(配置在后面,必须与manage.py同一级)
vim uwsgi.ini
# Dockfile(配置在后面,必须与manage.py同一级)
vim Dockerfile
# 静态文件的收集
vim qapi/settings.py
# 解开最后一行 如果没有添加,把这个添加进去# 静态文件的存放路径,STATIC_ROOT='/opt/static'
# 进行静态文件收集
python3 manage.py collectstatic
# 构建镜像
docker build -t='q_d' .
# nginx的配置
# 创建目录用于挂载
mkdir -p /opt/nginx/conf  /opt/nginx/logs
touch /opt/nginx/conf/nginx.conf
touch /opt/nginx/conf/default.conf
touch /opt/nginx/logs/error.log
touch /opt/nginx/logs/access.log
# nginx做的事情
正向代理静态文件
正向代理django静态文件
反向代理转发
# 写入配置(配置在后面)
vim /opt/nginx/conf/nginx.conf
vim /opt/nginx/conf/default.conf
# 起docker
docker run -di --name=t1 -v /opt/qq/qapi:/opt/qq/qapi -p 8081:8080 q_d
# 起nginx
docker run --name=nginx -id -p 80:80 -p 8000:8000 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf -v /home/nginx/logs/error.log:/var/log/nginx/error.log -v /home/nginx/logs/access.log:/var/log/nginx/access.log -v /home/static:/home/static -v /home/dist:/usr/share/nginx/html nginx

uwsgi.ini

[uwsgi]
# 用socket无法直接访问页面,必须用nginx做反向代理
socket=0.0.0.0:8080
# 可以直接访问,不安全 用ab直接可以把服务器搞崩
;http = 0.0.0.0:8080
# 项目根目录(你的项目根目录,刚才进入opt pwd查看的路径)
chdir = /opt/qq/qapi
# wsgi文件所在的路径(相对于根目录找到wsgi.py)
wsgi-file = qapi/wsgi.py
# 进程数
processes = 4
# 线程数
threads = 2
# uwsgi服务器的角色
master = True
# 存放进程编号的文件
# pidfile = uwsgi.pid
# 日志输出(坑,解开的话,会后台运行,导致docker无法启动****,最好不要解开)
# daemonize = uwsgi.log

Dockerfile

# 基于基础镜像,默认会去宿主机里找,没有会去hub上拉取。在没有,报错
FROM python:3.6
# 制作者
MAINTAINER ymq
# 暴露端口(可以不写) -p 映射,但最好留着
EXPOSE 8080
# 宿主机文件requirement.txt copy到容器内home路径下
ADD ./requirement.txt /home/
# 构建镜像执行执行命令
RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/
RUN pip install uwsgi -i https://pypi.douban.com/simple/
# 用来保存数据,防止容器挂掉,数据丢失 可以不写 -v 映射,但最好留着
VOLUME ["/home"]
# 工作路径,WORKDIR --> cd 
WORKDIR /opt/qq/qapi
# 执行的命令,当容器启动的时候,会自动执行使django以uwsgi启动
CMD ["uwsgi", "--ini", "uwsgi.ini"]

nginx

nginx.conf

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
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;
}

default.conf

server {listen 80;# 云服务器的IP,这里可以填写域名或IP,填写自己的server_name 10.0.0.100;location / {root   /usr/share/nginx/html;index  index.html index.htm;try_files $uri $uri/ /index.html;}
}
# 负载均衡的配置
upstream u_text {server 10.0.0.100:8081;#server 106.14.42.253:8082;}
server {listen 8000;# 云服务器的IP,这里可以填写域名或IP,填写自己的server_name 10.0.0.100;# 当监听到当前IP端口80发来请求时,进行转发location / {uwsgi_pass u_text;# uwsgi与nginx通信的模块,需要带上路径,因为拆分了,没有在同一路径下include /etc/nginx/uwsgi_params;}location /static {#alias 重命名alias /home/static;}}

报错

修改错误xadmin(注释掉,修改成下面两句)

vim /usr/local/lib/python3.6/site-packages/xadmin/plugins/importexport.py# from import_export.admin import DEFAULT_FORMATS, SKIP_ADMIN_LOG, TMP_STORAGE_CLASS from import_export.formats.base_formats import DEFAULT_FORMATS
from import_export.admin import  ImportMixin, ImportExportMixinBase

错误修改mysql(decode-encode)

vim /usr/local/lib/python3.6/site-packages/django/db/backends/mysql/operations.py

ps git 链接删除

git remote rm origin

  相关解决方案