a)
安装django依赖包:pip3 install Django # 使用 django-admin 来创建 HelloWorld 项目 django-admin startproject src cd src/ 执行同步数据库文件:python3 manage.py migrate # 启动django python3 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:参见https://www.runoob.com/mysql/mysql-install.html
安装pymsql==1.0.2作为数据库驱动,在_init_.py文件中配置,此处需要指定pymysql的版本,否则可能报错
import pymysql pymysql.version_info = (1, 4, 13, "final", 0) pymysql.install_as_MySQLdb()
在测试代码的时候此处遇到一个问题Forbidden (CSRF cookie not set.),参见:https://blog.csdn.net/qq_43245972/article/details/87883108
d) 运行时数据库会报错
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
解决方法如下:https://blog.csdn.net/weixin_43336281/article/details/100055435
https://my.oschina.net/u/4337873/blog/4279371
得到django项目目录如下:
采用uwsgi+nginx部署项目。服务器:CentOS 7.9
2.1 uwsgi启动django
- 安装uwsgi
pip3 install uwsgi
报错如下:
查阅资料发现是python3_devel(centos系统下)未安装,补充该安装包,成功
yum install python3-devel
- 收集静态资源
配置django目录下的settings.py
# 静态资源访问的起始url
STATIC_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=True processes = 4 threads = 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.pid pkill -f uwsgi -9
问题:
采用runserver的命令直接启动django时,无报错信息,网页能够正常使用,但是采用uwsgi启动时,日志报错:sqlite版本过低
检查sqlite版本信息:
find / -name sqlite3*
检查发现:/usr/bin/sqlite3软链接存在异常,重新设置软链接,失败,仍然无法访问网页
ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3
查阅资料:https://blog.csdn.net/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, args
options, _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-release yum install nginx systemctl 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为root
user root;
# 在server中添加如下配置
server {
listen 8088;
location /static { # 静态资源加载的路径
alias /opt/zxq/hello/src/hello_dist/dist;
}
location / {
include uwsgi_params;
# 转发的ip和端口
uwsgi_pass 0.0.0.0:8002;
}
}
nginx 启动失败https://blog.csdn.net/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/hello uwsgi --ini uwsgi.ini
在浏览器中输入http://10.30.239.199:8088/Weibo
3、项目部署(docker)3.1 linux安装docker
- 启动docke
systemctl start docker
3.2 docker打包有ssh服务的centos镜像
一般情况下,linux操作系统的管理员通过SSH服务来管理操作系统,但是Docker的很多镜像都是不带SSH服务的,因此需要创建一个带有SSH服务的centos镜像
某些情况下,docker拉取镜像会报超时错误,处理方法:https://www.cnblogs.com/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_centos touch Dockerfile run.sh chmod +x run.sh
- run.sh写入配置
#! /bin/bash /usr/sbin/sshd -D
- dockerfile写入配置文件
# 设置继承镜像 FROM centos:latest # 开始运行命令 RUN yum install -y openssh-server RUN yum install -y passwd RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key RUN echo "123456" | passwd --stdin root # 系统密码,可自行更改 ADD run.sh /run.sh EXPOSE 22 CMD ["/run.sh"]
- 创建镜像
docker build -t sshd:centos .
3.3 docker打包有python3服务的centos镜像
由于机器学习必备python3的一些环境,因此,制作一个python3的基础镜像
- 创建镜像打包目录,创建Dockerfile
cd python3_centos touch Dockerfile
- dockerfile写入配置文件
# 指定操作的镜像 FROM sshd:centos # 创建文件夹 RUN mkdir -p /opt/install # 安装软件 # 安装centos的yum源 RUN yum install epel-release -y RUN yum -y install wget # 安装python 3.6 RUN yum install -y libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make # 存放安装包的路径 WORKDIR /opt/install RUN wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz # 解压 RUN tar -zxvf Python-3.6.8.tgz WORKDIR Python-3.6.8 RUN ./configure RUN make&&make install
- 打包镜像
docker build -t python3:centos .
3.4 基于python3:centos打包django镜像
- 创建镜像打包目录,创建Dockerfile、web_run.sh,赋予web_run.sh执行权限
cd django_centos touch 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 #这句指令相当与:cd django项目 WORKDIR /opt/zxq/hello # 安装依赖包 RUN pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple EXPOSE 8002
- 使用当前目录的 Dockerfile 创建镜像,标签为 web:django
docker build -t web:django .
3.5 docker打包nginx镜像
- 创建镜像打包目录,创建Dockerfile
docker pull nginx cd django_nginx touch Dockerfile
- dockerfile写入配置文件
# 指定操作的镜像 FROM docker.io/nginx # 系统部署 RUN mkdir -p /opt/zxq/static
- 使用当前目录的 Dockerfile 创建镜像,标签为 web:nginx
docker build -t web:nginx .
- 启动并访问nginx
# 80是nginx访问端口 docker run -d -p 80:80 --name nginx nginx
访问页面:ip,能够看到欢迎页面,表示nginx启动成功。
- 配置nginx
首先在宿主机建立存放nginx日志、配置文件和相关静态资源的目录,并将其挂载到容器内对应路径
将nginx.conf文件cp到本地,可以看到该文件下引入了其它文件,同样也需要cp到宿主机,进入nginx查看文件名,并cp到本地
docker cp nginx:/etc/nginx/nginx.conf /opt/zxq/nginx/conf/nginx.conf docker cp nginx:/etc/nginx/conf.d/default.conf /opt/zxq/nginx/conf.d/default.conf
- nginx初始访问页面同样cp到本地
docker cp nginx:/usr/share/nginx/html/index.html /opt/zxq/nginx/static/index.html
3.6 基于docker镜像启动django容器
docker run -it -d -p 8002:8002 --name web --rm web:django python3 manage.py runserver 0.0.0.0:8002
8002端口的服务启动后:在外部打开网页时,访问被拒绝,但是本地可以curl通过,尝试关闭防火墙,成功
3.7 基于docker镜像启动django容器–uwsgi
- 创建镜像打包目录,创建Dockerfile
cd uwsgi_django touch Dockerfile
- dockerfile写入配置文件
# 指定操作的镜像 FROM web:django # 指定语言,防止中文日志乱码 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1 # 创建文件夹 # 项目存放路径 RUN mkdir -p /opt/zxq/hello # 拷贝文件 # django项目地址 COPY hello /opt/zxq/hello #这句指令相当与:cd django项目 WORKDIR /opt/zxq/hello EXPOSE 8001 CMD ["uwsgi","/opt/zxq/hello/uwsgi.ini"]
- 创建镜像
docker build -t uwsgi:django .
- 启动容器
docker run -it -d -p 8001:8001 --name web_uwsgi --rm uwsgi:django /bin/bash # 进入容器,id根据实际情况修改 docker exec -it web_uwsgi /bin/bash uwsgi uwsgi.ini
3.8使用nginx代理django容器
docker run -d -p 443:443 -p 80:80 --name nginx -v /opt/zxq/nginx/dist:/usr/share/nginx/html -v /opt/zxq/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/zxq/nginx/log:/var/log/nginx -v /opt/zxq/nginx/conf.d:/etc/nginx/conf.d -v /opt/zxq/nginx/ssl:/ssl nginx



