路飞学城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
        
posted @ 2022-04-12 16:56  Edmond辉仔  阅读(151)  评论(0编辑  收藏  举报