高性能web服务器nginx

目录

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_modulemake

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.rhkb.cn/news/405186.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五、2 移位操作符赋值操作符

1、移位操作符 2、赋值操作符 “ ”赋值&#xff0c;“ ”判断是否相等 1&#xff09;连续赋值 2&#xff09;复合赋值符

C ++初阶:类和对象(上)

目录 &#x1f31e;0.前言 1. 面向过程和面向对象初步认识 2..类的引入与定义 2.1类的引入 2.2类的定义 3.类的访问限定符及其封装 3.1访问限定符 3.2封装 4.类的作用域 4.1加餐和发现 5.类的实例化 6.类对象大小的计算 6.1.内部的存储方式 6.2结构体对齐规则回顾…

一、什么是 mvvm? MVC、MVP、MVVM三种模式的区别与详解

简介 MVC、MVP、MVVM都是常见的软件架构模式。 MVC&#xff08;Model-View-Controller&#xff09;架构模式中&#xff0c;将应用程序分为三个主要部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&…

STM32自制手持小风扇实验

1.1 介绍&#xff1a; 实验功能说明&#xff1a;功能&#xff08;1&#xff09;按一下按键小风扇开启&#xff0c;再按一下关闭。 功能&#xff08;2&#xff09;按一下按键小风扇一档风速&#xff0c;再按一下二挡&#xff0c;依次三挡…关闭。 按键模块说明&#xff1a;按下…

什么是AR、VR、MR、XR?

时代背景 近年来随着计算机图形学、显示技术等的发展&#xff0c;视觉虚拟化技术得到了广泛的发展&#xff0c;并且越来越普及化&#xff0c;慢慢的也走入人们的视野。目前市场上视觉虚拟化技术的主流分为这几种 VR、AR、MR、XR。这几项技术并不是最近才出现的&#xff0c;VR的…

路由器VLAN配置(H3C)

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

执行rasa shell 遇到asyncio.exceptions.TimeoutError报错

在《树莓派3B运行rasa init和rasa shell遇到的tensorflow报错总结》一文中&#xff0c;我遇到的第7个报错是首次运行rasa shell时候碰到的。按照我在文中记录的解决方案&#xff0c;处理成功。 结果&#xff0c;今天我又一次遇到了asyncio - Task exception was never retrie…

91. 解码方法 -dp4

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/decode-ways/description/ 示例 1&#xff1a; 输入&#xff1a;s &…

「字符串」前缀函数|KMP匹配:规范化next数组 / LeetCode 28(C++)

概述 为什么大家总觉得KMP难&#xff1f;难的根本就不是这个算法本身。 在互联网上你可以见到八十种KMP算法的next数组定义和模式串回滚策略&#xff0c;把一切都懂得特别混乱。很多时候初学者的难点根本不在于这个算法本身&#xff0c;而是它令人痛苦的百花齐放的定义。 有…

ee trade:黄金投资与股票投资的区别

黄金和股票&#xff0c; 是金融市场中两种常见的投资工具&#xff0c; 它们拥有截然不同的特点和风险&#xff0c; 了解它们的差异&#xff0c; 可以帮助投资者制定更合理的投资策略。 一、 投资性质&#xff1a; 避险与成长&#xff0c; 两种投资方向 黄金&#xff1a; 被视…

【C++】入门篇一

【C】入门篇一 一 .缺省参数1.缺省参数的概念2. 缺省参数分类 二. 函数重载1. 函数重载概念2.函数重载代码举例 三.引用1.引用的概念2. 引用特性3. 常引用4. 使用场景(1). 做参数(2). 做返回值 5. 传值、传引用效率比较6. 引用和指针的区别7.引用和指针的不同点 一 .缺省参数 …

如何将MySQL迁移到TiDB,完成无缝业务切换?

当 MySQL 数据库的单表数据量达到了亿级&#xff0c;会发生什么&#xff1f; 这个现象表示公司的业务上了一个台阶&#xff0c;随着数据量的增加&#xff0c;公司规模也进一步扩大了&#xff0c;是非常喜人的一个改变 &#xff0c;然而随之而来的其他变化&#xff0c;就没那么…

Python | Leetcode Python题解之第354题俄罗斯套娃信封问题

题目&#xff1a; 题解&#xff1a; class Solution:def maxEnvelopes(self, envelopes: List[List[int]]) -> int:if not envelopes:return 0n len(envelopes)envelopes.sort(keylambda x: (x[0], -x[1]))f [1] * nfor i in range(n):for j in range(i):if envelopes[j]…

全液冷服务器革命:CPU、内存、PCIe高效散热新方案

在国家十四五规划大力发展数字经济的背景下&#xff0c;数据中心作为算力的核心载体&#xff0c;其基础设施成为支撑数字经济的“数字底座”&#xff0c;但同时也面临巨大的碳排放压力。随着芯片与服务器功耗的上升&#xff0c;单机柜功率密度不断增大&#xff0c;传统风冷散热…

深度学习设计模式之享元设计模式

文章目录 前言一、介绍二、特点三、详细介绍1.核心组成2.代码示例3.优缺点优点缺点 4.使用场景 总结 前言 享元设计模式主要用于减少创建对象的数量&#xff0c;以减少内存占用&#xff0c;提高性能。 一、介绍 享元设计模式&#xff08;Flyweight Pattern&#xff09;是一种…

Hexo通过GitHub设置自定义域名

本身GitHub也是支持自定义域名的&#xff0c;本次教程将讲解如何使用GitHub自带的自定义域名解析。 1. GitHub设置 1.1 登录GitHub账号 登录GitHub账号&#xff0c;找到名称为 用户名.github.io的仓库&#xff0c;并点击进入。 1.2 进入Settings页面 点击如图的Settings按…

【体检】程序人生之健康检查,全身体检与预防疫苗,五大传染病普筛,基因检测等

程序员养生指南之 【体检】程序人生之健康检查&#xff0c;全身体检项目分类&#xff0c;五大传染病普筛&#xff0c;基因检测等 文章目录 一、全身体检与预防疫苗&#xff08;年检&#xff09;1、实验室检测&#xff1a;生化全套检查2、医技检查&#xff1a;辅助诊疗科室3、科…

python中使用gurobi遇到强不等式约束(只有大于或者小于而不是大于等于或者小于等于的形式)的解决办法

文章目录 情况分析与解决思路数学模型严格不等式约束转化后的约束形式带入具体的 ϵ \epsilon ϵ 值 python代码总结 情况分析与解决思路 在gurobi求解数学优化问题时&#xff0c;标准的约束形式通常是大于等于&#xff08; >&#xff09;或小于等于&#xff08;<&…

Linux:网络基础概念

网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 局域网 LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 广域网 WAN: 将远隔千里的计算机都连在一起; 所谓 "局域网" 和 "广域网" 只是一个相对的概念. 比如…

如何使用DEV-C++做游戏?

我的B站视频做过关于python的小游戏开发&#xff0c;但很多小伙伴希望通过C做一些有趣的动画或游戏&#xff0c;该怎么实现呢&#xff1f; B站&#xff1a;bigbigli_大李 大家好&#xff0c;我是大李。 今天主要跟大家谈谈如何通过C做一些小游戏开发&#xff0c;这里我们就 使用…