项目部署流程linux安装各种软件配置项目在线上启动

1 支付成功前端

charset=utf-8&
out_trade_no=64d01b38-fa0d-4cb9-98d6-e425475022c1&   # 咱们的订单号
method=alipay.trade.page.pay.return&
total_amount=299.00&   #订单价格
sign=ChuB%2BP4VwYYxl5iRlEmqtaLbE0cG1qtTL7OY3BhoYFrJY9oJAwosDsu9nuJ35roZH7PuXKkbFwDCxG7f%2BDePSo0uztGEGkL%2BawZwb3024wmDxK3Ci8TQRWRO8AusAJDokfV28LM78cQZKnHuaG6RILtPxAsgkrks1I2mtWVm9lOm9siTswsiKD2a7e0BX2%2BvQFqSVYdFZBKP8s8skKfvRijKcXneXsF%2BkAcfBOB1n5f7bVIcYsHT9CYLQwUrH3iIz40H8orKW4HLuw2oMSqSBLOEiqksYfMgHC4jeoz6ASpgWNBWipeD0T%2FX7fN5GfzOvoqkuG%2BzNF436OTjXGRlOQ%3D%3D&
trade_no=2022072022001479300501762515&  #支付宝流水号
auth_app_id=2016092000554611&
version=1.0&
app_id=2016092000554611&
sign_type=RSA2&seller_id=2088102176466324&
timestamp=2022-07-20%2009%3A33%3A47  # 支付时间
<template>
  <div class="pay-success">
    <!--如果是单独的页面,就没必要展示导航栏(带有登录的用户)-->
    <Header/>
    <div class="main">
      <div class="title">
        <div class="success-tips">
          <p class="tips">您已成功购买 1 门课程!</p>
        </div>
      </div>
      <div class="order-info">
        <p class="info"><b>订单号:</b><span>{{ result.out_trade_no }}</span></p>
        <p class="info"><b>交易号:</b><span>{{ result.trade_no }}</span></p>
        <p class="info"><b>付款时间:</b><span><span>{{ result.timestamp }}</span></span></p>
      </div>
      <div class="study">
        <span>立即学习</span>
      </div>
    </div>
  </div>
</template>

<script>
import Header from "@/components/Header"

export default {
  name: "Success",
  data() {
    return {
      result: {},
    };
  },
  created() {
    // url后拼接的参数:?及后面的所有参数 => ?a=1&b=2
    // console.log(location.search);

    // 解析支付宝回调的url参数
    console.log(location.search)
    let params = location.search.substring(1);  // 去除? => a=1&b=2
    let items = params.length ? params.split('&') : [];  // ['a=1', 'b=2']
    //逐个将每一项添加到args对象中
    for (let i = 0; i < items.length; i++) {  // 第一次循环a=1,第二次b=2
      let k_v = items[i].split('=');  // ['a', '1']
      //解码操作,因为查询字符串经过编码的
      if (k_v.length >= 2) {
        // url编码反解
        let k = decodeURIComponent(k_v[0]);
        this.result[k] = decodeURIComponent(k_v[1]);
        // 没有url编码反解
        // this.result[k_v[0]] = k_v[1];
      }

    }
    // 解析后的结果
    console.log(this.result);


    // 把地址栏上面的支付结果,再get请求转发给后端
    this.$axios({
      url: this.$settings.base_url + '/order/success/' + location.search,
      method: 'get',
    }).then(response => {
      console.log(response.data);
      if (response.data.code != 100) {
        alert(response.data.msg)
      }
    }).catch(() => {
      console.log('支付结果同步失败');
    })
  },
  components: {
    Header,
  }
}
</script>

<style scoped>
.main {
  padding: 60px 0;
  margin: 0 auto;
  width: 1200px;
  background: #fff;
}

.main .title {
  display: flex;
  -ms-flex-align: center;
  align-items: center;
  padding: 25px 40px;
  border-bottom: 1px solid #f2f2f2;
}

.main .title .success-tips {
  box-sizing: border-box;
}

.title img {
  vertical-align: middle;
  width: 60px;
  height: 60px;
  margin-right: 40px;
}

.title .success-tips {
  box-sizing: border-box;
}

.title .tips {
  font-size: 26px;
  color: #000;
}


.info span {
  color: #ec6730;
}

.order-info {
  padding: 25px 48px;
  padding-bottom: 15px;
  border-bottom: 1px solid #f2f2f2;
}

.order-info p {
  display: -ms-flexbox;
  display: flex;
  margin-bottom: 10px;
  font-size: 16px;
}

.order-info p b {
  font-weight: 400;
  color: #9d9d9d;
  white-space: nowrap;
}

.study {
  padding: 25px 40px;
}

.study span {
  display: block;
  width: 140px;
  height: 42px;
  text-align: center;
  line-height: 42px;
  cursor: pointer;
  background: #ffc210;
  border-radius: 6px;
  font-size: 16px;
  color: #fff;
}
</style>

2 支付成功后端回调接口

# 支付宝:get回调,调前端---》已经写好了---->发送ajax请求,给咱们后端,做一个二次校验(校验订单是否支付)----》后端配合一个get接口,查询订单是否支付
# 支付宝:post回调,调后端---》后端需要配合一个post接口,接受支付宝的post回调,修改订单状态


# 写在一个视图类中-----》支付宝的post回调,我们的视图类能有登录认证吗?---》没有认证,我们信得过吗?验证签名(第三方支付宝sdk提供了,调它方案验证即可)----》修改订单状态
class PaySuccessView(ViewSet):
    authentication_classes = []
    permission_classes = []

    # 给前端做二次校验用
    def list(self, resquest):
        out_trade_no = resquest.query_params.get('out_trade_no')
        order = Order.objects.filter(out_trade_no=out_trade_no, order_status=1).first()
        if order:
            return APIResponse()
        else:
            return APIResponse(code=101, msg='暂时还没收到你的付款')

    # 给支付宝用的--->必须把项目部署在公网上才能回调成功
    def create(self, request):
        try:
            # post提交的数据(支付宝回调格式:urlencoded,QueryDic)
            #
            # from django.http.request import QueryDict
            #
            # print(type(request.data))
            # 把QueryDic对象转成真正的dict对象,就可以修改,pop
            result_data = request.data.dict()
            #我们的订单号
            out_trade_no = result_data.get('out_trade_no')
            #支付宝的签名
            signature = result_data.pop('sign')
            from libs.ipay import alipay
            result = alipay.verify(result_data, signature)
            if result and result_data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
                # 完成订单修改:订单状态、流水号、支付时间
                Order.objects.filter(out_trade_no=out_trade_no).update(order_status=1)
                # 完成日志记录
                logger.warning('%s订单支付成功' % out_trade_no)
                # 支付宝要的格式就这个格式
                return Response('success')
            else:
                logger.error('%s订单支付失败' % out_trade_no)
        except:
            pass
        return Response('failed')

内网穿透

# 把自己内网的项目,可以被外网访问

https://zhuanlan.zhihu.com/p/370483324

3 上线架构图

上线图

4 阿里云购买

# 买阿里云服务器(腾讯云,华为云,xx云)
# 阿里云官方购买esc服务器
# 安装git  
yum install git  -y
mkdir /home/project
cd /home/project
git clone https://gitee.com/liuqingzheng/luffyapi.git

5 云服务器安装mysql

yum -y groupinstall "Development tools"   # 包含了很多开发的工具(git)
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel


# 安装步骤
1)前往用户根目录
  cd ~   #切换到用户家路径

2)下载mysql57
>: 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 install mysql-community-server --nogpgcheck

4)启动mysql57并查看启动状态
>: systemctl start mysqld.service
>: systemctl status mysqld.service

5)查看默认密码并登录
>: grep "password" /var/log/mysqld.log
 iag%<ohj+5F7
>: mysql -uroot -p

6)修改密码
>: ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
>: ALTER USER 'root'@'localhost' IDENTIFIED BY 'Lqz12345?';

6 云服务器安装redis(源码安装)

1)前往用户根目录
>: cd ~

2)下载redis-5.0.5(源码包)
>: wget http://download.redis.io/releases/redis-5.0.5.tar.gz


3)解压安装包
>: tar -xf redis-5.0.5.tar.gz

4)进入目标文件
>: cd redis-5.0.5

5)编译环境(gcc编译---》可执行文件--》src---》可执行文件)
# c语言写的redis,是编译型语言,需要在不同平台编译成不同平台的可执行文件,才能执行
>: make

6)复制环境到指定路径完成安装
>: cp -r /root/redis-5.0.5 /usr/local/redis

7)配置redis可以后台启动:修改下方内容
>: vim /usr/local/redis/redis.conf

daemonize yes

8)完成配置修改
>: esc
>: :wq

9)建立软连接
>: 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 &

ctrl + c

11)测试redis环境
>: redis-cli
ctrl + c

12)关闭redis服务
# 客户端连进去,敲  shutdown
>: pkill -f redis -9

7 云服务器安装python3.8(源码安装)

# 阿里云的centos默认装了python3.6

yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel  -y

# 1前往用户根目录
>: cd ~

#2 下载 或 上传 Python3.8.6  服务器终端
wget https://registry.npmmirror.com/-/binary/python/3.8.6/Python-3.8.6.tgz

#3  解压安装包
tar -xf Python-3.8.6.tgz

#4 进入目标文件
cd Python-3.8.6

#5  配置安装路径:/usr/local/python3
# 把python3.8.6 编译安装到/usr/local/python38路径下
>: ./configure --prefix=/usr/local/python38

#6  编译并安装,如果报错,说明缺依赖
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel  -y
make &&  make install

#7  建立软连接:/usr/local/python38路径不在环境变量,终端命令 python3,pip3
ln -s /usr/local/python38/bin/python3 /usr/bin/python3.8
ln -s /usr/local/python38/bin/pip3 /usr/bin/pip3.8

python      2.x      pip 
python3      3.6      pip3
python3.8    3.8      pip3.8

#8  删除安装包与文件:
>: rm -rf Python-3.8.8
>: rm -rf Python-3.8.8.tar.xz

8 安装uwsgi

# 使用uwsgi运行django,安装
# uwsgi是符合wsgi协议的web服务器,使用c写的性能高,上线要使用uwsgi
# 安装步骤
1)在真实环境下安装
pip3.8 install uwsgi

2)建立软连接
ln -s /usr/local/python38/bin/uwsgi /usr/bin/uwsgi

9 安装虚拟环境

1)安装依赖
>: pip3.8 install virtualenv
# python3.8 -m pip install --upgrade pip
# python3.8 -m pip install --upgrade setuptools
# pip3.8 install pbr
>: pip3.8 install -U virtualenvwrapper -i https://pypi.douban.com/simple/ 
>: pip3.8 install virtualenvwrapper

2)建立虚拟环境软连接
>: ln -s /usr/local/python38/bin/virtualenv /usr/bin/virtualenv

3)配置虚拟环境:填入下方内容
>: 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


8)  mkvirtualenv -p python3.8 luffy

10 安装nginx(源码安装)

1)前往用户根目录
>: cd ~

2)下载nginx1.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 && 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 
   # 停止: nginx -s stop
>: 服务器绑定的域名 或 ip:80

# netstat -nlp | grep 80

11 路飞前端部署

#1  修改前端向后端发ajax请求的地址:项目的地址
#2  编译vue项目成html,css,js
npm run build  
#3  项目根路径下生成dist文件夹(编译过后的文件)

#4  本地压缩成zip  (不要压成rar)

#5 在服务器安装软件:yum install lrzsz 
#6 直接把dist.zip 拖到 云服务器上去
#或者在云服务器敲 rz  选择上传

#7 yum install unzip
unzip dist.zip
#8 移动并重命名
mv ~/dist /home/html

# 9 去向Nginx配置目录,备份配置,完全更新配置:填入下方内容
#/usr/local/nginx/conf/nginx.conf 是nginx的配置文件
	# 制定nginx启动监听哪个端口
    # 做请求转发,做负载均衡
    # 做静态文件代理
>: cd /usr/local/nginx/conf
>: mv nginx.conf nginx.conf.bak   #做个备份
>: vim nginx.conf

events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen 80;
        server_name  127.0.0.1;
        charset utf-8;
        location / {
            root /home/html;
            index index.html;
        }
    }
} 

# 10 执行 
# ps aux |grep nginx
nginx -s reload  #重新加载配置文件
#或者
nginx -s stop
nginx

12 路飞后端部署

# 确认好wsgi.py的配置文件是os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.pro')


1)创建线上luffy项目虚拟环境
>: mkvirtualenv luffy
>: workon luffy

2)安装所需环境,在packages.txt所在目录下安装执行requirements.txt文件
>: pip install uwsgi   # 虚拟环境下也要装uwsgi
>: pip install -r ./requirements.txt
# 先把mysqlclient注释掉
yum install mysql-devel
yum install python-devel
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
pip install mysqlclient

12.2 配置luffy数据库

1)管理员连接数据库
>: mysql -uroot -p

2)创建数据库
>: create database luffy default charset=utf8;

3)设置权限账号密码:账号密码要与项目中配置的一致
>: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
>: grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
>: flush privileges;

4)退出mysql
>: quit;

12.3 迁移数据库

# 必须在luffy环境下
1)数据库迁移
python manage_prod.py makemigrations
python manage_prod.py migrate

2)把本地数据,导入到生产库
#在 navicate中 把数据库转储成sql
# 在生产库导入进去

12.4 使用uwsgi启动django

#1进行uwsgi服务配置,内容如下
>: vim ./luffyapi.xml   # uwsgi的配置文件

<uwsgi>    
   <socket>127.0.0.1:8888</socket>
   <chdir>/home/project/luffyapi/</chdir>   
   <module>luffyapi.wsgi</module>
   <processes>4</processes>
   <daemonize>uwsgi.log</daemonize>
</uwsgi>

# 2 启动uwsgi
uwsgi -x ./luffyapi.xml
# 3 查看uwsgi进程
 ps aux |grep uwsgi
 
# 4 配置nginx,把8080的动态请求转发给8888端口
 vim /usr/local/nginx/conf/nginx.conf

events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen 80;
        server_name  127.0.0.1;
        charset utf-8;
        location / {
            root /home/html;
            index index.html;
  
        }
    }
    # 新增的server
    server {
        listen 8080;
        server_name  127.0.0.1;
        charset utf-8;
        location / {
           include uwsgi_params;
           uwsgi_pass 127.0.0.1:8888;
           uwsgi_param UWSGI_SCRIPT luffyapi.wsgi;
           uwsgi_param UWSGI_CHDIR /home/project/luffyapi/;
        }
    }
} 

# 重启nginx
nginx -s reload

13 路飞后台管理样式处理

# uwsgi 只转发动态请求,静态资源它不管

1)编辑线上配置文件
>: vim /home/project/luffyapi/luffyapi/settings/pro.py


2)修改static配置,新增STATIC_ROOT、STATICFILES_DIRS
STATIC_URL = '/static/'
STATIC_ROOT = '/home/project/luffyapi/static'  
STATICFILES_DIRS = (os.path.join(BASE_DIR, "../static"),)

3)退出编辑
>: esc
>: :wq

4)项目目录下没有 static 文件夹需要新建
>: mkdir /home/project/luffyapi/static

5)完成静态文件迁移
>: python /home/project/luffyapi/manage_pro.py collectstatic


6)1)修改nginx配置
>: vim /usr/local/nginx/conf/nginx.conf
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen 80;
        server_name  127.0.0.1;
        charset utf-8;
        location / {
            root /home/html;
            index index.html;
        }
    }
    server {
        listen 8080;
        server_name  127.0.0.1;
        charset utf-8;
        location / {
           include uwsgi_params;
           uwsgi_pass 127.0.0.1:8888;
           uwsgi_param UWSGI_SCRIPT luffyapi.wsgi;
           uwsgi_param UWSGI_CHDIR /home/project/luffyapi/;
        }
        location /static {
            alias /home/project/luffyapi/static;
        }
    }

}

posted on 2022-08-02 21:27  淦白嫖怪  阅读(284)  评论(0)    收藏  举报

导航