高性能web服务器nginx

news2024/11/30 2:26:30

目录

nginx简介

服务端 I/O 流程

Nginx 进程结构

Nginx启动流程

nginx的源码编译下载

nginx命令常见参数

nginx的配置文件详解

全局配置优化

nginx的平滑升级和回滚

nginx目录匹配优先级测试(因为=只支持访问文件,所有不比对=匹配目录优先级)

nginx中自定义错误页面

nginx中自定义错误日志

nginx中检测文件是否存在

nginx中长连接配置

nginx作为下载服务器配置

nginx高级配置

Nginx 状态页设置

Nginx 压缩功能

nginx的变量

常用内置变量

自定义变量的使用

ngx_http_rewrite_module 模块指令

Nginx Rewrite

全站加密:

nginx动静分离的实现

nginx反向代理的负载均衡

nginx的防盗链

php的动态扩展模块(php的缓存模块)

php高速缓存(使nginx跳过php-fpm,php直接向缓存中的memcached读取数据)


nginx简介

Nginx是一款轻量级和高性能的Web服务器、反向代理服务器、电子邮件代理服务器,是带有BSD-like协议的开源产品。Nginx由俄罗斯程序员伊戈尔·赛索耶夫开发,其第一个公开版本0.1.0发布于2004年10月4日。在技术设计上,Nginx采用事件驱动架构,能够处理大量并发连接,这使得它在面对高流量网站时表现出色。官方测试显示,Nginx能够支撑高达50,000个并发链接,同时CPU和内存消耗非常低,运行非常稳定。Nginx因其高性能、低资源占用和灵活的功能特性,成为全球许多网站首选的Web服务器和反向代理服务器。无论是静态资源服务、动态内容代理、负载均衡还是HTTPS加强,Nginx基本都能胜任。

主要功能:Nginx可以作为静态和动态内容的HTTP服务器。它也可以作为反向代理服务器,将客户端请求转发到后端服务器,并将后端服务器的响应返回给客户端。在现代网站架构中,Nginx经常被用作负载均衡器,通过算法(如轮询、权重、IP哈希等)将客户端请求均匀分配到多个服务器,从而增强系统性能和可靠性。对于动态内容(如PHP脚本),Nginx可以将请求转发到专门的应用程序服务器(例如Apache或PHP-FPM),而由Nginx负责处理静态内容(如图片、CSS、JavaScript文件)

服务端 I/O 流程

服务端I/O流程包括磁盘I/O和网络I/O,主要用于处理数据从内核空间到用户空间的传输。这一过程对于服务器性能和响应速度有重要影响。

基本概念:
I/O即输入输出,指在计算机中进行数据交换的过程。
服务端I/O涉及磁盘I/O和网络I/O,两者在原理上有所不同但互相补充。
磁盘I/O:
进程向内核发起系统调用,请求磁盘上的某个资源,如HTML文件或图片。
内核通过相应的驱动程序将目标文件加载到内核内存空间(缓冲区)。
数据准备完成后,内核将其从缓冲区复制到用户空间的进程内存中。
网络I/O:
网络I/O主要处理网络协议栈与用户空间进程之间的数据传输。
服务器通过网络接口接收到请求数据,经内核预处理后交给应用程序。
 应用程序处理完请求并构建响应,再通过内核空间的网络I/O返回给客户端。
设备控制器:
设备控制器是管理CPU信号传入和传出的系统,它连接外部设备并通过寄存器进行数据存储和管理
设备控制器通常以芯片或印刷电路卡形式插入主板。
内存映射I/O:
内存映射I/O是一种将控制寄存器映射到内存空间的方法,使CPU能够直接访问这些寄存器。
这种方法简化了CPU与设备通信,提高了数据处理效率。
阻塞和非阻塞:
阻塞I/O指在完成操作前,调用者必须等待,无法进行其他操作。
非阻塞I/O允许调用者在等待期间执行其他任务,提高系统整体效率。

Nginx 进程结构

Nginx的进程结构主要包含一个master进程和多个worker进程,以及在某些配置下可能包括cache进程。这种多进程结构设计旨在保证Nginx的高可用性和高可靠性。

Master Process(主进程):负责整个Nginx的启动、加载配置文件、管理worker进程以及处理外部信号。Master进程是所有worker进程的父进程。当系统启动Nginx时,首先运行的是master进程,然后由它根据配置创建相应的worker进程。

主进程 (master process) 的功能:
对外接口:接收外部的操作(信号)
对内转发:根据外部的操作的不同,通过信号管理 Worker
监控:监控 worker 进程的运行状态, worker 进程异常终止后,自动重启 worker 进程
读取 Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭 socket 连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理 perl 脚本

Worker Processes(工作进程):负责处理具体的客户端请求,如页面请求、反向代理等。Worker进程的数量一般设置为与服务器的CPU核数相同,这样可以利用多核CPU的并行处理能力。每个worker进程都是独立运行的,它们之间不共享地址空间,确保了系统的高可靠性。

工作进程( worker process )的功能:
所有 Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker 进程数量:一般设置为核心数,充分利用 CPU 资源,同时避免进程数量过多,导致进程竞争 CPU资源,
增加上下文切换的损耗
接受处理客户的请求
将请求依次送入各个功能模块进行处理
I/O 调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等

Cache Processes(缓存进程):包括cache manager和cache loader进程,主要用于反向代理时的缓存处理。Cache Manager负责管理缓存,而Cache Loader负责加载缓存内容到内存中。

Nginx启动流程

Master进程启动:当Nginx启动时,首先运行Master进程,它会加载配置文件并进行一系列初始化操作。这些操作包括设置进程ID、加载并初始化各模块(如HTTP模块、event模块等),以及设置好用于监听的socket。

Worker进程启动:Master进程根据配置文件中指定的worker_processes数量,fork出多个Worker进程。每个Worker进程都会进行一些自身的初始化操作,比如设置进程优先级、打开文件描述符的数量限制,并将监听的socket设置为可读状态以便接收客户端的连接请求。Worker进程会竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求

nginx的源码编译下载

1.下载好所需的安装包以及创立用户nginx

yum install gcc pcre-devel zlib-devel openssl-devel -y
useradd -s /sbin/nologin -M nginx

2.解压提前上传的nginx包并进入解压后的目录(可以去阿里云镜像站上获取)

3.配置信息并进行编译下载

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

4.配置环境变量

5.修改nginx启动文件并重启服务(vim /lib/systemd/system/nginx.service)

测试(nginx -V 查看版本)

nginx命令常见参数

-v:显示nginx的版本信息。

-t:测试配置文件是否有语法错误。

-T:测试配置文件并打印出配置信息。

-q:在测试配置文件时,不输出非错误信息。

-s signal:向主进程发送信号,如stop、quit、reopen、reload等。

-p prefix:指定nginx的安装目录,默认为/etc/nginx/。

-c filename:指定配置文件路径,默认为/etc/nginx/nginx.conf。

-g directives:设置全局指令,这些指令不在配置文件中

nginx的配置文件详解

# 全局配置端,对全局生效,主要设置 nginx 的启动用户 / 组,启动的工作进程数量,工作模式, Nginx PID 路径,日志路径等。
user nginx nginx;
worker_processes 1; # 启动工作进程数数量
events { #events # 设置快,主要影响 nginx 服务器与用户的网络连接,比如是否允许同时接受多 个网络连接,使用哪种事件驱动模型 # 处理请求,每个工作进程可以同时支持的 最大连接数,是否开启对多工作进程下的网络连接进行序列化等。
worker_connections 1024; # 设置单个 nginx 工作进程可以接受的最大并发,作为 web 服务器的时候最大并发数为 #worker_connections *
worker_processes ,作为反向代理的时候为 #(worker_connections * worker_processes)/2
}
http { #http 块是 Nginx 服务器配置中的重要部分,缓存、代理和日志式定义等绝大多数功能和第三方模块都 # 可以在这设置, http 块可以包含多个server 块,而一个 server 块中又可以包含多个 location 块,
#server 块可以配置文件引入、 MIME-Type 定义、日志自定义、是否启用sendfile 、连接超时时间和 # 单个链接的请求上限等。
include mime.types;
default_type application/octet-stream;
sendfile on; # 作为 web 服务器的时候打开 sendfile 加快静态文件传输,指定是否使用
#sendfile 系统调用来传输文件
#sendfile 系统调用在两个文件描述符之间直接传递数据 ( 完全在内核中操作)
# 从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝,
# 硬盘 >> kernel buffer ( 快速拷贝到 kernelsocket
buffer) >> 协议栈。
keepalive_timeout 65; # 长连接超时时间,单位是秒
server { # 设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多 个location 模块
# 比如本虚拟机监听的端口、本虚拟机的名称和 IP 配置,多个server 可以使用一个端口比如都使用 #80 端口提供 web 服务
listen 80; # 配置 server 监听的端口
server_name localhost; # server 的名称,当访问此名称的时候 nginx 会调用当前 serevr内部的配置进程匹配。
location / { #location 其实是 server 的一个指令,为 nginx 服务器提供比较 多而且灵活的指令
# 都是在 location 中体现的,主要是基于 nginx 接受到的请求字符
# 对用户请求的 UIL 进行匹配,并对特定的指令进行处理
# 包括地址重定向、数据缓存和应答控制等功能都是在这部分实现
# 另外很多第三方模块的配置也是在 location 模块中配置。
root html; # 相当于默认页面的目录名称,默认是安装目录的相对路径,可以使
用绝对路径配置。
index index.html index.htm; # 默认的页面文件名称
}
error_page 500 502 503 504 /50x.html; # 错误页面的文件名称
location = /50x.html { #location 处理对应的不同错误码的页面定
义到 /50x.html
# 这个跟对应其 server 中定义的目录下。
root html; # 定义默认页面所在的目录
}
}

全局配置优化

user nginx;:指定运行Nginx进程的用户为"nginx"

orker_processes auto;:设置工作进程的数量,"auto"表示根据可用CPU核心数自动选择合适数量的工作进程。

worker_cpu_affinity 01 10;:绑定工作进程到特定的CPU核心上。因为我设置的两核所以这里将第一个工作进程绑定到CPU核心0和1,第二个工作进程绑定到CPU核心10。(如果是四核则0001 0010 0100 1000,以此类推)

nginx的平滑升级和回滚

1.解压提前上传的nginx包并进入解压后的目录

2.编译新版本

./configure --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

make

3.查看两个版本并把之前的版本备份,新版的nginx挪过去

4.查看进程,进行平滑升级

#USR2 平滑升级可执行程序 , 将存储有旧版本主进程 PID 的文件重命名为 nginx.pid.oldbin ,并启动新的nginx
5.回收旧版本
平滑升级测试
回滚
1. 重新拉起旧版本的 worker
2.向之前的nginx.24的进程发送HUP(挂起)信号并将新版本nginx.26回收
回滚测试

nginx目录匹配优先级测试(因为=只支持访问文件,所以不比对=匹配目录优先级)

Nginx 账户认证功能

1.创建用户认证表

2.生成默认访问页面

3.修改配置文件启用认证并重启服务

测试

nginx中自定义错误页面

1.在配置文件中编写错误时访问页面

2.向默认错误页面里输入内容

测试

nginx中自定义错误日志

1.在配置文件中定义日志存放目录

2.创建存放目录并重启服务

测试

nginx中检测文件是否存在

try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如

果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一

个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内

部500错误

1.编写配置文件定义检测文件范围

2.编写找不到时默认访问的default文件

重启服务并测试

nginx中长连接配置

keepalive_timeout timeout [header_timeout]; #设定保持连接超时时长,0表示禁止长连接,默认为75s

#通常配置在http字段作为站点全局配置

keepalive_requests 数字; #在一次长连接上所允许请求的资源的最大数量

#默认为100次,建议适当调大,比如:500

例:如图,keepalive_timeout 65 60;此配置会设置超时时间为65s,但是客户端会看到是60s,

keepalive_requests 500;在一次长连接上所允许请求的资源的最大数量为500,超过500自动中断

nginx作为下载服务器配置

1.创建存放下载资源的目录并传输供下载的资源

这个命令将创建一个名为xufile的文件,大小为100MB。它使用/dev/zero作为输入文件,这意味着它将从全零文件中读取数据。然后,它将数据写入到/data/web/download/目录下的xufile文件中,每次读写1MB的数据块

2.编写配置文件

  • root /data/web;:指定该路径下的文件应该从/data/web目录中提供。

  • autoindex on;:启用自动索引功能,当访问/download路径时,会显示目录下的文件列表。

  • autoindex_localtime on;:在文件列表中显示文件的本地时间。

  • autoindex_exact_size off;:禁用显示文件的精确大小,只显示大致的大小。

  • limit_rate 1024K;:限制下载速度为1024KBps(即1MBps)。

这个配置块的作用是设置Nginx服务器如何处理来自客户端的/download路径的请求。具体来说,它会将请求映射到/data/web目录下的文件,并提供一个文件列表供用户浏览和下载。同时,它还限制了下载速度,以防止过大的流量占用过多的带宽

重启服务进行测试

nginx高级配置

Nginx 状态页设置

编辑配置文件,定义状态页

该配置文件定义一个名为域名为status.xujiahao.org的主机。该主机监听80端口,并将根目录设置为/data/web/html,默认首页为index.html。同时,它还定义了一个名为/status的位置块,用于显示服务器的状态信息。在这个位置块中,使用了stub_status指令来提供状态信息,只允许IP地址为172.25.254.1的客户端访问,其他所有客户端都被拒绝访问。

测试

Nginx 压缩功能

在配置文件中启用压缩功能并定义压缩配置

  • gzip on;:启用gzip压缩功能。

  • gzip_comp_level 5;:设置压缩级别为5(范围是1到9,数值越大表示压缩率越高,但CPU消耗也越大)。

  • gzip_min_length 1k;:设置最小压缩文件大小为1KB,小于这个大小的文件不会被压缩。

  • gzip_http_version 1.1;:指定使用HTTP/1.1协议进行压缩。

  • gzip_vary on;:启用Vary头,告诉代理服务器根据不同的请求头来缓存压缩后的文件。

  • gzip_types ...;:指定需要压缩的文件类型,包括文本、JavaScript、CSS、XML、PHP脚本以及图片格式等。

重启服务进行测试

nginx的变量

常用内置变量

$remote_addr;

\#存放了客户端的地址,注意是客户端的公网IP

$args;

\#变量中存放了URL中的所有参数

\#例如:https://search.jd.com/Search?keyword=手机&enc=utf-8

\#返回结果为: keyword=手机&enc=utf-8

$is_args

\#如果有参数为? 否则为空

$document_root;

\#保存了针对当前资源的请求的系统根目录,例如:/webdata/nginx/timinglee.org/lee。

$document_uri;

\#保存了当前请求中不包含参数的URI,注意是不包含请求的指令

\#比如:http://lee.timinglee.org/var?\id=11111会被定义为/var

\#返回结果为:/var

$host;

\#存放了请求的host名称

limit_rate 10240;

echo $limit_rate;

\#如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0

$remote_port;

\#客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口

$remote_user;

\#已经经过Auth Basic Module验证的用户名

$request_body_file;

\#做反向代理时发给后端服务器的本地资源的名称

$request_method;#请求资源的方式,GET/PUT/DELETE等

$request_filename;

\#当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,

\#如:webdata/nginx/timinglee.org/lee/var/index.html

$request_uri;

\#包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,

\#例如:/main/index.do?id=20190221&partner=search

$scheme;

\#请求的协议,例如:http,https,ftp等

$server_protocol;

\#保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等

$server_addr;

\#保存了服务器的IP地址

$server_name;

\#虚拟主机的主机名

$server_port;

\#虚拟主机的端口号

$http_user_agent;

\#客户端浏览器的详细信息

$http_cookie;

\#客户端的所有cookie信息

$cookie_<name>

\#name为任意请求报文首部字部cookie的key名

$http_<name>

\#name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有

横线需要替换为下划线

在配置文件中定义访问页面时输出变量

访问测试

自定义变量的使用

在配置文件中自定义变量并输出

访问测试

ngx_http_rewrite_module 模块指令

if指令

`<!--= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false-->

<!--!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false-->

<!--~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假-->

<!--!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假-->

<!--~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假-->

<!--!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真-->

<!---f 和 !-f #判断请求的文件是否存在和是否不存在-->

<!---d 和 !-d #判断请求的目录是否存在和是否不存在-->

<!---x 和 !-x #判断文件是否可执行和是否不可执行-->

<!---e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)-->

break和return

Nginx Rewrite

编辑配置文件,当访问时临时重定向到www.xujiahao.com

编辑配置文件,当访问时永久重定向到www.xujiahao.com

全站加密:

1.创建存放RSA密钥对和自签名证书的目录,并生成RSA密钥对和自签名证书

2.修改配置文件

配置一个名为www.xujiahao.org的网站。它监听80和443端口,分别用于HTTP和HTTPS连接。网站的文件根目录设置为/data/web/html,首页文件为index.html。同时,配置SSL证书和密钥的路径,以及SSL会话缓存和超时设置。最后,定义了一个location块,用于将所有HTTP请求重定向到HTTPS。

访问时自动转入了https

nginx动静分离的实现

1.编辑配置文件

监听80端口,并将域名www.xujiahao.edu的请求转发到不同的后端服务器。当访问根路径(/)时,请求会被转发到IP地址为172.25.254.30的服务器。当访问包含/static路径的URL时,请求会被转发到IP地址为172.25.254.20,端口为8080的服务器。

2.在172.25.254.10和172.25.254.20上制作界面,并在172.25.254.20上改变监听端口为8080

nginx反向代理的负载均衡

编辑配置文件

该配置定义了一个服务集群webserver其中包含了三个服务器172.25.254.10,172.25.254.20,172.25.254.100,当访问定义的test.xujiahao.test域名时会将请求打向172.25.254.10,172.25.254.20(因为默认的是轮询算法,可以根据具体情况选择其他算法如源地址hash目标地址hash等)。当172.25.254.10和172.25.254.20都不可用时会打向备用的服务器172.25.254.100

测试

nginx的防盗链

1.创建存放测试图片的目录以及在该目录下上传照片

2.编辑配置文件,使可以访问到这张图片

3.制作盗链。另起一台虚拟机如172.25.254.10,修改其默认页面

4.防盗链的制作,编辑配置文件

测试:图片已经不显示,点击跳转直接404

php的动态扩展模块(php的缓存模块)

安装memcache模块

网上下载资源传输过去后进行解压。再利用phpize命令准备PHP扩展的构建环境。然后,运行./configure脚本来检查系统环境和配置编译选项。接下来,使用make命令编译扩展。最后,使用make install命令将编译好的扩展安装到系统的PHP扩展目录中。

复制测试文件到nginx发布目录中并修改管理员用户名和密码

配置php加载memcache模块(vim /usr/local/php/etc/php.ini)

(如果编译的时候没有加上--with-config-file-path=/usr/local/php/etc可能会导致不读配置文件过滤不出来,可以通过cp /usr/local/php/etc/php.ini /usr/local/php/lib/命令解决)

部署**memcached**

在Linux系统中安装并启动memcached服务,然后使用netstat命令检查memcached服务的端口。cat /etc/sysconfig/memcached命令用于查看Memcached的配置文件内容。这个文件包含了Memcached服务的配置选项,如端口号、最大连接数、缓存大小等

测试:通过不断刷新xujiahao.org/example.php查看MEMCACHE INFO (xujiahao.org)变化

通过压力测试进行性能对比:

没有通过memcached进行缓存介入的500次失败了47次

通过memcached进行缓存了的

php高速缓存(使nginx跳过php-fpm,php直接向缓存中的memcached读取数据)

编辑配置文件

在这个配置中,有一个名为memcache的上游服务器组,其中包含一个Memcached服务器(127.0.0.1:11211)。

server块中,监听80端口,并将所有请求代理到名为php.xujiahao.org的域名。根目录设置为/data/web/html,默认索引文件为index.html

location /memc块中,定义了一个内部位置,用于处理与Memcached相关的请求。设置了连接、发送和读取超时时间,并将查询字符串作为键值存储在Memcached中。

location ~ \.php$块中,处理PHP文件的请求。首先尝试从缓存中获取数据,如果缓存中没有数据,则将请求传递给PHP-FPM进行处理。最后,将结果存储回缓存中。

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

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

相关文章

STM32GPIO引脚八种工作模式

1. GPIO简述 GPIO&#xff08;General-purpose input/output&#xff09;&#xff0c;通用型输入输出。简单理解就是我们可以控制输入输出的STM32引脚&#xff0c;统称为GPIO。 GPIO存在的意义就是用程序控制或读取它们的输出或输入。 2. 功能描述 每个GPI/O端口有两个32位配…

代码随想录算法训练营day50:图论01:图论理论基础;深度优先搜索理论基础;98. 所有可达路径;广度优先搜索理论基础

图论理论基础 分类&#xff1a;有向图&#xff0c;无向图&#xff0c;有无权重 度&#xff1a;【无向图】&#xff1a;有几条边连接该节点&#xff0c;该节点就有几度。 【有向图】&#xff1a;每个节点有出度和入度。出度&#xff1a;从该节点出发的边的个数。入度&#xf…

.net maui安卓开发中适用明文传输(一)

背景:最近在做一个pad上的项目,目的是执行每日点检功能(就是检查设备的各项保养指标);前期用HBuilder做了一个,但是现场的触摸屏选用的是TouchPie 安卓版本是6.0版本,上次开发的软件可以在安卓7.0上完美兼容,但由于触摸屏安卓版本太低不能兼容;询问厂商才知道这款触摸…

前端性能优化的指标

性能优化指标的出现,谷歌在2020年提出的Core Web Vitals 和 Web Vitals 了解谷歌浏览器自带的性能调试工具DCL、L、FP、FCP、LCP,图层(有layout布局就是回流,painting绘制就是重绘) 回流和重绘的理解 页面第一次打开一定回流和重绘,回流一定重绘,回流出现一般是位置改变…

BEV世界:通过统一的BEV潜在空间实现自动驾驶的多模态世界模型

BEVWorld: A Multimodal World Model for Autonomous Driving via Unified BEV Latent Space BEV世界&#xff1a;通过统一的BEV潜在空间实现自动驾驶的多模态世界模型 Abstract World models are receiving increasing attention in autonomous driving for their ability t…

【数据结构】PTA 求链表的倒数第m个元素 C语言

请设计时间和空间上都尽可能高效的算法&#xff0c;在不改变链表的前提下&#xff0c;求链式存储的线性表的倒数第m&#xff08;>0&#xff09;个元素。 函数接口定义&#xff1a; ElementType Find( List L, int m ); 其中List结构定义如下&#xff1a; typedef struct…

什么是机器人快换盘?

机器人快换盘&#xff0c;行业内也称作工具快换盘、换枪盘、快换工具盘、快速更换器、快换器、 快换夹具、治具快换等。是末端执行器快速更换装置&#xff08;End-Of-Arm Tooling&#xff0c;简称EOAT&#xff09;&#xff0c;是工业自动化领域中用于机器人手臂上的一种重要设备…

短视频矩阵工具种类繁多,一招教你轻松做选择!

在当下竞争日益激烈的市场中&#xff0c;选择一个稳定且高效的矩阵营销系统对于企业和实体店来说至关重要&#xff0c;然而众多的工具往往让人难以抉择&#xff0c;今天笔者给大家四个关键筛选点&#xff0c;帮你快速筛选出最合适自己的矩阵营销工具&#xff1a; 1. 功能全面性…

探索AI工作流工具:提升编程效率的三大利器

问题&#xff1a;面对屎山代码&#xff0c;你是如何处理的&#xff1f; 今天我将为你推荐三个强大的AI工作流工具&#xff0c;它们将彻底改变你的编程体验&#xff0c;让你在工作中如鱼得水&#xff0c;事半功倍&#xff01; 1. 代码解释器&#xff1a;解读复杂代码的利器 初…

[CISCN 2023 华北]ez_date

[CISCN 2023 华北]ez_date 点开之后是一串php代码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__); class date{public $a;public $b;public $file;public function __wakeup(){if(is_array($this->a)||is_array($this->b)){die(no array);}if( (…

初级python代码编程学习----简单的图形化闹钟小程序

我们来创建一个简单的图形化闹钟程序通常需要使用图形用户界面&#xff08;GUI&#xff09;库。以下是使用Python的Tkinter库创建一个基本闹钟程序的步骤&#xff1a; 环境准备 确保已安装Python。安装Tkinter库&#xff08;Python 3.8及以上版本自带Tkinter&#xff0c;无需…

计算机毕业设计选题推荐-餐馆满意度分析-Python爬虫-K-means算法-nlp情感分析

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

亿玛科技:TiDB 6.1.5 升级到 7.5.1 经验分享

作者&#xff1a; foxchan 原文来源&#xff1a; https://tidb.net/blog/6e628afd 为什么要升级&#xff1f; 本次升级7.5的目的如下&#xff1a; 1、tidb有太多的分区表需要归档整理。7.5版本这个功能GA了。 2、之前集群tikv节点的region迁移过慢&#xff0c;影响tikv节…

http连接未释放导致生产故障

凌晨4点运维老大收到报警&#xff08;公司官网页面超时&#xff0c;上次故障因为运维修改nginx导致官网域名下某些接口不可用后&#xff0c;运维在2台nginx服务器上放了检测程序&#xff0c;检测官网页面&#xff09;&#xff0c;运维自己先看了看服务器相关配置&#xff0c;后…

linux 安装MAT(MemoryAnalyzerTool),并且分析java dump的方法

当我们的java进程出现异常的时候&#xff0c;我们第一件想做的事情是什么呢&#xff1f;应该就是要分析java的内存了。假如说&#xff0c;我们已经有了一个java内存的dump文件&#xff0c;有哪些的方法&#xff0c;可以对这个导出的dump文件进行分析呢&#xff1f; 比如&#…

Vue插值:双大括号标签、v-text、v-html、v-bind 指令

创建应用程序实例后&#xff0c;需要通过插值进行数据绑定。数据绑定是 Vue.js 最核心的一个特性。建立数据绑定后&#xff0c;数据和视图会相互关联&#xff0c;当数据发生变化时&#xff0c;视图会自动进行更新。这样就无须手动获取 DOM 的值&#xff0c;使代码更加简洁&…

【Python_PyQtGraph 学习笔记(十一)】基于ImageExporter更改导出图片的大小

基于ImageExporter更改导出图片的大小 前言正文1、ImageExporter 类介绍1.1 ImageExporter 类特点1.2 ImageExporter 类用法2、示例代码3、遇到的问题前言 在 基于PyQtGraph设置槽函数,实现保存图片到本地的功能 一文中我们成功地将 PyQtGraph 绘制的图形以图片形式保存到本地…

ChatGPT与Discord的完美结合——团队协作的得力助手

本文将教你如何集成Discord Bot&#xff0c;助力团队在工作中实现更高效的沟通与协作。通过充分发挥ChatGPT的潜力&#xff0c;进一步提升工作效率和团队协作能力。无需编写任何代码即可完成本文所述的操作&#xff0c;进行个性化定制只需对参数进行微调即可。 方案介绍 如果在…

【Python系列】中位数计算

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

鸿蒙开发5.0【基于AVCodecKit】音视频解码及二次处理播放

1&#xff1a;场景描述 场景&#xff1a;基于VideoCoder的音视频解码及二次处理播放。 首先导入选择器picker模块&#xff0c;使用PhotoViewPicker方法拉起图库选择视频文件&#xff0c;将视频文件传递到native侧使用Demuxer解封装器进行解封装&#xff0c;再使用OH_VideoDec…