【Nginx】Nginx 安装(平滑升级和回滚)

news2024/11/16 6:58:12

一、 Nginx 概述

Nginx 介绍
Nginx engine X 2002 年开发,分为社区版和商业版 (nginx plus )
2019 3 11 F5 Networks 6.7 亿美元的价格收购
Nginx 是免费的、开源的、高性能的 HTTP 和反向代理服务器、邮件代理服务器、以及 TCP/UDP 代理服务器解决C10K 问题( 10K Connections
Nginx 官网: http://nginx.org
nginx 的其它的二次发行版:
Tengine 由淘宝网发起的 Web 服务器项目。它在 Nginx 的基础上,针对大访问量网站的需求,添加
了很多高级功能和特性。 Tengine 的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了
很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的 Web 平台。从 2011 12 月开始,Tengine成为一个开源项目官网 : http://tengine.taobao.org/
OpenResty :基于 Nginx Lua 语言的高性能 Web 平台, 章亦春团队开发,官网: http://openr
esty.org/cn/
Nginx 功能介绍
  • 静态的web资源服务器html,图片,jscsstxt等静态资源
  • http/https协议的反向代理
  • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  • tcp/udp协议的请求转发(反向代理)
  • imap4/pop3协议的反向代理

基础特性

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmapsendfile
 Web 服务相关的功能
  • 虚拟主机(server
  • 支持 keep-alive 和管道连接(利用一个连接做多次请求)
  • 访问日志(支持基于日志缓冲提高其性能)url rewirte
  • 路径别名
  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无须中断客户的工作进程

Nginx 安装

 Nginx 版本和安装方式
Nginx 版本
Mainline version 主要开发版本 , 一般为奇数版本号 , 比如 1.19
Stable version 当前最新稳定版 , 一般为偶数版本 , :1.20
Legacy versions 旧的稳定版 , 一般为偶数版本 , :1.18
Nginx 安装可以使用 yum 或源码安装,但是推荐使用源码编译安装
yum 的版本比较旧
编译安装可以更方便自定义相关路径
使用源码编译可以自定义相关功能,更方便业务的上的使用
Nginx 编译安装
编译器介绍
源码安装需要提前准备标准的编译器, GCC 的全称是( GNU Compiler collection ),其有 GNU 开发,并以GPL即 LGPL 许可,是自由的类 UNIX 即苹果电脑 Mac OS X 操作系统的标准编译器,因为 GCC 原本只能处理 C 语言,所以原名为GNU C 语言编译器,后来得到快速发展,可以处理 C++,Fortran pascal objective C, java以及 Ada 等其他语言,此外还需要 Automake 工具,以完成自动创建 Makefile 的工作, Nginx 的一些模块需要依赖第三方库,比如: pcre (支持 rewrite ), zlib (支持 gzip 模块)和 openssl (支持 ssl 模块)等。
  编译安装 Nginx

官方源码包下载地址

https://nginx.org/en/download.html
[root@Nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y
[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
[root@Nginx nginx]# tar zxf nginx-1.24.0.tar.gz
[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
[root@Nginx nginx]# cd nginx-1.24.0/
[root@Nginx nginx-1.24.0]# ls
auto CHANGES.ru configure html Makefile objs src
CHANGES conf contrib LICENSE man README
[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \
--user=nginx \ # 指定nginx运行用户
--group=nginx \ # 指定nginx运行组
--with-http_ssl_module \ # 支持https://
--with-http_v2_module \ # 支持http版本2
--with-http_realip_module \ # 支持ip透传
--with-http_stub_status_module \ # 支持状态页面
--with-http_gzip_static_module \ # 支持压缩
--with-pcre \ # 支持正则
--with-stream \ # 支持tcp反向代理
--with-stream_ssl_module \ # 支持tcp的ssl加密
--with-stream_realip_module # 支持tcp的透传ip
[root@Nginx nginx-1.24.0]# make && make install
下载1.24版本的

下载c语言的编译器:

下载负载的软件包:
最后效果:makefile配置文件(make规则)

 将make文件与c语言合成,最后生成nginx文件

下载文件到/usr/local/ngnix/sbin
查看内存:
删除nginx
关闭debug功能
下载最小内存的nginx:
编辑
访问:
升级稳定版本1.26:
有时候我们需要对 Nginx 版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级
  • 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
  • master进程发送USR2信号
  • master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
  • master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx
  • 进程共同提供Web服务,当前新的请求仍然由旧Nginxworker进程进行处理,将新生成的master
  • 程的PID存放至新生成的pid文件nginx.pid
  • 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
  • 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
  • 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT

更改nginx名字变量:

平滑升级和回滚
准备环境:
重新make install进行下载
[root@node1 nginx-1.24.0]# cd /usr/local/nginx/
[root@node1 nginx]# ls
conf  html  logs  sbin
[root@node1 nginx]# cd sbin/
[root@node1 sbin]# ls
nginx
[root@node1 sbin]# nginx 
[root@node1 sbin]# curl -I 172.25.254.100
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Sat, 17 Aug 2024 12:25:34 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 17 Aug 2024 12:24:43 GMT
Connection: keep-alive
ETag: "66c0968b-267"
Accept-Ranges: bytes

[root@node1 sbin]# cp nginx nginx.old
[root@node1 sbin]# ls
nginx  nginx.old
[root@node1 sbin]# \cp -f /root/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin/
[root@node1 sbin]# date
Sat Aug 17 08:29:10 PM CST 2024
[root@node1 sbin]# date
Sat Aug 17 08:29:13 PM CST 2024
[root@node1 sbin]# ll
total 7216
-rwxr-xr-x 1 root root 6150176 Aug 17 20:29 nginx
-rwxr-xr-x 1 root root 1235800 Aug 17 20:26 nginx.old
[root@node1 sbin]# ps aux | grep nginx
root       19471  0.0  0.0   9860   928 ?        Ss   20:25   0:00 nginx: master process nginx
nginx      19472  0.0  0.1  13756  5472 ?        S    20:25   0:00 nginx: worker process
root       19531  0.0  0.0 221664  2356 pts/1    S+   20:30   0:00 grep --color=autonginx
[root@node1 sbin]# pidof nginx
19472 19471
[root@node1 sbin]# kill -USR2 19471
[root@node1 sbin]# ps aux | grep nginx
root       19471  0.0  0.0   9860  2552 ?        Ss   20:25   0:00 nginx: master process nginx
nginx      19472  0.0  0.1  13756  5472 ?        S    20:25   0:00 nginx: worker process
root       19537  0.0  0.1   9760  5964 ?        S    20:31   0:00 nginx: master process nginx
nginx      19538  0.0  0.1  13788  4924 ?        S    20:31   0:00 nginx: worker process
root       19540  0.0  0.0 221664  2372 pts/1    S+   20:31   0:00 grep --color=autonginx
[root@node1 sbin]# kill -WINCH 19471
[root@node1 sbin]# ps aux | grep nginx
root       19471  0.0  0.0   9860  2552 ?        Ss   20:25   0:00 nginx: master process nginx
root       19537  0.0  0.1   9760  5964 ?        S    20:31   0:00 nginx: master process nginx
nginx      19538  0.0  0.1  13788  4924 ?        S    20:31   0:00 nginx: worker process
root       19542  0.0  0.0 221664  2372 pts/1    S+   20:33   0:00 grep --color=autonginx
[root@node1 sbin]# curl -I 172.25.254.100
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Sat, 17 Aug 2024 12:34:27 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 17 Aug 2024 12:24:43 GMT
Connection: keep-alive
ETag: "66c0968b-267"
Accept-Ranges: bytes

[root@node1 sbin]# kill -HUP 19471
[root@node1 sbin]# curl -I 172.25.254.100
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Sat, 17 Aug 2024 12:35:15 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 17 Aug 2024 12:24:43 GMT
Connection: keep-alive
ETag: "66c0968b-267"
Accept-Ranges: bytes

[root@node1 sbin]# ps aux | grep nginx
root       19471  0.0  0.0   9860  2552 ?        Ss   20:25   0:00 nginx: master process nginx
root       19537  0.0  0.1   9760  5964 ?        S    20:31   0:00 nginx: master process nginx
nginx      19538  0.0  0.1  13788  4924 ?        S    20:31   0:00 nginx: worker process
nginx      19544  0.0  0.1  13756  4872 ?        S    20:35   0:00 nginx: worker process
root       19547  0.0  0.0 221664  2372 pts/1    S+   20:35   0:00 grep --color=autonginx
[root@node1 sbin]# kill -WINCH 19544
[root@node1 sbin]# ps aux | grep nginx
root       19471  0.0  0.0   9860  2552 ?        Ss   20:25   0:00 nginx: master process nginx
root       19537  0.0  0.1   9760  5964 ?        S    20:31   0:00 nginx: master process nginx
nginx      19538  0.0  0.1  13788  4924 ?        S    20:31   0:00 nginx: worker process
nginx      19549  0.0  0.1  13756  4872 ?        S    20:36   0:00 nginx: worker process
root       19551  0.0  0.0 221664  2372 pts/1    S+   20:36   0:00 grep --color=autonginx
[root@node1 sbin]# curl -I 172.25.254.100
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Sat, 17 Aug 2024 12:36:29 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 17 Aug 2024 12:24:43 GMT
Connection: keep-alive
ETag: "66c0968b-267"
Accept-Ranges: bytes

[root@node1 sbin]# 
[root@node1 sbin]# 
[root@node1 sbin]# kill -WINCH 19537
[root@node1 sbin]# curl -I 172.25.254.100
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Sat, 17 Aug 2024 12:37:19 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 17 Aug 2024 12:24:43 GMT
Connection: keep-alive
ETag: "66c0968b-267"
Accept-Ranges: bytes

[root@node1 sbin]# ps aux | grep nginx
root       19471  0.0  0.0   9860  2552 ?        Ss   20:25   0:00 nginx: master process nginx
root       19537  0.0  0.1   9760  6524 ?        S    20:31   0:00 nginx: master process nginx
nginx      19549  0.0  0.1  13756  5472 ?        S    20:36   0:00 nginx: worker process
root       19556  0.0  0.0 221664  2376 pts/1    S+   20:37   0:00 grep --color=autonginx
[root@node1 sbin]# LS
bash: LS: command not found...
Similar command is: 'ls'
[root@node1 sbin]# ls
nginx  nginx.old
[root@node1 sbin]# cp nginx nginx.new
[root@node1 sbin]# \cp -f nginx.old nginx
[root@node1 sbin]# ls
nginx  nginx.new  nginx.old
[root@node1 sbin]# ps aux | grep nginx
root       19471  0.0  0.0   9860  2552 ?        Ss   20:25   0:00 nginx: master process nginx
root       19537  0.0  0.1   9760  6524 ?        S    20:31   0:00 nginx: master process nginx
nginx      19549  0.0  0.1  13756  5472 ?        S    20:36   0:00 nginx: worker process
root       19579  0.0  0.0 221664  2360 pts/1    S+   20:39   0:00 grep --color=autonginx
[root@node1 sbin]# kill -9 19537
[root@node1 sbin]# ps aux | grep nginx
root       19471  0.0  0.0   9860  2552 ?        Ss   20:25   0:00 nginx: master process nginx
nginx      19549  0.0  0.1  13756  5472 ?        S    20:36   0:00 nginx: worker process
root       19581  0.0  0.0 221664  2372 pts/1    S+   20:40   0:00 grep --color=autonginx
[root@node1 sbin]# 
复制1.24的版本作为备份
查看进程
查看两个进程的状态
回收旧版本:

 回滚老版本:

 最后回归新版本:

[root@Nginx nginx]# tar zxf nginx-1.26.1.tar.gz
[root@Nginx nginx]# cd nginx-1.26.1/
#开始编译新版本
[root@Nginx nginx-1.26.1]# ./configure --with-http_ssl_module --withhttp_v2_module --with-http_realip_module --with-http_stub_status_module --withhttp_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --
with-stream_realip_module
#只要make无需要make install
[root@Nginx nginx-1.26.1]# make
#查看两个版本
[root@Nginx nginx-1.26.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 root root 1239416 Jul 18 15:08 objs/nginx
-rwxr-xr-x 1 root root 5671488 Jul 18 11:41 /usr/local/nginx/sbin/nginx
#把之前的旧版的nginx命令备份
[root@Nginx ~]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# cp nginx nginx.24
#把新版本的nginx命令复制过去
[root@Nginx sbin]# \cp -f /root/nginx/nginx-1.26.1/objs/nginx
/usr/local/nginx/sbin
#检测一下有没有问题
[root@Nginx sbin]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@Nginx sbin]# kill -USR2 48732 #nginx worker ID
#USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的
nginx
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进
程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
[root@Nginx sbin]# ps aux | grep nginx
root 48732 0.0 0.1 9868 2436 ? Ss 14:17 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
nobody 48733 0.0 0.2 14200 4868 ? S 14:17 0:00 nginx: worker
process
root 52075 0.0 0.3 9876 6528 ? S 15:41 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
nobody 52076 0.0 0.2 14208 4868 ? S 15:41 0:00 nginx: worker
process
[root@Nginx sbin]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.24.0 ##依旧是旧版本生生效
Date: Thu, 18 Jul 2024 07:45:58 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 18 Jul 2024 03:41:13 GMT
Connection: keep-alive
ETag: "66988ed9-267"
Accept-Ranges: bytes
#回收旧版本
[root@Nginx sbin]# kill -WINCH 48732
[root@Nginx sbin]# ps aux | grep nginx
root 48732 0.0 0.1 9868 2436 ? Ss 14:17 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
root 52075 0.0 0.3 9876 6528 ? S 15:41 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
nobody 52076 0.0 0.2 14208 4868 ? S 15:41 0:00 nginx: worker
process
#检测版本信息
[root@Nginx sbin]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.26.1 #新版本生效
Date: Thu, 18 Jul 2024 07:59:45 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 18 Jul 2024 03:41:13 GMT
Connection: keep-alive
ETag: "66988ed9-267"
Accept-Ranges: bytes
#回滚
#如果升级的版本发现问题需要回滚,可以重新拉起旧版本的worker
[root@Nginx sbin]# cp nginx nginx.26
[root@Nginx sbin]# ls
nginx nginx.24 nginx.26
[root@Nginx sbin]# mv nginx.24 nginx
mv: overwrite 'nginx'? y
[root@Nginx sbin]# kill -HUP 48732
[root@Nginx sbin]# ps aux | grep nginx
root 48732 0.0 0.1 9868 2436 ? Ss 14:17 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
root 52075 0.0 0.3 9876 6528 ? S 15:41 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
nobody 52076 0.0 0.2 14208 5124 ? S 15:41 0:00 nginx: worker
process
nobody 52130 0.0 0.2 14200 4868 ? S 16:30 0:00 nginx: worker
process
[root@Nginx sbin]# kill -WINCH 52075
[root@Nginx sbin]# ps aux | grep nginx
root 48732 0.0 0.1 9868 2436 ? Ss 14:17 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
root 52075 0.0 0.3 9876 6528 ? S 15:41 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
nobody 52130 0.0 0.2 14200 4868 ? S 16:30 0:00 nginx: worker
process
root 52137 0.0 0.1 221664 2176 pts/0 S+ 16:31 0:00 grep --
color=auto nginx
[root@Nginx sbin]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.24.0 ##版本回滚完成
Date: Thu, 18 Jul 2024 08:31:51 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 18 Jul 2024 03:41:13 GMT
Connection: keep-alive
ETag: "66988ed9-267"
Accept-Ranges: bytes

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

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

相关文章

路由器VLAN配置(H3C)

路由器VLAN配置(H3C) 控制页面访问 路由器默认处于192.168.1.1网段(可以短按reset重置),如果要直接使用需要设置静态IP处于同一网段; 对路由器进行配置也要将电脑IP手动设置为同一网段; 默…

音频剪辑软件哪个好用?五大音频剪辑软件分享

如果你正打算在家自学视频制作,那么恭喜你,你已经踏上了一段充满魔法与惊喜的旅程!不过,别忘了,视频的灵魂不仅仅在于画面,更在于那直击心灵的音效。 想象一下,一个精心剪辑的片段,…

如何拯救非正常专利申请?

在无忧专利微信公众号2023年年初的一篇文章中提到,出于提质增效的考虑,专利局加大了对非正常申请的打击力度。 专利局打击非正常申请的方式包括:建立黑名单、启用新的业务办理系统、使用大数据识别技术、惩罚非正常申请和非正常代理行为。 …

Vehicle Perception from Satellite(2024 TPAMI 卫星视频车流量监控)

Vehicle Perception from Satellite(2024 TPAMI 卫星视频车流量监控) 前言1.1 动机1.2 概述1.3 贡献 2 相关工作2.1 遥感中的目标检测2.2 计算机视觉中的相关任务2.3 卫星交通监控 3 TMS 数据集3.1 数据收集与预处理3.2 数据统计3.3 应用任务 4 实验4.1 …

C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧

文章目录 &#x1f4dd;基本框架&#x1f320; 构造和销毁&#x1f309;vector()&#x1f309;vector(const vector& v)&#x1f309;vector(size_t n, const T& value T())&#x1f309;赋值拷贝构造&#xff1a;vector<T>& operator(vector<T> v)&a…

XSS的DOM破坏

目录 1、DOM破坏案例解释 1.1先写一个demo.html文件 1.2、执行demo&#xff0c;看到是否将全部移除%20scr1%20οnerrοralert(1)> 分析&#xff1a; 解决&#xff1a;把两个for不在同一个数组进行操作 1.3、接下来我们要想办法让第二个for循环不能删除&#xff0c;留下…

android FD_SET_chk问题定位

android FD_SET_chk问题定位 一、FD报错二、问题定位2.1 APM定位2.2 adb定位2.3. 代码获取FD数 三、FD优化 一、FD报错 App在运行中记录报错如下&#xff0c;FD_SET&#xff0c;这个问题大概是文件描述符&#xff08;File Descriptor&#xff0c;简称FD&#xff09;超过了最大…

首款会员制区块链 Geist 介绍

今天&#xff0c;Pixelcraft Studios 很高兴地宣布即将推出 Geist&#xff0c;这是一个由 Base、Arbitrum、Alchemy 以及 Aavegotchi 支持的全新 L3。 Geist 之前的代号为 “Gotchichain”&#xff0c;是首个专为游戏打造的会员专用区块链。 为什么选择 Geist&#xff1f; …

Spring DI 简单演示三层架构——Setter 注入

Spring IOC 的常见注入方法有3种&#xff1a;Setter注入、构造注入和属性注入。想了解更多可点击链接&#xff1a;Spring 注入、注解以及相关内容补充 属性注入 不推荐。原因&#xff1a;使用私有的成员属性变量&#xff0c;依靠反射实现&#xff0c;破坏封装&#xff0c;只能依…

~Keepalived高可用集群~

一、Keepalived简介 是一个用于实现高可用性的解决方案&#xff0c;它主要应用于云主机的主备切换&#xff0c;以达到高可用性&#xff08;HA&#xff09;的目的。当主服务器发生故障无法对外提供服务时&#xff0c;动态将虚拟IP切换到备服务器&#xff0c;继续对外提供服务&a…

DOM破坏

XSS Game 1、第一关 Ma Spaghet! <!-- Challenge --> <h2 id"spaghet"></h2> <script>spaghet.innerHTML (new URL(location).searchParams.get(somebody) || "Somebody") " Toucha Ma Spaghet!" </script> S…

【ubuntu24.04】wget配置代理加速下载

参考之前的wget代理配置 wget速度非常慢 配置控制台代理不行 配置wget代理 本机部署了代理程序:all_proxy 不识别:root@PerfSvr:~# cat set65proxy.sh #!/bin/sh export

[STM32F429_硬件知识01]

知识点1 &#xff1a;J-Link的使用步骤&#xff1a; step1 : 安装J-Link驱动程序 step2 : keil的魔术棒中 -> Debug -> Use中选择J_Link ->点击 Settings ->

AI 时代风暴:程序员的核心竞争力大揭秘

引言&#xff1a; 在当今科技浪潮以排山倒海之势汹涌澎湃之际&#xff0c;人工智能宛如璀璨星辰般不断涌现&#xff0c;AIGC&#xff08;如 chatgpt、midjourney、claude 等&#xff09;大语言模型如雨后春笋般破土而出&#xff0c;AI 辅助编程工具更是以风驰电掣之速迅速席卷编…

智能电销机器人提升工作效率

随着科技的不断发展&#xff0c;电销行业也在不断探索创新&#xff0c;其中电销机器人作为一种高效的工具&#xff0c;正逐渐成为企业提升工作效率的利器。让我们一起看看电销机器人如何助力企业提高效率&#xff1a; 1. 自动化拨打电话 电销机器人每天可以自动拨打大量电话&a…

element-plus表格组件el-table 的使用

表格是在前端页面中是经常被用到的&#xff0c;尤其是管理系统&#xff0c;几乎每个页面都会存在表格&#xff0c;所以掌握表格组件是非常有必要的。element-plus提供el-table&#xff0c;el-table-column来渲染表格&#xff0c; 1. el-table 组件主要属性 属性名作用值类型…

【C语言小项目】五子棋游戏

目录 前言 一、游戏规则 1.功能分析 2.玩法分析 3.胜负判定条件 二、游戏实现思路 三、代码实现与函数封装 1.项目文件创建 2.头文件说明 3.函数封装 1&#xff09;菜单实现 2&#xff09;进度条实现 3&#xff09;main函数实现 4&#xff09;Game函数 5&#xff0…

Java语言程序设计——篇十三(4)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

下载中心: 使用异步方法生成文件任务+键集分页查询

文章目录 引言I 下载中心功能进度表设计异步处理文件生成案例II 键集分页查询提高查询效率解决分页查询出现数据重复或丢失案例III 工具线程池基于EasyExcel 生成 excel文件存储系统see also引言 需求: 根据查询条件导出数据,比如交易流水、设备安装资料。 流程设计:点击导…

牛客面经学习笔记(二)

锂离子电池的充电过程可以分为四个阶段&#xff1a;涓流充电&#xff08;低压预充&#xff09;、恒流充电、恒压充电以及充电终止。 阶段1&#xff1a;涓流充电——涓流充电用来先对完全放电的电池单元进行预充(恢复性充电)。在电池电压低于3V左右时采用涓流充电&#xff0c;涓…