1、创建django项目
a)
安装django依赖包:pip3 install Django# 使用 django-admin 来创建 HelloWorld 项目django-admin startproject srccd src/执行同步数据库文件:python3 manage.py migrate# 启动djangopython3 manage.py runserver 0.0.0.0:8000
本地测试:
在浏览器中输入127.0.0.1:8000
后面将代码放到了服务器上进行测试
b) django中连接mysql数据库
DATABASES = {# 'default': {#'ENGINE': 'django.db.backends.sqlite3',#'NAME': BASE_DIR / 'db.sqlite3',# }'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'jlpost','USER': 'root','HOST': '10.30.239.206','PASSWORD': '123456','PORT': '3306',}}
c) 安装mysql
安装mysql:参见/mysql/mysql-install.html
安装pymsql==1.0.2作为数据库驱动,在_init_.py文件中配置,此处需要指定pymysql的版本,否则可能报错
import pymysqlpymysql.version_info = (1, 4, 13, "final", 0)pymysql.install_as_MySQLdb()
在测试代码的时候此处遇到一个问题Forbidden (CSRF cookie not set.),参见:/qq_43245972/article/details/87883108
d) 运行时数据库会报错
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
解决方法如下:/weixin_43336281/article/details/100055435
/u/4337873/blog/4279371
得到django项目目录如下:
2、本地部署
采用uwsgi+nginx部署项目。服务器:CentOS 7.9
2.1 uwsgi启动django
安装uwsgipip3 install uwsgi
报错如下:
查阅资料发现是python3_devel(centos系统下)未安装,补充该安装包,成功
yum install python3-devel
收集静态资源
配置django目录下的settings.py
# 静态资源访问的起始urlSTATIC_URL = '/static/'# 指定静态资源所在的目录STATICFILES_DIRS = [os.path.join(BASE_DIR, 'hello_dist', 'dist', 'static'),]# 设置收集静态资源的路径(部署时使用)STATIC_ROOT = os.path.join(BASE_DIR, 'hello_dist', 'dist')
收集静态资源
python3 manage.py collectstatic
新建uwsgi.ini,与manage.py同一目录下,配置uwsgi.ini
[uwsgi]; 监听的端口http = :8001;指定和nginx进行套接字通信的方式:端口或文件; socket = :8002; 项目所在目录,和manage.py同级chdir = /opt/zxq/hello; 主应用中的wsgi文件wsgi-file = /opt/zxq/hello/src/wsgi.py; 代理静态资源:路径映射static-map = /static=/opt/zxq/hello/src/hello_dist/dist; 启动一个master进程,来管理其余的子进程master=Trueprocesses = 4threads = 2; 保存主进程的pid,用来控制uwsgi服务pidfile=/opt/zxq/hello/logs/uwsgi.pid; 设置后台运行,保存日志daemonize=/opt/zxq/hello/logs/uwsgi.log; 设置每个工作进程处理请求的上限,达到上限时,将回收(重启)该进程。可以预防内存泄漏max-requests=5000; 服务停止时自动移除unix Socket和pid文件vacuum=true
启动与关闭
uwsgi uwsgi.ini# 停止uwsgi --stop logs/uwsgi.pidpkill -f uwsgi -9
问题:
采用runserver的命令直接启动django时,无报错信息,网页能够正常使用,但是采用uwsgi启动时,日志报错:sqlite版本过低
检查sqlite版本信息:
find / -name sqlite3*
检查发现:/usr/bin/sqlite3软链接存在异常,重新设置软链接,失败,仍然无法访问网页
ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3
查阅资料:/legendary_Dragon/article/details/117295774,可能是sqlite3的库文件没有更新,uwsgi优先调用/usr/lib64/目录下的库文件
替换后成功运行
# 查找库文件find / -name *sqlite3.so.0# 替换.so文件cp /usr/local/sqlite/lib/libsqlite3.so.0 /usr/lib64/libsqlite3.so.0
日志配置
由于uwsgi的入口是src/wsgi.py,因此需要在该文件下配置日志输出信息,将django请求的日志记录下来。
def _handle_cmd_line(args=None):parser = OptionParser()parser.add_option("--id", dest="id", action="store",type="string", default="0",help="id use guard and create log file")parser.add_option("--logconfig", dest="logconfig", action="store",type="string",default=os.path.join(work_dir, 'etc', 'log.conf'),help="log config file [%default]")(options, args) = parser.parse_args(args=args)return options, argsoptions, _args = _handle_cmd_line()if options.logconfig:defaults = {"id": options.id}logging.config.fileConfig(options.logconfig, defaults)
2.2 采用nginx代理
安装nginx,并启动ngix# 防止报错nginx包不存在yum install epel-releaseyum install nginxsystemctl start nginx
修改6.1节中的uwsgi.ini,添加socket端口
[uwsgi]; 监听的端口,不配置nginx; http = :8001; 指定和nginx进行套接字通信的方式:端口或文件socket = :8002#---# 其它配置不变#---
配置 uwsgi 和 Nginx 的连接,并重启nginx:systemctl start nginx
vim /etc/nginx/nginx.conf
# 修改user为rootuser root;# 在server中添加如下配置server {listen 80;location /static {# 静态资源加载的路径alias /opt/zxq/hello/src/hello_dist/dist;}location / {include uwsgi_params;# 转发的ip和端口uwsgi_pass 0.0.0.0:8002;}}
nginx 启动失败/xiaohuai0444167/article/details/105758684/
linux
查看端口占用 lsof -i:8002查看端口使用netstat -anpt启动nginx systemctl status nginx查看nginx运行状态 systemctl start nginx删除所有nginx的进程 killall -9 nginx
启动项目
cd /opt/zxq/hellouwsgi --ini uwsgi.ini
在浏览器中输入http://10.30.239.199/Weibo
3、项目部署(docker)
3.1 linux安装docker
启动dockesystemctl start docker
3.2 docker打包有ssh服务的centos镜像
一般情况下,linux操作系统的管理员通过SSH服务来管理操作系统,但是Docker的很多镜像都是不带SSH服务的,因此需要创建一个带有SSH服务的centos镜像
某些情况下,docker拉取镜像会报超时错误,处理方法:/ws0316/p/12066454.html
docker拉取镜像
docker pull centos
检查centos中是否存在ssh服务
# 启动centos镜像,docker.io/centos通过docker images得到docker run -it -d --name django_base -t centos:latest /bin/bash# 查看已启动的容器docker ps# 查找某个容器id,进入已启动的容器中docker exec -it 86 /bin/bash
判断该容器安装此服务
sshd
创建镜像打包目录,创建Dockerfile,run.sh两个文件,并赋予run.sh执行权限
cd /opt/zxq/ssh_centostouch Dockerfile run.shchmod +x run.sh
run.sh写入配置
#! /bin/bash/usr/sbin/sshd -D
dockerfile写入配置文件
# 设置继承镜像FROM centos:latest# 开始运行命令RUN yum install -y openssh-serverRUN yum install -y passwdRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_keyRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_keyRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_keyRUN echo "123456" | passwd --stdin root # 系统密码,可自行更改ADD run.sh /run.shEXPOSE 22CMD ["/run.sh"]
创建镜像
docker build -t sshd:centos .
3.3 docker打包有python3服务的centos镜像
由于机器学习必备python3的一些环境,因此,制作一个python3的基础镜像
创建镜像打包目录,创建Dockerfile
cd python3_centostouch Dockerfile
dockerfile写入配置文件
# 指定操作的镜像FROM sshd:centos# 创建文件夹RUN mkdir -p /opt/install# 安装软件# 安装centos的yum源RUN yum install epel-release -yRUN yum -y install wget# 安装python 3.6RUN yum install -y libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make# 存放安装包的路径WORKDIR /opt/installRUN wget /ftp/python/3.6.8/Python-3.6.8.tgz# 解压RUN tar -zxvf Python-3.6.8.tgzWORKDIR Python-3.6.8RUN ./configureRUN make&&make install
打包镜像
docker build -t python3:centos .
3.4 基于python3:centos打包django镜像
创建镜像打包目录,创建Dockerfile、web_run.sh,赋予web_run.sh执行权限cd python_djangotouch Dockerfile
dockerfile写入配置文件
# 指定操作的镜像# 指定操作的镜像FROM python3:centos# 指定语言,防止中文日志乱码ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8# 创建文件夹# 项目存放路径RUN mkdir -p /opt/zxq/hello# 拷贝文件# django项目地址COPY hello /opt/zxq/hello#提取复制nginx相关配置内容COPY nginx.conf /etc/nginx/nginx.conf#这句指令相当于:cd django项目WORKDIR /opt/zxq/hello# 安装依赖包RUN pip3 install -r requirements.txt -i /pypi/simpleCMD ["uwsgi","/opt/zxq/hello/uwsgi.ini"]
使用当前目录的 Dockerfile 创建镜像,标签为 web:django
docker build -t uwsgi:django .
创建django的容器
docker run -it -d -p 80:80 --name web_uwsgi --rm uwsgi:django /bin/bash
进入nginx容器
docker exec -it web_uwsgi /bin/bash
在容器中安装nginx相关包
yum install epel-releaseyum install nginx
启动nginx、uwsgi
nginxuwsgi uwsgi.ini
docker run -tid --name nginx -id -p 80:80 --privileged=true -t uwsgi:django
访问http://10.30.239.199/Weibo
4、Docker容器转移至另一服务器部署
将当前的web_uwsgi容器提交为一个镜像nginx_firstdocker commit web_uwsgi nginx_first
将镜像存为
docker save nginx_first >nginx_first.tar
将tar文件另一台服务器指定的目录下,将备份文件nginx_first.tar恢复为镜像
docker load < nginx_first.tar
根据镜像重新运行起容器
docker run -tid --name nginx -id -p 80:80 --privileged=true -t uwsgi:django