Operation

news2024/11/25 4:41:40

contents

  • 服务器
    • 一、相关概念
      • 1.1 云服务器与实例
      • 1.2 关于域名解析延时与80端口
      • 1.3 关于备案
      • 1.4 关于SSL证书
      • 1.5 关于SSL证书的签发
      • 1.6 关于SSL证书的部署
      • 1.7 关于LNMP和LAMP
      • 1.8 关于bt面板
    • 二、单服务器+单一级域名=多网站
      • 2.1 创建多个二级域名
      • 2.2 解析二级域名绑定到服务器上
      • 2.3 理解二级域名的访问
      • 2.4 实现不同的域名访问不同的文件
  • 部署flask
    • 一、远程连接服务器
    • 二、配置MySQL
      • 2.1 放通端口
      • 2.2 安装MySQL并启动
      • 2.3 配置MySQL
      • 2.4 更改config.py
      • 2.5 本地连接远程数据库
      • 2.6 本地构造数据库信息
    • 三、配置Nginx
      • 3.1 放通端口
      • 3.2 安装Nginx并启动
    • 四、配置python
      • 4.1 安装python
      • 4.2 安装python环境管理包
    • 五、项目相关
      • 5.1 创建py虚拟环境
      • 5.2 Git管理
      • 5.3 配置flask运行环境
      • 5.4 运行flask应用
        • 1 内测阶段
        • 2 公测阶段
      • 5.4 一些bug

服务器

一、相关概念

1.1 云服务器与实例

一个云服务器相当于一个抽象的类,在其中购买配置了指定的实例后相当于实例化一个类,从而一个云服务器对应一个实例

1.2 关于域名解析延时与80端口

在给购买好的域名进行解析的时候,即指向自己服务器的公网IP的时候,可能会有一段时间的延时。但其实可能是没有给云服务器放通80端口导致的

1.3 关于备案

首先需要清除的概念是,备案指的是给网站主机,也就是云服务器进行备案,而一般而言的域名备案其实就是给云服务器备案,只不过叫做域名备案很可能是因为大家在使用域名的时候才发现不备案是无法通过域名访问网站的。这是因为云服务器厂家做的设定,也只是顺应了政策的需求

当前的形式是,对于指向中国大陆 ip 的云服务器需要备案,如果指向的是非中国大陆的 ip,就不需要备案了。一般而言,中文的指向HK,英文的指向UK

1.4 关于SSL证书

http协议默认使用的是80端口,而申请了SSL证书后,通过https协议访问的网站默认使用的是443端口,因此需要提前在实例的安全组中,放通443端口

1.5 关于SSL证书的签发

  • 如果是基于bt面板操作的话。可以通过ssl选项中“Let’s Encrypt”的选项免费申请三个月的用量
  • 由于是基于bt面板管理,需要打开强制通过https进入这个选项,从而直接默认使用https协议访问网站
  • 如果想要通过官方渠道获取。可以在阿里云或者腾讯云等直接免费领取一定额度的ssl证书

1.6 关于SSL证书的部署

获得已签发的ssl证书后,下载下来,再通过bt面板进行部署

  1. 证书文件:pem 文件
  2. 密钥文件:key 文件
image-20230826104235878

1.7 关于LNMP和LAMP

  • LNMP是一组Linux操作系统下的Nginx、MySQL、PHP和Perl的组合安装包,常用于构建高性能的Web服务器。通过使用LNMP,可以快速搭建一个功能强大的网站系统
  • LAMP是指Linux、Apache、MySQL和PHP的组合,它是一个开源的Web开发平台。这个组合通常被用来构建高性能的Web应用程序

1.8 关于bt面板

简介:其实就是一个类windows的linux环境下的可视化管理工具

安装:服务器安装宝塔面板,基于不同的linux系统会有不同的指令,详情见宝塔面板安装地址,选择相应的指令进行安装即可

进入:通过bt指令进入服务器可视化管理界面

image-20231215190014294

管理:安装网站运行所需的环境,耗时如下:

image-20230826190642441

二、单服务器+单一级域名=多网站

参考:通过Nginx在一台服务器部署多个Web应用

2.1 创建多个二级域名

多个网站可以通过二级域名的形式只依赖一个一级域名,从而实现一个域名衍生出多个子域名的形式,即一级域名为 baidu.com,二级域名为 mcn.baidu.comcareer.baidu.com 等等

2.2 解析二级域名绑定到服务器上

每一个二级域名都需要解析到相应的IP地址,即主机记录对应记录值,才能进行后续的访问。其实可以理解为,将不同的二级域名都绑定到当前的服务器上,像这样:

image-20230826011106105

2.3 理解二级域名的访问

我们通过不同的二级域名访问网站时,其实就是访问不同的文件夹中的文件信息,像这样:

image-20230826011328462

2.4 实现不同的域名访问不同的文件

这时我们就需要配置 nginx 的代理服务器了, nginx 中的 nginx.conf 文件示例配置如下

##### example project #####
server {
    listen       443 ssl; # 监听的端口
    server_name  test.cn; # 监听的网址

    # ssl证书的相关文件路径
    ssl_certificate      /usr/local/nginx/ssl/test.cn_bundle.pem;
    ssl_certificate_key  /usr/local/nginx/ssl/test.cn.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    # 项目路径
    location / {
        proxy_pass https://localhost:8080/; # 转向“本地”8080端口
        # root path;  						# 根目录
        # index demo.html;  				# 设置默认页
        # proxy_pass  http://mysvr;  		# 请求转向 mysvr 定义的服务器列表
        # deny 127.0.0.1;  					# 拒绝的ip
        # allow 172.18.5.54; 				# 允许的ip       
    }
}

假如此时我们需要 docs.example.com 访问文档分站(静态),www.example.com 与 example.com 都访问主站(动态),我们就需要配置 nginx 中的 nginx.conf 文件,如下

#----- docs.example.com -----#
server {
    listen       443 ssl; 			# 监听的端口
    server_name  docs.example.com; 	# 监听的网址

    # ssl证书的相关文件路径
    ssl_certificate      /usr/local/nginx/ssl/test.cn_bundle.pem;
    ssl_certificate_key  /usr/local/nginx/ssl/test.cn.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    # 项目路径
    location / {
        root /usr/web/docs;  				# 根目录
    }
}

#----- www.example.com -----#
server {
    listen       443 ssl; 			# 监听的端口
    server_name  www.example.com; 	# 监听的网址

	# ssl证书的相关文件路径
    ssl_certificate      /usr/local/nginx/ssl/b.test.cn_bundle.pem;
    ssl_certificate_key  /usr/local/nginx/ssl/b.test.cn.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
		root /usr/web/www;  				# 根目录
    }
}

#----- example.com -----#
server {
    listen       443 ssl; 			# 监听的端口
    server_name  www.example.com; 	# 监听的网址

	# ssl证书的相关文件路径
    ssl_certificate      /usr/local/nginx/ssl/b.test.cn_bundle.pem;
    ssl_certificate_key  /usr/local/nginx/ssl/b.test.cn.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
		proxy_pass  https://www;  			# 请求转向 mysvr 定义的服务器列表
    }
}

部署flask

一、远程连接服务器

服务器信息

[root@DwjDemo1 ~]# cat /etc/os-release

NAME="Alibaba Cloud Linux"								发行版的名称
VERSION="3 (Soaring Falcon)"							发行版的版本号
ID="alinux"												唯一的标识符
ID_LIKE="rhel fedora centos anolis"						一些类似的发行版
VERSION_ID="3"											发行版的版本编号
PLATFORM_ID="platform:al8"								平台的标识符
PRETTY_NAME="Alibaba Cloud Linux 3 (Soaring Falcon)"	可读的发行版名称和版本号
ANSI_COLOR="0;31"										ANSI终端输出的颜色: "0;31",通常用于表示错误或警告信息
HOME_URL="https://www.aliyun.com/"						发行版的官方网站链接

连接方法

  • 方法一:利用阿里云自带的服务器连接入口,远程连接服务器

  • 方法二:使用MobaXterm端口连接工具并更新全局软件

    yum update
    
  • 输入 username 和 password

二、配置MySQL

2.1 放通端口

服务器放通端口3306

2.2 安装MySQL并启动

参考:Linux安装mysql8.0(官方教程!)

2.3 配置MySQL

设置mysql登录密码

在服务器中连接mysql

mysql -uroot -p

授予权限给自己

# MySQL 5 版本
GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '替换成你的root密码' WITH GRANT OPTION;

# MySQL 8 版本
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '替换成你的root密码';

使用数据库

use mysql

允许远程登录数据库

update user set host = '%' where user = 'root';

刷新更新配置

FLUSH PRIVILEGES;

2.4 更改config.py

修改项目中 config.py 中的配置信息

# @Time   : 2023-12-03 23:25
# @File   : config.py
# @Author : Mr_Dwj

'''
配置文件:
	1. 数据库配置信息
	2. ...
'''

# 数据库的配置信息
HOSTNAME = ''
PORT = '3306'
DATABASE = 'test1'
USERNAME = ''
PASSWORD = ''
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI

2.5 本地连接远程数据库

image-20231207232537233 image-20231207232615304

2.6 本地构造数据库信息

拷贝数据库表 - 直接在DataGrip中寻找进行复制即可

image-20231207232434015

三、配置Nginx

参考:Linux安装Nginx(超详细步骤)

3.1 放通端口

服务器放通80端口

3.2 安装Nginx并启动

进入nginx官网并下载稳定版至本地:image-20231208234403083

上传服务器(直接通过mobaxterm拖拽)并解压到当前目录下并进入nginx文件夹

tar -zxvf nginx-1.20.tar.gz
cd "/home/nginx-1.20/"

配置nginx并编译安装

# 配置configure 
# --prefix 代表安装的路径
# --with-http_ssl_module 安装ssl
# --with-http_stub_status_module 查看nginx的客户端状态
./configure --prefix=/usr/local/nginx-1.20 --with-http_ssl_module --with-http_stub_status_module

# 编译安装
make && make install

进入sbin目录,启动nginx

# 启动nginx
./nginx

解决启动遇到的端口占用的问题

image-20231209001749320

killall -9 nginx 杀掉 nginx 的进程,然后重启


然后浏览器通过http的80端口访问公网ip,就可以看到欢呼雀跃的一幕

image-20231209001703919

四、配置python

4.1 安装python

参考:linux安装python

命令集合

# 安装python依赖
If you want a release build with all stable optimizations active (PGO, etc),please run ./configure --enable-optimizations

# 本地下载拖拽上传至服务器,解压安装包
tar -xvf Python-3.11.tgz

# 进入安装包,配置安装路径
cd Python-3.10.6
./configure --prefix=/usr/local/python311

# 编译安装
make && make install

# 将最新的python创建软链链接
ln -s /usr/local/python311/bin/python3.11 /usr/bin/python311

# 修改yum依赖默认的python版本
vi /usr/libexec/urlgrabber-ext-down
vi /usr/bin/yum

# 修改防火墙
vi /usr/bin/firewall-cmd
vi /usr/sbin/firewalld

# 创建pip软连接
ln -s /usr/local/python311/bin/pip3.11 /usr/bin/pip311

vim的编辑指令

# 进入编辑模式
i

# 退出编辑模式进入命令模式
Esc

# 保存并关闭文件
:w

# 退出vim编辑模式
:q

4.2 安装python环境管理包

安装python虚拟环境管理依赖

pip install virtualenvwrapper

配置虚拟环境

# 在根目录下进入.bashrc文件进行编辑
vi .bashrc
i

# ctrl+f进入末尾,粘贴一下文字,保存并退出
export WORKON_HOME=$HOME/.virtualenvs
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python311
source /usr/local/bin/virtualenvwrapper.sh

# 刷新配置文件
source ~/.bashrc

刷新配置文件时报错:virtualenvwrapper.sh: There was a problem running the initialization hooks.

解决方案参考:virtualenvwrapper.sh报错: There was a problem running the initialization hooks.解决

五、项目相关

5.1 创建py虚拟环境

创建虚拟py环境

mkvirtualenv --python=/usr/bin/python311 <EnvName>

启动虚拟环境

workon <EnvName>

退出虚拟环境

deactivate

5.2 Git管理

进入python虚拟环境目录<EnvName>

初次部署:拉取远程源文件

git clone https://github.com/Explorer-Dong/YunJinWeb.git

后续更新:覆盖原始代码并重新运行应用

git pull
# 找到所有uwsgi进程
ps -ef|grep uwsgi
# 杀死所有进程
kill -9 <进程号>
# 退出uwsgi但是不停止服务的操作
uwsgi -d --ini uwsgi.ini

5.3 配置flask运行环境

检查本项目所需py模块

pip freeze >requirements.txt

安装所需py模块

pip install -r requirements.txt

5.4 运行flask应用

1 内测阶段

使用flask自带的服务器运行

运行flask主接口文件 app.py

python app.py

运行app.py时报错,端口已被占用,解决方案:

  • 方法一:换一个端口运行

  • 方法二:杀死其余的端口占用进程,重启应用

    # 检测端口占用 
    netstat -npl | grep "端口"
                
    # 查找占用端口的进程的PID
    sudo lsof -i:"端口"
                
    # 根据PID杀死该进程
    sudo kill -9 <PID>
    
2 公测阶段

使用uwsgi应用服务器运行

安装并配置uwsgi应用服务器

  • 安装uwsgi包

    pip install uwsgi
    
  • 创建uwsgi.ini文件并编辑

    touch uwsgi.ini
    
    [uwsgi]
    
    # -------------------- 路径相关的设置 --------------------
    
    # 项目的路径
    chdir           = /root/.virtualenvs/test111/demo/
    
    # Flask的uwsgi文件配对的应用
    wsgi-file       = /root/.virtualenvs/test111/demo/app.py
    
    # 回调的app对象
    callable        = app
    
    # Python虚拟环境的路径
    home            = /root/.virtualenvs/test111
    
    # -------------------- 进程相关的设置 --------------------
    
    # 主进程
    master          = true
    
    # 最大数量的工作进程
    processes       = 10
    
    # 监听5000端口(或监听socket文件,与nginx配合)
    http            = :5000 
    
    # socket监听
    # socket        = /srv/[项目名称]/[项目名称].sock
    
    # 设置socket的权限
    # chmod-socket    = 666
    
    # 退出的时候是否清理环境
    vacuum          = true
    
  • 通过uwsgi应用服务器运行flask应用

    uwsgi启动flask项目(venv虚拟环境)

    # 初始启动uwsgi指令
    uwsgi --ini uwsgi.ini
    
  • 退出uwsgi但是不停止服务的操作

    # 退出uwsgi但是不停止服务的操作
    uwsgi -d --ini uwsgi.ini
    
    # 此时想要停止就需要找到uwsgi的进程并全部杀死
    	# 找到所有uwsgi进程
    	ps -ef|grep uwsgi
    	
    	# 杀死所有进程
    	kill -9 <进程号>
    

5.4 一些bug

问题一:读取json时出现问题

error: UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xc3 in position 39: invalid continuation byte

reason: 对 string 解码时出现错误

solve:

将app.py中的

with open('static/json/image_text.json', 'r') as f:
	image_text = json.load(f)

改为

with open('static/json/image_text.json', 'r', encoding='gbk') as f:
	image_text = json.load(f)

参考:https://bobbyhadz.com/blog/python-unicodedecodeerror-utf-8-codec-cant-decode-byte

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1405643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【QML COOK】- 011-动画插值设置

QML中内置了一些动画插值类型。不同的插值类型可以通过Animation的easing属性设置。具体可见&#xff1a;PropertyAnimation QML Type | Qt Quick 6.6.1 1. 创建工程在Main.qml&#xff0c;中编写如下代码 import QtQuickWindow {width: 1000height: 100visible: truetitle: …

数字人直播系统跟无人直播系统的区别是什么?如何选择呢?

有媒体预测&#xff0c;未来几年&#xff0c;数字人工智能将呈现爆发式的增长&#xff0c;数字人系统将广泛应用于各个行业&#xff0c;比如数字人直播&#xff0c;数字人短视频播报&#xff0c;数字人制作的海报宣传等等&#xff0c;当然&#xff0c;这其中应用最广的当属数字…

Python实现离散选择Logit模型(Logit算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 Logit模型&#xff08;Logit model&#xff0c;也译作“评定模型”&#xff0c;“分类评定模型”&…

从想象到现实:Midjourney的AI图像生成之旅

从想象到现实&#xff1a;Midjourney的AI图像生成之旅 继ChatGPT之后&#xff0c;Midjourney作为AI艺术的璀璨明珠&#xff0c;吸引了全球范围内的广泛关注。这款工具通过先进的AI技术&#xff0c;将用户输入的文字描述转化为精美绝伦的图像。无论是风景画、肖像画还是抽象艺术…

CentOS7的安装配置

一. CentOS7的安装【在虚拟机中】 首先创建一个虚拟机&#xff0c; 这个没什么好说的&#xff0c;基本上都是下一下一步安装。 注意它的存放位置最好不要放在C盘&#xff0c; 以及开始创建时选择”稍后安装操作系统“ 创建完成后再配置镜像文件 开启虚拟机&#xff0c;继续下…

【K8S】Kubernetes 中滚动发布由浅入深实战

目录 一、Kubernetes中滚动发布的需求背景1.1 滚动发布1.2 滚动发布、蓝绿发布、金丝雀发布的区别 二、Kubernetes中实现滚动发布2.1 定义Kubernetes中的版本2.2 创建 Deployment 资源对象2.2.1 在 Yaml 中定义 Deployment 资源对象2.2.2 执行命令创建 Deployment 资源对象 三、…

三、MySQL之创建和管理表

一、基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只 能是一团乱麻,无从下手。 在 MySQL 中, 一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。 …

基于SpringBoot Vue航空机票预订系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

【Linux与windows的文件互相传输】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 关于 rzsz 注意事项 查看软件包 使用命令 下载到本地&#xff08;使用sz的命令&#xff09; 本地文件上传到Linux中&#xff08;使用rz命令&#xff09; 方法一…

无刷电机学习-方波电调 程序篇1(AM32)

一、AM32简介 AM32 固件专为 ARM 处理器设计&#xff0c;用于控制无刷电机 (BLDC)。该固件旨在安全、快速、平滑、快速启动和线性油门。它适用于多种车辆类型和飞行控制器。 AM32具有以下特点&#xff1a; 可通过 betaflight 直通、单线串行或 arduino 升级固件伺服 PWM、Dsh…

Druid集群搭建手册

1. Java环境安装和配置 建议使用JDK1.8。可以参考《Linux安装JDK完整步骤》。 2. 创建用户 创建druid用户&#xff0c;用来管理druid相关的服务。执行命令&#xff1a; useradd druid #创建用户 passwd druid #设置druid用户密码 3. Zookeeper安装和配置 Druid的服务套…

MySQL---多表分组查询综合练习

创建dept表 CREATE TABLE dept ( deptno INT(2) NOT NULL COMMENT 部门编号, dname VARCHAR (15) COMMENT 部门名称, loc VARCHAR (20) COMMENT 地理位置 ); 添加dept表主键 mysql> alter table dept add primary key(deptno); Query OK, 0 rows affected (0.02 s…

【手撕C语言 第六集】函数(上)

文章目录 一、函数是什么&#xff1f;二、C语言中函数的分类&#xff1a;1.库函数1.1 如何学会使用库函数&#xff1f; 2. 自定义函数 三、函数的参数1.实际参数&#xff08;实参&#xff09;&#xff1a;2.形式参数&#xff08;形参&#xff09;&#xff1a; 四、函数的调用&a…

深度学习-循环神经网络-RNN实现股价预测-LSTM自动生成文本

序列模型(Sequence Model) 基于文本内容及其前后信息进行预测 基于目标不同时刻状态进行预测 基于数据历史信息进行预测 序列模型:输入或者输出中包含有序列数据的模型 突出数据的前后序列关系 两大特点: 输入(输出)元素之间是具有顺序关系。不同的顺序,得到的结果应…

10分钟入手一套监控系统

写在前面的话 在这里&#xff0c;我将分享一些观测云的小技巧&#xff0c;让您能更好地注册、接入和利用免费额度。 pv每天是2000的免费额度&#xff0c;这里有个技巧&#xff0c;就是支持配置采样率&#xff0c;以1%的采样率来计算&#xff0c;每天也有20万的额度了就是采样设…

【方法】如何把Excel“只读方式”变成可直接编辑?

Excel在“只读方式”下&#xff0c;编辑后是无法直接保存原文件的&#xff0c;那如何可以直接编辑原文件呢&#xff1f;下面来一起看看看吧。 如果Excel设置的是无密码的“只读方式”&#xff0c;那在打开Excel后&#xff0c;会出现对话框&#xff0c;提示“是否以只读方式打开…

CTF CRYPTO 密码学-5

题目名称&#xff1a;山岚 题目描述&#xff1a; 山岚 f5-lf5aa9gc9{-8648cbfb4f979c-c2a851d6e5-c} 解题过程&#xff1a; Step1&#xff1a;根据题目提示栅栏加密 分析 观察给出的密文发现有f、l、a、g等字符有规律的夹杂的密文中间&#xff0c;看出都是每3个字符的第1…

「我在淘天做技术」智能对话新纪元:百万日活对话机器人的 LLM 落地实践

作者&#xff1a;智能小蜜团队 一、前言 阿里小蜜家族&#xff08;阿里小蜜、店小蜜、万象&#xff09;&#xff0c;从 2015 年发展至今&#xff0c;已经成为了覆盖淘天 P-C&#xff08;平台-消费者&#xff09;、B-C&#xff08;商家-消费者&#xff09;、P-B&#xff08;平台…

浅谈公有云、私有云、混合云

云计算有三种形态&#xff0c;分别是私有云、公有云和混合云。以下是它们各自的简介&#xff1a; 私有云&#xff08;Private Clouds&#xff09;&#xff1a;这种云服务是为一个客户单独使用而构建的&#xff0c;可以提供对数据、安全性和服务质量的最有效控制。公司拥有基础…

随机森林中每个树模型分裂时的特征选取方式

随机森林中每个树模型分裂时的特征选取方式 随机森林中每个树模型的每次分裂都是基于随机选取的特征子集进行分裂的。 具体来说&#xff0c;对于每个决策树&#xff0c;在每个节点的分裂过程中&#xff0c;随机森林算法会从原始特征集合中随机选择一个特征子集&#xff0c;然…