路飞学城09--项目上线配置部署
1 购买云服务器,安装必要依赖
# 本地部署-虚拟化:
装个虚拟机部署项目:http://www.liuqingzheng.top/linux/%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/02-Linux%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85/
vmware:虚拟化硬件---》装操作系统
openstack,阿里飞天:管理虚拟化的机器的
# docker:轻量级
# 单机编排 docker-compose
# k8s:多机容器编排
# 云部署
服务器 + 公网地址
阿里云,腾讯云,华为云(免费试用几个月)
阿里云按使用时间计费(账户余额要大于100)
# 买阿里云--->当成你去电脑市场组装了一台电脑
# 云服务器购买:宗旨便宜
cpu:2核
内存:4g
硬盘:高效云盘 20g
系统:Linux centos7.9 7.0-7.9皆可
# 购买公网ip
按量计费 带宽峰值:80M
1.1 远程连接工具介绍
# xshell --》收费,免费
# finalshell--》国人用java开发的
# web端:云厂商自带
# 命令行: git bash
ssh root@8.130.176.65
输入root用户密码
# mac ---》终端里 输入命令:ssh root@8.130.176.65
# linux 操作系统都会自带python2
-系统服务用python2 写的,必须要有
-项目跑在python3,需要额外安装 (阿里云装了python3.6)
-我们再装一个:3.6 3.7
-python
-pip
故:命令时,需要指定 python3、pip3 -->环境变量名称
1.2 分离项目部署形式
# 前后端分离项目部署的两种形式
1.将前端把打包好的index.html等资源文件直接放到后端项目中 # 小项目,方便部署而已(单个项目)
django直接就把index.html页面render回去
# 优点:不会出现跨域问题
# 缺点:动静没有分离,所有的资源请求 全在uwsgi上
2.前后端分开部署,会出现跨域问题 # 常用
# 优点:动静分离,再加django的collection 静态文件收集
uwsgi服务请求压力小
# 缺点:需要额外处理跨域问题
1.3 项目部署架构
# 浏览器:默认端口 80
# 服务器安装: python解释器、mysql、redis、Nginx、uwsgi
# 整体部署架构:
浏览器:默认80的静态请求--->Nginx代理--->前端静态资源
浏览器:8000的动态请求 --->Nginx请求转发--->后端动态资源 (8080端口 uwsgi进行请求处理)
浏览器:8000/admin的静态请求--->Nginx代理--->后端混合的静态资源 (直接使用Nginx进行请求处理,不使用uwsgi进行处理)
# Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器
# Apache和Nginx最核心的区别在于
apache 是同步多进程模型,一个连接对应一个进程;
nginx 是异步的,多个连接(万级别)可以对应一个进程
# Nginx的作用: # 好好整理
-请求转发:
就是HTTP反向代理,可以监听很多客户端以及端口的请求,然后把不同端口的请求,转发到不同的端口进行处理
-动静分离:
把动态请求和静态请求分开,可以理解成使用Nginx处理静态页面,uwsgi处理动态页面
什么是动态请求?
比如说我们需要去查询数据库,从数据库中返回需要的信息,那么这种请求我们就可以使用nginx直接给转发到uwsgi去处理
什么是静态请求?
比如说我们现在需要去请求得到一个图片的地址或者一个html文件,就可以使用nginx,把请求去指向一个静态资源服务器
动静分离目前大致分为两种:
1.是纯粹把静态文件独立成单独的域名,放在独立的服务器上
2.是动态和静态文件放在同一服务器上,通过nginx分开 通过location指定不同的后缀名实现不同的请求转发。
-负载均衡:
同时有一万个请求过来,nginx可以按照一些算法(平均、权重等)转发给服务器集群中,分担处理
1.4 阿里云服务器配置
# yum install 软件名
yum update -y # 更新一下yum源 -y 表示yes 同意
# 安装一下开发工具软件(包含git) 执行一个就可以
yum -y groupinstall "Development tools" # 用这个
# 安装一些额外依赖
# python3.6的依赖
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel -y
# python3.7的依赖
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel -y
# 注意:从python3.8.16 后开始,centos7默认的openss版本过低
安装openssl11解决依赖版本问题
yum install -y epel-release.noarch
yum install -y openssl11 openssl11-devel
tar xf Python-3.10.5.tgz
cd Python-3.10.5
# 替换openssl 为openssl11
sed -i 's/PKG_CONFIG openssl /PKG_CONFIG openssl11 /g' configure
./configure --prefix=/usr/local/python3.10 && make && make install
2 安装Mysql(rpm包安装)
1)前往用户根目录
cd ~
2)下载mysql57的rpm包
wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
3)安装mysql57
>: yum -y install mysql57-community-release-el7-10.noarch.rpm
>: yum -y install mysql-community-server # 安装mysql的服务端
# 安装mysql的服务端 出错
大致意思就是MySQL的GPG升级了,需要更新,如果是新安装的MySQL,执行以下脚本即可:
# 新安装mysql,就执行导入公钥的命令;若是更新mysql,就需要更改/etc/yum.repos.d/文件
# 查找相应的GPG密钥,并导入到rpm中
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
4)启动mysql57并查看启动状态
>: systemctl start mysqld.service
>: systemctl status mysqld.service
5)查看默认密码并登录
>: grep "password" /var/log/mysqld.log # 查看随机生成的密码是什么
>: mysql -uroot -p
6)修改密码
>: ALTER USER 'root'@'localhost' IDENTIFIED BY 'Mzx1234?';
3 安装Redis(源码编译安装)
1)前往用户根目录
cd ~
2)下载redis-5.0.5
>: wget http://download.redis.io/releases/redis-5.0.5.tar.gz
http://download.redis.io/releases/redis-6.0.6.tar.gz
3)解压安装包
>: tar -xf redis-5.0.5.tar.gz
4)进入目标文件
>: cd redis-5.0.5
5)编译环境
>: make # 只把源码编译成可执行文件,并没直接安装 make install
# 因为redis没有 ./configure 文件,不能直接编译安装
6)复制环境到指定路径完成安装
>: cp -r ~/redis-5.0.5 /usr/local/redis # 直接把可执行文件,赋值到目录(相当于安装)
7)配置redis可以后台启动:修改下方内容(可以不改)
>: vim /usr/local/redis/redis.conf
daemonize yes
8)完成配置修改
>: esc
>: :wq
9)建立软连接 # /usr/bin/在环境变量下,以后任意路径敲命令都可以执行
>: ln -s /usr/local/redis/src/redis-server /usr/bin/redis-server
>: ln -s /usr/local/redis/src/redis-cli /usr/bin/redis-cli
10)后台运行redis
>: cd /usr/local/redis
>: redis-server ./redis.conf & # 使用配置文件启动 &:以后台形式运行
11)测试redis环境
>: redis-cli
12)关闭redis服务
>: pkill -f redis -9 # 或者 redis服务中 shutdown
4 安装python解释器(3.8)
# 源码编译安装---》源码
1)前往用户根目录
>: cd ~
2)下载
# 服务器终端
>: wget https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tar.xz
3)解压安装包
>: tar -xf Python-3.8.8.tar.xz
4)进入目标文件
>: cd Python-3.8.8.tar.xz
5)配置安装路径:/usr/local/python38
# 把python3.8.8 编译安装到/usr/local/python38路径下
>: ./configure --prefix=/usr/local/python38
6)编译并安装
>: make && make install
7)建立软连接:终端命令 python3.8,pip3.8
>: ln -s /usr/local/python38/bin/python3 /usr/bin/python3.8
>: ln -s /usr/local/python38/bin/pip3 /usr/bin/pip3.8
8)删除安装包与文件:
>: rm -rf Python-3.8.8
>: rm -rf Python-3.8.8.tar.xz
5 安装uwsgi
# uwsgi+django运行
# python安装uwsgi模块
pip3.8 install uwsgi # 用c写的web服务器,性能高,能抗高并发
# 安装完成,会有一个uwsgi的可执行文件,在python中的/bin目录中
# 建立软连接
ln -s /usr/local/python38/bin/uwsgi /usr/bin/uwsgi
# 以后跑项目不是使用python manage.py runserver 跑(wsgiref)
# 而是使用 uwsgi -配置文件 跑
6 安装虚拟环境
# Linux下修改pip源方法如下:
linux下,修改 ~/.pip/pip.conf (没有就创建一个),
[global]
timeout = 6000
index-url = http://pypi.douban.com/simple
trusted-host = pypi.douban.com
1)安装依赖
>: pip3.8 install virtualenv
>: pip3.8 install virtualenvwrapper
# 升级pip
python3.8 -m pip install --upgrade pip
2)建立虚拟环境软连接
>: ln -s /usr/local/python38/bin/virtualenv /usr/bin/virtualenv
3)配置虚拟环境: # 添加到root用户 环境变量中
>: vim ~/.bash_profile
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.8
source /usr/local/python38/bin/virtualenvwrapper.sh
4)退出编辑状态
>: esc
5)保存修改并退出
>: :wq
6)更新配置文件内容
>: source ~/.bash_profile
7)虚拟环境默认根目录:~/.virtualenvs
# 创建虚拟环境
mkvirtualenv -p python3.8 luffy
7 安装Nginx(请求转发,动静分离)
1)前往用户根目录
>: cd ~
2)下载nginx 1.13.7
>: wget http://nginx.org/download/nginx-1.13.7.tar.gz
3)解压安装包
>: tar -xf nginx-1.13.7.tar.gz
4)进入目标文件
>: cd nginx-1.13.7
5)配置安装路径:/usr/local/nginx
>: ./configure --prefix=/usr/local/nginx
6)编译并安装
>: make && sudo make install
7)建立软连接:终端命令 nginx
>: ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
8)删除安装包与文件:
>: cd ~
>: rm -rf nginx-1.13.7
>: rm -rf nginx-1.13.7.tar.xz
9)测试Nginx环境,服务器运行nginx,本地访问服务器ip
>: nginx
>: 服务器绑定的域名 或 ip:80
10) nginx 常用命令
1)启动
>: nginx
>: ps aux |grep nginx # 查看进程
2)关闭nginx
>: nginx -s stop
3)重启nginx
>: nginx -s reload
4)查看端口,强行关闭
>: ps -aux|grep nginx
>: kill <pid:进程编号>
8 配置前端项目,上传,部署
# 把setting.js中的后端路径改成咱们的服务器地址
export default {
base_url:'http://8.130.176.65:8000/api/v1/'
}
# npm run build ---》把vue项目编译成纯静态
# 将静态文件夹(dist) 复制到 远程服务器
# 方式一:lrzsz软件 (上传下载软件)
# 在服务器上安装-软件(lrzsz)
yum install -y lrzsz
# 上传文件 (按住文件,拖到服务器即可 或使用命令)
rz : 上传
sz <file-name> : 下载
# 安装解压软件 unzip
yum install unzip -y
# 解压zip
unzip dist.zip
# 方式二:linux scp命令 (Linux 之间复制文件和目录)
scp -r dist root@39.99.192.127:~
# scp - r 本机文件夹路径 远程用户@远程主机:路径
mkdir /home/html # 新建文件夹
mv ~/dist /home/html # 移动文件
# 配置nginx,代理静态文件
cd /usr/local/nginx/conf
# nginx.conf 是nginx的配置文件
mv nginx.conf nginx.conf.bak # 把原始的配置文件备份
# 新建配置文件
vim nginx.conf
# 单个进程最大连接数(最大连接数=连接数*进程数):1024
events {
worker_connections 1024;
}
# 设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
# 文件扩展名与文件类型映射表
include mime.types;
# 默认文件类型
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name 127.0.0.1; # 域名,没有就是本地ip
charset utf-8;
# 定义:根路径 '/' 对应的资源
location / {
root /home/html/dist; # 访问路径目录
index index.html; # index 对应的html文件名称
try_files $uri $uri/ /index.html; # 解决单页面应用刷新404问题
}
}
}
# 重启nginx即可
nginx -s stop
nginx
# 访问http://8.130.176.65/就能看到前端
9 配置后台项目,部署
# 先修改后台项目的配置,将有关的ip地址 设置正确
后端ip:服务器ip + 8000
前端ip:服务器ip
# 项目在服务器上运行,关于migrations要不要提交的问题
-如果提交:好处是可以看到开发阶段所有的表变化情况
-如果不提交:服务端自己维护一套迁移变化,不会和本地出冲突
# 每个项目,都会有项目的依赖库
-放在项目根路径下:requirements.txt
-pip list # 当前环境安装了哪些模块
-pip freeze > requirements.txt # 把当前虚拟环境中所的依赖,写入到requirements.txt
# 在服务器上,把后端项目拉下来
mkdir /home/project
cd /home/project
git clone https://gitee.com/liuqingzheng/luffy_api.git
# 创建虚拟环境,在虚拟环境中,把所有依赖装好
workon luffy
# mysqlclient装不上
yum install mysql-devel
yum install python-devel
pip install mysqlclient
pip install -r requirements.txt
pip install -r requirements.txt -i 豆瓣源 # 下载
pip install uwsgi # 在正式环境和虚拟环境都要装一下uwsgi
# 配置数据库(创建luffy库,创建luffynew用户)
1)管理员连接数据库
>: mysql -uroot -pMzx1234?
2)创建数据库
>: create database luffy default charset=utf8;
3)设置权限账号密码:账号密码要与项目中配置的一致
>: grant all privileges on luffy.* to 'luffynew'@'%' identified by 'Luffy123?';
>: grant all privileges on luffy.* to 'luffynew'@'localhost' identified by 'Luffy123?';
>: flush privileges;
4)退出mysql
>: quit;
# 执行两条迁移命令
cd /home/project/luffyapi/
python manage_pro.py makemigrations
python manage_pro.py migrate
# 使用uwsgi+django运行项目
# 先用python manage_pro.py runserver 0.0.0.0:8000 先用wsgiref启动项目试试
# 写uwsgi的配置文件,项目根路径下
vim luffy.xml
<uwsgi>
<socket>127.0.0.1:8080</socket> <!--uwsgi运行后端的端口-->
<chdir>/home/project/luffy_api</chdir> <!--后端项目路径-->
<module>luffy_api.wsgi</module> <!--wsgi.py所在的目录名+.wsgi-->
<processes>4</processes> <!--进程数-->
<daemonize>uwsgi.log</daemonize> <!--日志文件-->
</uwsgi>
# 启动uwsgi
uwsgi -x ./luffy.xml
ps aux |grep uwsgi
# 关闭uwsgi
pkill -9 uwsgi
# 配置nginx 转发给uwsgi
server {
listen 8000;
server_name 127.0.0.1;
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8080; # 端口要和uwsgi里配置的一样
uwsgi_param UWSGI_SCRIPT luffy_api.wsgi; # wsgi.py所在的目录名+.wsgi
uwsgi_param UWSGI_CHDIR /home/project/luffy_api/; # 项目路径
}
}
# 查看端口被哪个进程监听
netstat -nlp|grep 80
# 导入测试数据 (远程连接数据库,导入数据)
# 后台管理,动静分离
# 原理:
1.将混合部分的django静态资源,收集到'项目/static'目录下
2.再用nginx代理,静态资源的访问
# 修改线上的pro.py 配置文件,加入
STATIC_ROOT = '/home/project/luffy_api/luffy_api/static'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
# 创建static文件夹
>: mkdir /home/project/luffy_api/luffy_api/static
# 完成静态文件迁移(把静态的js,css都收集到,上面那个static文件夹下)
# 前后端混合的项目必须这么做
python manage_pro.py collectstatic
# 再混合项目的静态资源,使用nginx代理
# 新增的配置静态文件
location /static {
alias /home/project/luffy_api/luffy_api/static;
}
# 重启nginx即可
nginx -s reload
# 启动celery 项目根路径下 虚拟环境下
celery -A xx worker -l info
celery -A xx beat -l info
项目连接上域名
1 买一个域名:www.liuqingzheng.top
2 在阿里云的域名解析配置一下
一键部署
学习:https://pythondjango.cn/django/advanced/16-docker-deployment/
# 前提,需要会写 docker-compose.yml 文件
一 安装Docker
# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
yum install -y docker-ce
# 设置开机启动
systemctl enable docker
# 启动 Docker
systemctl start docker
# 查看版本
docker version
二 安装Docker-compose
# 下载
curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m) > /usr/bin/docker-compose
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 镜像源
# 赋予执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose --version
# 下载代码
git clone https://gitee.com/liuqingzheng/luffy.git
# docker 一键部署
docker-compose up -d
# 关掉docker
docker-compose down
补充
Python操作FastDFS
# 使用fastdfs托管文件 (自己用服务器搭fastdfs托管文件)
https://zhuanlan.zhihu.com/p/372286804
# 安装py3Fdfs模块
# 自己写配置文件 client.conf
connect_timeout=30
network_timeout=60
tracker_server = ip地址:端口
http.tracker_server_port = 8888 # tracker服务器的端口
# 上传脚本
from fdfs_client.client import get_tracker_conf, Fdfs_client
tracker_conf = get_tracker_conf('./client.conf')
client = Fdfs_client(tracker_conf)
# 文件上传
result = client.upload_by_filename('./mv.jpg')
print(result)
# {'Group name': b'group1', 'Remote file_id': b'group1/M00/00/00/rBMGZWCeGhqAR_vRAAIAABZebgw.sqlite', 'Status': 'Upload successed.', 'Local file name': './db.sqlite3', 'Uploaded size': '128.00KB', 'Storage IP': b'101.133.225.166'}
# 访问地址即可下载:http://101.133.225.166:8888/group1/M00/00/00/rBMGZWFmSlCAOcasAAC9pFM4oB8556.jpg
# 文件下载
result = client.download_to_file('./zmyh.jpg', b'group1/M00/00/00/rBMGZWFmSlCAOcasAAC9pFM4oB8556.jpg')
print(result)
# 文件删除
result = client.delete_file(b'group1/M00/00/00/rBMGZWFmSlCAOcasAAC9pFM4oB8556.jpg')
print(result)
# ('Delete file successed.', b'group1/M00/00/00/rBMGZWFmSlCAOcasAAC9pFM4oB8556.jpg', b'101.133.225.166')
# 列出所有的group信息
result = client.list_all_groups()
print(result)
依赖库的生成和下载
# 每个python项目,都应该有个requirement.txt--->项目依赖的模块
pip freeze >requirement.txt # 生成
pip install -r requirement.txt -i 豆瓣源 # 下载
# 使用whl文件装,windows上你装的模块,都是 xxx.whl文件
-直接去网站搜:https://www.lfd.uci.edu/~gohlke/pythonlibs
-指定版本和平台下载:Twisted‑20.3.0‑cp36‑cp36m‑win_amd64.whl
-cmd下:pip3 install 文件的路径
# 离线安装
pip download -r requirement.txt -d "D:\pipDownloadTest" # 下载一堆的wheel 文件到文件夹
切换终端在待安装文件目录下(D:\pipDownloadTest) # 离线机器 进入文件夹,再安装库
pip install PyMySQL-0.9.3-py2.py3-none-any.whl
pip install --no-index --find-links="D:\pipDownloadTest" -r requirements.txt