nginx 正反向代理和nginx正则
目录
一. 正向代理
1. 编译安装Nginx
2. 配置正向代理
二. 反向代理
1. 配置nginx七层代理
2. 配置nginx四层代理
三. Nginx 缓存
1. 缓存功能的核心原理和缓存类型
2. 代理缓存功能设置
四. Nginx rewrite和正则
1. Nginx正则
2. nginx location
3. Rewrite
4. nginx中的set指令
Nginx作为一款高性能的开源Web服务器和反向代理工具,凭借其轻量级、高并发处理能力和灵活的模块化设计,已成为现代Web架构的基石。从全球顶尖网站到微服务架构,Nginx在负载均衡、缓存加速、安全防护等场景中扮演着关键角色。
Nginx的四大核心功能--反向代理(七层/四层)、正向代理、缓存机制和正则表达式匹配,通过理论解析与场景化案例,掌握其设计思想与实践技巧,为构建高效、稳定的Web服务奠定坚实基础。
一. 正向代理
正向代理(Forward Proxy)是一种位于客户端和原始服务器之间的代理服务器,其主要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端Nginx的正向代理 充当客户端的“中间人”’,代表用户访问外部资源并隐藏真实 IP。它是企业内网管控、安全审计与加速访问的核心工具。用于场景一般是:
- 内网访问控制:限制员工访问特定网站(如社交媒体)
- 匿名访问:通过代理服务器隐藏用户真实身份
- 资源缓存加速:缓存公共资源(如软件包、镜像文件),减少外网带宽消耗
1. 编译安装Nginx
(1) 安装支持软件
Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成
(2) 创建运行用户、组和日志目录
Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险。
(3) 编译安装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
- --add-module=./ngx_http_proxy_connect_module 支持https转发(默认nginx不支持https转发,需要添加第三方模块)
为了使 Nginx 服务器的运行更加方便,可以为主程序 nginx 创建链接文件,以便管理员直接执行“nginx”命令就可以调用 Nginx 的主程序。
(4) 添加Nginx系统服务
为了使用Nginx服务的启动、停止、重载等操作更加方便,可以编写Nginx服务脚本,并使用chkconfig和systemctl工具来进行管理
参考上上一章的web技术与Nginx网站服务
root@localhost # vim /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target[Service]
Type-forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx-s reload
ExecStop=/bin/kill -s QUIT SMAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root[Install]
WantedBy=multi-user.target
[root@localhost ~l# systemctl daemon-reload
[root@localhost ~]# systemctl start nginx
2. 配置正向代理
- listen 8080; 代理监听端口
- resolver 8.8.8.8 1.1.1.1; 解析域名使用的DNS 多个DNS用空格分隔
启用代理CONNECT方法(支持HTTPS)
- proxy connect;
- proxy_connect_allow 443 80; #允许代理到80和443端口
- proxy_connect_connect_timeout 10s;
- proxy_connect_read_timeout 10s;
- proxy_connect_send_timeout 10s;
处理HTTP/HTTPS请求
- location/ {
- proxy_pass $scheme://$http host$request uri; 动态协议
- proxy_set_header Host $http host;
优化缓冲区
- proxy_buffers 256 4k;
- proxy_max_temp_file_size 0;
保持连接
- proxy_http_version 1.1 设置http版本为1.1
- proxy_set_header Connection ""; 设置头部信息的连接数据为空
(2) 验证正向代理
linux验证
Windows验证
使用浏览器,设置http和https代理ip为192.168.10.101 端口为8080
通过实时查看nginx的访问日志,可以看到Windows下设置代理的ip和端口后,本地电脑访问的所有网页会通过代理服务器可进行访问网页,实现了正向代理的功能,并且隐藏了用户自己的真实ip
二. 反向代理
Nginx的七层(应用层)反向代理基于 HTTP/HTTPS 协议,深度解析应用层内容(如 URL、Header、Cookie),将客户端请求精准转发至后端服务器。作为企业级架构的“智能调度器”,它实现了负载均衡、安全隔离与性能优化的核心能力
一般应用场景
- 负载均衡:将流量分发至多台后端服务器,避免单点故障。
- 动静分离:静态资源(图片、CSS/JS)由 Nginx 直接响应,动态请求(PHP、API)转发至Apache/Tomcat.
- SSL 终端:统一处理 HTTPS 加密/解密,降低后端服务器计算压力。
- 灰度发布:根据请求特征(如IP、Header)将部分流量导向新版本服务
Nginx 的四层(网络层)反向代理基于 TCP/UDP 协议,直接转发原始数据流,不解析应用层内容。它专为高性能、低延迟的传输层场景设计,是数据库、游戏服务器等非 HTTP 服务的理想选择。
一般应用场景
- 数据库代理:对外暴露统一端口,内部转发至 MySQL、Redis 集群。
- 游戏服务器:代理 UDP 协议,实现实时数据包负载均衡,
- SSH 跳板机:通过端口映射安全访问内网服务器
- 高可用服务:TCP服务(如 MQTT)的主备切换与健康检查。
反向代理,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,只知道去访问代理服务器,代理服务器再通过反向代理 +负载均衡实现请求分发到应用服务器的一
种代理服务。反向代理服务的特点是代理服务器 代理的对象是应用服务器,也就是对于浏览器/客户端 来说应用服务器是隐藏的。
资源清单
实验需要两台主机
操作系统 | 配置 | ip | 服务 |
OpenEuler | 4G | 192.168.10.101 | Nginx |
OpenEuler | 4G | 192.168.10.102 | Httpd |
1. 配置nginx七层代理
通过配置nginx七层代理实现转发nginx请求至后端的httpd服务,通过该转发也能实现nginx+httpd的动静分离
(1) 环境安装
192.168.10.102操作
[root@localhost~]#systemctl stop firewalld
[root@localhost~]#dnf -y install httpd
[root@localhost~]#echo "这是后端主机" > /var/www/html/index.html
[root@localhost ]#systemctl start httpd
(2) 配置nginx七层代理转发
192.168.10.101上操作:
[root@localhost~]# vim /usr/local/nginx/conf/nginx.conf
http {upstream backend { #后端地址池设置server 192.168.10.102:80; #后端主机设置}server {listen 80;server_name example.com;location /{proxy_pass http://backend; #请求转发proxy set header Host $host;proxy set header X-Real-IP $remote_addr;}}
}
[root@localhost~]# nginx-t
[root@localhost~]# nginx-s reload
上述配置中,使用upstream定义后端应用服务器的地址池“backend”,在location块中,使用proxy_pass,转发请求至后端地址池,proxy_set_header Host $host:将请求中的Host头部设置为客户端请求的主机名,proxy_set_header X-Real-IP $remote_addr:将请求中的、X-Real-TP 头部设置为客户端的真实 IP 地址
(3) 验证转发效果
[root@localhost # curl 192.168.10.101 #这是后端主机
后端地址池中也可以定义多台主机,实现负载均衡
2. 配置nginx四层代理
SSH协议是基于TCP协议的,配置nginx的四层代理,实现代理ssh请求至后端服务器,用以登录内网服务器场景
(1) 配置四层代理
192.168.10.101上操作:
[root@localhost ~l#vi /usr/local/nginx/conf/nginx.conf
stream {upstream ssh cluster { #定义后端地址池server 192.168.10.102:22; #设置后端地址和服务端口
}server {listen 2222;proxy_pass ssh_cluster;proxy_connect_timeout 5s; #连接超时时间proxy_timeout lh; #长连接保持时间}
}
注意:
stream需要与http{ }模块平级,不能在http{}中嵌套
[root@localhost~]#nginx-t
[root@localhost~]#nginx-s reload
[root@localhost~]#ss -nlpt | grep 2222
(2) 验证四层代理
[root@localhost ~]# ssh root@192.168.10.101 -p2222
[root@localhost ~]#ifconfig
通过上面的验证发现,通过202的2222端口登录后,实际上是登录到102服务器
三. Nginx 缓存
Nginx 的缓存功能是其核心能力之一,主要用于加速内容响应和降低后端服务器负载。它的缓存功能主要基于反向代理(Proxy Cache),但也可用于其他场景(如 FastCGI 缓存)
1. 缓存功能的核心原理和缓存类型
缓存类型 | 作用场景 |
代理缓存 | 反向代理模式下缓存后端服务器(如 Tomcat、Apache)的响应内容 |
FastCGI 缓存 | 缓存 PHP/Python 等通过 FastCGI 协议处理的动态内容(需配合 PHP-FPM使用) |
uWSGI/SCGI 缓存 | 类似 FastCGl,用于其他后端协议 |
静态资源缓存 | 通过:expires 指令设置客户端浏览器缓存(非服务端缓存 |
代理缓存原理:
- 第一步:客户端第一次向Nginx请求数据A;
- 第二步:当Nginx发现缓存中没有数据A时,会向服务端请求数据A;
- 第三步:服务端接收到Nginx发来的请求,则返回数据A到Nginx,并且缓存在Nginx;
- 第四步:Nginx返回数据A给客户端应用;
- 第五步:客户端第二次向Nginx请求数据A;
- 第六步:当Nginx发现缓存中存在数据A时,则不会请求服务端:第七步:Nginx把缓存中的数据A返回给客户端应用。
2. 代理缓存功能设置
因代理缓存功能需在反向代理模式下缓存后端服务器(如 Tomcat、Apache)的响应内容需要先配置七层反向代理
(1) 反向代理配置
[root@localhost]#/usr/local/nginx/conf/nginx.conf
http {upstream backend { #后端地址池设置server 192.168.10.102:80; #后端主机设置}server {listen 80;server_name example.com;location /{proxy_pass http://backend; #请求转发proxy_set_header Host $host;proxy_set_header X-Real-Ip $remote_addr ;}}
}
[root@localhost~]#nginx -t
[root@localhost#nginx-s reload
(2) 设置缓存功能
[root@localhost ~]#mkdir -p /data/nginx/cache
[root@localhost ~]#chown nginx:nginx /data/nginx/cache -R
[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
http {#定义缓存路径和参数proxy_cache_path /data/nginx/cache levels=l:2 keys_zone=my_cache:10minactive=60m max_size=lg use_temp_path=off;server {listen 80;server_name example.com;location/proxy_pass http://backend;#启用缓存区proxy_cache my_cache;# 定义缓存键(URL + 请求方法 +协议)proxy_cache_key "$scheme$request method$host$request uri"#缓存有效期(不同状态码不同时间)proxy_cache_valid 200 302 10m; # 200/302 状态码缓存10分钟proxy_cache_valid 404 1m; #404 缓存1分钟lmproxy_cache_valid any 5s; #其他状态码缓存5秒#添加缓存状态头(调试用)add_header X-Cache-Status $upstream_cache_status; }}
}
关键配置解析:
- proxy_cache_path:定义缓存文件的存储路径
- levels=1:2 :定义缓存目录的层级结构,levels=N:M,表示缓存文件路径的层级深度,
- keys_zone=my_cache:10m :定义共享内存区域,用于存储缓存键(key)和元数据(如过期时间),10m:共享内存区大小(通常每1MB可存储约8000个键)
- inactive=60m :定义缓存内容的闲置有效期。60分钟 内未被访问,将被自动删除
- max_size=1g:定义缓存目录的最大磁盘空间。当缓存量达到1GB时,Nginx 启动 LRU(最近最少使用)算法清理旧缓存。
- use_temp_path=off :控制临时文件的存储位置,推荐值:off(减少磁盘操作,提升性能)
(3) 验证缓存功能
[root@localhost ~]# curl -I 192.168.10.101
X-Cache-Status:MISS 表示MISS没有命中缓存
X-Cache-Status:HIT 再次请求发现已经命中,说明数据已经被缓存
[root@localhost~]#ls /data/nginx/cache
查看缓存目录发现已缓存数据
四. Nginx rewrite和正则
Rewrite模块作为Nginx的“规则引擎”,扮演着至关重要的角色--它赋予开发者精准控制URL的能力,让请求的流转不再受限于物理路径,而是通过逻辑规则灵活适配业务需求。
Rewrite的应用场景
- 路径美化:将/product/123转换为/index.php?id=123
- 旧链接迁移:将过期URL永久重定向(301)到新地址
- 强制HTTPS/域名统一:自动跳转http://到https://,或合并www与非www域名
- 动态路由:适配单页应用(SPA)、RESTfu1API路由
- 灰度发布:按规则将部分流量导向新版本服务
1. Nginx正则
常用的正则表达式元字符
字符 | 描述 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次。如“o!*“能匹配“o”及“o!”、"ol!” |
+ | 匹配前面的字符一次或多次。如"ol+"能匹配"o1"及"ol”、“o”",但不能匹配"o” |
? | 匹配前面的字符零次或一次,例如“do(es)?"能匹配“do"或者“does","?"等效于”{0,1}” |
. | 匹配除“""之外的任何单个字符,若要匹配包括“n"在内的任意字符,请使用诸如“[\n]”之类的模式 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n"匹配一个换行符,而“S”则匹配“S” |
\d | 匹配纯数字 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
[c] | 匹配单个字符c |
[a-z] | 匹配 a-z 小写字母的任意一个 |
[a-zA-Z] | 匹配 a-z 小写字母或 A-Z 大写字母的任意一个 |
2. nginx location
在学习rewrite前还要了解下location,因为rewrite 通常会与 location 结合使用,但并非绝对。二者的协作能实现更精细的路径控制,location是Nginx中用于匹配请求URI(路径:只能对域名后边的除去传递的参数外的字符串起作用,例如http://www.kgc.com/index.php?id=1 只匹配/index.php)的核心指令,用于根据请求路径定义不同的处理逻辑(如静态资源服务、反向代理、重定向等)
(1) location 的语法:
location[匹配模式] {#处理逻辑(如 root,proxy_pass,rewrite等)
}
匹配模式类型:
模式 | 说明 |
location /uri普通前缀匹配 | 匹配以指定路径开头的 URI |
location =/ 精确匹配 | 仅匹配完全相同的 URI(优先级最高) |
location ~ 正则匹配 | 区分大小写的正则表达式匹配 |
location ~* 正则匹配 | 不区分大小写的正则表达式匹配 |
location ^~ 精确前缀匹配 | 匹配前缀路径后,不再检查正则匹配(优先级高于正则) |
location / 通用匹配 | 默认方式,优先级最低,其他方式匹配不到时匹配 |
location的优先级规则:
精确匹配 〉精确前缀匹配 〉 正则匹配(~和~*同时存在时,文件中物理位置靠上的优先,>普通前缀匹配 > 通用匹配。
(2) location 验证
[root@localhost ~]# vim /usr/local/nginx/conf/nginx. conf
location / {return 200"通用匹配"; #其他方式匹配不到时匹配}
location /abc {return 200"普通前缀匹配"; #uri必须是/abc开头(和精确前缀匹配功能类似,但是优先级要低很多)}
location ~ /test/abcdef {return 200"区分大小写正则"; #uri中必须包含/abc}
location ~* /test/abcreturn 200"不区分大小写正则"; #uri中必须包含/abc或/ABC}
location ^~ /abcdef {return 200"精确前缀匹配”; #uri必须是/abc开头}
location= /abc {return 200“精确匹配”; #uri必须等于/abc}
[root@localhost ~]# nginx -s reload
[root@localhost ~]# curl 192.168.10.101/abc
精确匹配
每次请求192.168.10.101/abc后,按优先级顺序依次注释配置文件中的1ocation,会发现每次的响应内容发生变更了。PS:使用正则模式时,URI部分可以使用正则表达式
3. Rewrite
(1) Rewrite 语法
rewrite <regex> <replacement> [flag];
regex:正则匹配URL字符串(只能对域名后边的除去传递的参数外的字符串起作用,例如http://www.kgc.com/index.php?id=l 只对/index.php重写)
replacement: 重写跳转后的地址
flag类型:
- last:重写后的 URI 会重新触发 location 匹配,并执行新匹配到的1ocation块中的指令,是默认类型
- break:重写后的 URI 不会重新匹配 location,直接在当前 location 中处理,且后续的 rewrite 指令不再执行
- redirect:返回302临时重定向,浏览器地址会显示跳转后的 URL 地址,爬虫不会更新url(因为是临时)
- permanent:返回301永久重定向,浏览器地址栏会显示跳转后的 URL地址,爬虫更新url
在实际工作的应用中,Nginx 跳转需求有三种方式可实现。可以直接用 rewrite 进行匹配跳转,也可以使用 if 匹配全局变量后跳转。另外,还可以使用1ocation 匹配再跳转。所以rewrite 只能放在 server}、if{}、location{}配置段中
1.servert 块中的 rewrite
执行顺序:在请求进入server块后、匹配1ocation前执行。
作用域:影响该server块下所有请求(全局生效)。
2.location{} 块中的 rewrite
执行顺序:在请求匹配到该 location 后执行。
作用域:仅对该 location 匹配的请求生效(局部生效)
3. if{} 块中的 rewrite
执行顺序:在满足 if 条件时触发。
作用域:依赖 if 表达式所在的上下文(如在server中或location中)。
(2) rewrite flag验证
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
default_type text/plain; #使用浏览器验证时,为防止浏览器请求时直接下载return的内容,而不是在页面展示内容location /abc {rewrite ^/ /def last;}location /def {return 200 "this is def";}
[root@localhost ~]# nginx -s reload
使用浏览器请求,发现相应内容是:this is def.说明last标记后继续向下匹配location了
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
default_type text/plain; #防止浏览器请求时直接下载return的内容,而不是在页面展示内容location /abc {rewrite ^/ /def break;}location /def {return 200 "this is def";}
[root@localhost ~]# nginx -s reload
改成break标记,使用浏览器请求,发现请求页面未找到(因为网页代码目录确实不存在/def的内容)说明break标记使用当前结果不继续向下匹配了
[root@localhost# vim /usr/local/nginx/conf/nginx.conf
default type text/plain; #防止浏览器请求时直接下载return的内容,而不是在页面展示内容location /abc {rewrite ^/ /def redirect;}location /def {return 200 "this is def";}
[root@localhost l# nginx -s reload
改成break标记,使用浏览器请求,发现请求页面302跳转,并且地址栏显示的是跳转后的地址
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
default_type text/plain; #防止浏览器请求时直接下载return的内容,而不是在页面展示内容location /abc {rewrite ^/ /def permanent;}location /def {return 200 "this is def";}
[root@localhost ~]# nginx -s reload
改成break标记,使用浏览器请求,发现请求页面302跳转,并且地址栏显示的是跳转后的地址
(3) rewrite中的捕获组
在Nginx的rewrite 指令中,小括号()用于定义正则表达式的捕获组(CaptureGroup),捕获的文本可以通过$1,$2,$3等变量在重写后的 URI中引用
捕获组 "()"
在正则表达式中,(pattern)会匹配pattern 并捕获内容,按顺序存入$1,$2,$3 等变量中。
引用方式
在 rewrite 的替换字符串中,通过 $1 表示第一个捕获组,$2 表示第二个,依此类推。
[root@localhost ~]# vim /usr/local/nginx/conf/nginx. conf
location /category/ {#匹配 /category/tech/123,捕获 tech到$1,123 到 $2rewrite ^/category/(.+)/(\d+)$ /archive/$1/$2 last;
}
location /archive/ {#返回捕获的分类和 IDreturn 200 "Category:$l,ID:$2";
}
测试访问
[root@localhost]# curl http://localhost/category/tech/456
Category:tech, ID:456
4. nginx中的set指令
在 Nginx 中,set 指令用于定义变量并赋值,这些变量可以用于后续的条件判断、日志记录、重写规则等场景。它提供了灵活的动态配置能力,尤其在处理复杂的请求逻辑时非常有用。
语法:
set $variable value;
[root@localhost ~]# vim /usr/local/nginx/conf/nginx. conf
location /demo {set $name "Nginx"; #定义变量 $namereturn 200 "Hello, $name!" #输出:Hello, Nginx!}
测试访问
[root@localhost ~]# curl http://localhost/demo
Hello, Nginx!
相关文章:
nginx 正反向代理和nginx正则
目录 一. 正向代理 1. 编译安装Nginx 2. 配置正向代理 二. 反向代理 1. 配置nginx七层代理 2. 配置nginx四层代理 三. Nginx 缓存 1. 缓存功能的核心原理和缓存类型 2. 代理缓存功能设置 四. Nginx rewrite和正则 1. Nginx正则 2. nginx location 3. Rewrite …...
SAM-Decoding_ 后缀自动机助力大模型推理加速!
SAM-Decoding: 后缀自动机助力大模型推理加速! 大语言模型(LLMs)的推理效率一直是研究热点。本文介绍的SAM-Decoding方法,借助后缀自动机(Suffix Automaton,SAM)实现推测解码,在提升…...
使用Scrapy构建高效网络爬虫:从入门到数据导出全流程
在数据驱动的时代,网络爬虫已成为获取公开信息的核心工具。本文将带您通过Scrapy框架完成一个实战项目,涵盖从零搭建爬虫到多格式数据导出的完整流程,并深入解析Scrapy的Feed Exports功能。 一、项目背景与目标 我们将爬取书籍网站ÿ…...
Docker安装Gitblit(图文教程)
本章教程,使用Docker安装部署Gitblit。 一、Gitblit简介 Gitblit 是一个基于 Java 的 Git 仓库管理工具,主要用于在局域网或小型团队环境中搭建私有 Git 服务器。它提供了一个简单易用的 Web 界面,用于浏览代码、管理仓库和用户权限等。 二、拉取镜像 sudo docker pull git…...
SpringBoot的汽车商城后台管理系统源码开发实现
概述 汽车商城后台管理系统专为汽车4S店和经销商设计,提供全面的汽车管理系统解决方案。 主要内容 1. 核心功能模块 系统提供以下主要功能: 销售管理:记录销售信息,跟踪交易进度客户管理:维护客户…...
组合模式(Composite Pattern)
非常棒!你现在进入了结构型设计模式中最典型的「树形结构」设计模式 —— 组合模式(Composite Pattern)。 我将通过简明解释 清晰代码 类图演示,一步步帮你理解它。 🧠 一句话定义 组合模式允许你将对象组合成树形结…...
Java捕获InterruptedException异常后,会自动清空中断状态
InterruptedException异常一般是在一个线程处于等待(像Thread.sleep()、Object.wait()、Thread.join()等方法)状态时被另一个线程调用interrupt()方法中断而抛出的。一旦捕获到InterruptedException,Java 会自动清除该线程的中断状态。 以下…...
HTML04:图像标签
图像标签 常见的图像标签 JPGGIFPNGBMP <img src"路径" alt"名称" title"悬停名称" width"高" height"宽"/><!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…...
供应链算法整理(二)--- 智能补货
供应链业务的目标价值是:优化货品的供给、销售提供支撑,以降低成本,提高时效、收益,最终提升用户体验。基于目标价值,整体的算法模块分为:智能选品、智能预测、品仓铺货、智能补货、智能调拨、仓网路由、快…...
【毕设通关】——Word交叉引用
📖 前言:在论文中,我们经常会在文段贴图片时,写“如图x所示”的内容,如果每次都手动写数字,那么当需要在前面内容插入图片时,后续更新会很繁琐,这时就需要交叉引用功能。 ǵ…...
java技术总监简历模板
模板信息 简历范文名称:java技术总监简历模板,所属行业:其他 | 职位,模板编号:XDNUTA 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工作…...
视频编解码学习三之显示器
整理自:显示器_百度百科,触摸屏_百度百科,百度安全验证 分为阴极射线管显示器(CRT),等离子显示器PDP,液晶显示器LCD 液晶显示器的组成。一般来说,液晶显示器由以下几个部分组成: […...
【人工智能】大模型安全的深度剖析:DeepSeek漏洞分析与防护实践
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的广泛应用,其安全性问题日益凸显。DeepSeek作为中国领先的开源AI模型,以低成本和高性能著称,但近期暴露的数据库…...
架构思维:使用懒加载架构实现高性能读服务
文章目录 一、引言二、读服务的功能性需求三、两大基本设计原则1. 架构尽量不要分层2. 代码尽可能简单 四、实战方案:懒加载架构及其四大挑战五、改进思路六、总结与思考题 一、引言 在任何后台系统设计中,「读多写少」的业务场景占据主流:浏…...
【AI提示词】黑天鹅模型专家
提示说明 详细解释黑天鹅模型的理论背景、定义、分类及其在不同领域的应用。 提示词 # Role: 黑天鹅模型专家## Profile - language: 中文 - description: 详细解释黑天鹅模型的理论背景、定义、分类及其在不同领域的应用 - background: 黑天鹅模型是尼尔斯莫尔提出的理论&a…...
pip安装包时网络不畅,替换国内PyPI镜像源
1、PyPI 镜像源 1.1、定义 PyPI 镜像源是对 Python Package Index(PyPI)官方仓库的复制。 PyPI 是 Python 社区中最大的软件包仓库,存储着大量的 Python 包,供开发者们下载和使用。 然而,由于 PyPI 服务器位于国外&a…...
TS 类型推论
应用场景: 1.变量初始化 仅声明不初始化无法推断是什么类型,必须手动添加类型注解 2.决定函数返回值 根据函数体内的运算可以推断出返回值的类型 函数参数的类型声明建议一定要手写...
Java基于SaaS模式多租户ERP系统源码
目录 一、系统概述 二、开发环境 三、系统功能介绍 一、系统概述 ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业…...
PHP的include和require
文章目录 环境require和includerequire VS includerequire(include) VS require_once(include_once)路径问题当前工作目录对相对路径的影响题外话总结其它 参考 环境 Windows 11 专业版XAMPP v3.3.0 PHP 8.2.12Apache 2.4.58 VSC…...
日本人工智能发展全景观察:从技术革新到社会重构的深度解析
一、日本IT产业演进与AI技术崛起的历史脉络 1.1 信息化时代的奠基(1990-2010) 日本IT产业的腾飞始于"信息高速公路计划"的实施。1994年NTT推出全球首个商用光纤网络,至2005年实现全国光纤覆盖率突破80%。这一时期培育出富士通、N…...
什么是DGI数据治理框架?
DGI数据治理框架是由数据治理研究所(Data Governance Institute, DGI)提出的一套系统性方法论,旨在帮助企业或组织建立有效的数据治理体系,确保数据资产的高质量管理、合规使用和价值释放。以下是关于DGI数据治理框架的核心内容&a…...
[硬件电路-12]:LD激光器与DFB激光器功能概述、管脚定义、功能比较
一、LD激光器(普通半导体激光器)功能 核心功能: LD激光器通过半导体材料的电子-空穴复合实现受激辐射,将电能直接转换为高相干性激光,是光电子系统的核心光源。 基础光发射功能 工作原理:正向偏置电流注入…...
升级 CUDA Toolkit 12.9 与 cuDNN 9.9.0 后验证指南:功能与虚拟环境检测
#工作记录 在 NVIDIA 发布 CUDA Toolkit 12.9 与 cuDNN 9.9.0 后,开发者纷纷选择升级以获取新特性和性能提升。 CUDA Toolkit 12.9 与 cuDNN 9.9.0 发布,带来全新特性与优化-CSDN博客 然而,升级完成并不意味着大功告成,确认升级后…...
湖仓一体架构解析:如何平衡数据灵活性与分析性能?
一、什么是湖仓一体架构?解决哪些核心问题? 在数据爆炸的时代,企业面临着如何高效处理和分析海量数据的挑战。传统架构难以同时满足灵活性和性能需求,湖仓一体架构应运而生。 传统数据架构的局限 数据湖(存储各类原…...
56、【OS】【Nuttx】编码规范解读(四)
背景 接之前 blog 53、【OS】【Nuttx】编码规范解读(一) 54、【OS】【Nuttx】编码规范解读(二) 55、【OS】【Nuttx】编码规范解读(三) 分析了行宽格式,注释要求,花括号风格等&#…...
MySQL基础关键_007_DQL 练习
目 录 一、题目 二、答案(不唯一) 1.查询每个部门薪资最高的员工信息 2.查询每个部门高于平均薪水的员工信息 3. 查询每个部门平均薪资等级 4.查询部门中所有员工薪资等级的平均等级 5.不用分组函数 max 查询最高薪资 6.查询平均薪资最高的部门编…...
气泡图、桑基图的绘制
1、气泡图 使用气泡图分析某一年中国同欧洲各国之间的贸易情况。 气泡图分析的三个维度: • 进口额:横轴 • 出口额:纵轴 • 进出口总额:气泡大小 数据来源:链接: 国家统计局数据 数据概览(进出口总额&…...
数据库Mysql_联合查询
或许自己的不完美才是最完美的地方,那些让自己感到不安的瑕疵,最终都会变成自己的特色。 ----------陳長生. 1.介绍 1.1.为什么要进行联合查询 在数据设计的时候,由于范式的需求,会被分为多个表,但是当我们要查询数据…...
数字孪生:解码智慧城市的 “数字神经系统”
当城市规模以惊人速度扩张,传统管理模式在交通拥堵、能源浪费、应急响应滞后等问题面前渐显乏力。数字孪生技术正以 “数字镜像” 重构城市运作逻辑,为智慧城市装上一套高效、智能的 “数字神经系统”。通过将物理世界的城市映射到虚拟空间,实…...
开源项目:optimum-quanto库介绍
项目地址:https://github.com/huggingface/optimum-quanto 官网介绍:https://huggingface.co/blog/quanto-introduction 量化是一种技术,通过使用低精度数据类型(如 8 位整数 (int8))而不是通常…...
C++学习:六个月从基础到就业——C++11/14:lambda表达式
C学习:六个月从基础到就业——C11/14:lambda表达式 本文是我C学习之旅系列的第四十篇技术文章,也是第三阶段"现代C特性"的第二篇,主要介绍C11/14中引入的lambda表达式。查看完整系列目录了解更多内容。 引言 Lambda表达…...
cesium基础设置
在上节新建的程序中,我们会看到有一行小字: 原因为我们没有输入token,想要让这行小字消失的方法很简单,前往cesium的官网注册账号申请token.然后在App.vue中如下方式添加token 保存后即可发现小字消失. 如果连logo都想去掉呢? 在源代码中,我们初始化了一个viwer,即查看器窗口…...
一些好玩的东西
🚀 终极挑战:用 curl 玩《星球大战》 telnet towel.blinkenlights.nl # 其实不是 curl,但太经典了! 效果:在终端播放 ASCII 版《星球大战》电影!(如果 telnet 不可用,可以试…...
ActiveMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 的选型参考(二)
ActiveMQ、Kafka 和 RocketMQ 详细对比 性能对比 在性能方面,Kafka 和 RocketMQ 通常在高吞吐量场景下表现出色,而 ActiveMQ 则相对较弱。根据相关测试数据表明,Kafka 在处理大规模日志数据时,单机吞吐量可以达到每秒数十万条甚…...
HTML学习笔记(7)
一、什么是jQuery jQuery 是一个 JavaScript 库。他实现了JavaScript的一些功能,并封装起来,对外提供接口。 例子实现一个点击消失的功能,用JavaScript实现 <!DOCTYPE html> <html lang"en"> <head><meta …...
Jenkis安装、配置及账号权限分配保姆级教程
Jenkis安装、配置及账号权限分配保姆级教程 安装Jenkins下载Jenkins启动Jenkins配置Jenkins入门Jenkins配置配置中文配置前端自动化任务流新建任务拉取代码打包上传云服务并运行配置后端自动化任务流新建任务拉取代码打包上传云服务并运行账号权限分配创建用户分配视图权限安装…...
面向对象编程(Object-Oriented Programming, OOP)是什么?
李升伟 编译 简介 如果你已经接触过软件开发领域的话,你肯定听说过"面向对象编程"(Object-Oriented Programming, OOP)这个术语。但你知道什么是OOP吗?为什么它如此重要?在这篇文章中我们将深入解析OOP的基…...
Hotspot分析(1):单细胞转录组识别信息基因(和基因模块)
这一期我们介绍一个常见的,高分文章引用很高的一个单细胞转录组分析工具Hotspot,它可针对单细胞转录组数据识别有意义基因或者基因module,类似于聚类模块。所谓的”informative "的基因是那些在给定度量中相邻的细胞之间以相似的方式表达…...
从图文到声纹:DeepSeek 多模态技术的深度解析与实战应用
目录 一、引言二、DeepSeek 技术基础2.1 架构与原理2.2 多模态能力概述 三、文本与图像关联应用3.1 图文跨模态对齐技术3.1.1 技术原理3.1.2 DeepSeek 的独特方法 3.2 图像生成与文本描述3.2.1 应用案例3.2.2 技术实现 3.3 多模态检索系统中的应用3.3.1 系统搭建流程3.3.2 实际…...
cuDNN 9.9.0 便捷安装-Windows
#工作记录 从 CUDA12.6.3 和 cuDNN9.6.0 版本起,开启了使用 exe 安装包直接进行安装升级的支持模式,彻底改变了以往那种繁琐的安装流程。 在这两个版本之前,开发者在安装 CUDA 和 cuDNN 时,不得不手动下载 cuDNN 压缩包…...
profile软件开发中的性能剖析与内存分析
在软件开发中,“Profile”(性能剖析/性能分析)指的是通过工具详细监控程序运行时的各种性能指标,帮助开发者定位代码中的效率瓶颈或资源问题。当有人建议你 “profile 一下内存问题” 时,本质上是让你用专业工具动态分…...
0.0973585?探究ts_rank的score为什么这么低
最近在使用postgres利用ts_rank进行排序找到最符合关键词要求得内容时发现: 即使是相似的内容,得分也是非常非常得低(其中一个case是0.0973585)。看起来很奇怪,非常不可行。于是我又做了一个简单测的测试: SELECT ts_rank(to_tsvector(english, skirt), to_tsquery(skirt)…...
架构思维:利用全量缓存架构构建毫秒级的读服务
文章目录 一、引言二、全量缓存架构概述三、基于 Binlog 的缓存同步方案1. Binlog 原理2. 同步中间件3. 架构整合核心收益 四、Binlog 全量缓存的优缺点与优化优点缺点与取舍优化策略 五、其他进阶优化点六、总结 一、引言 架构思维:使用简洁的架构实现高性能读服务…...
永磁同步电机控制算法--基于PI的位置伺服控制
一、原理介绍 永磁同步伺服系统是包含了电流环、速度环和位置环的三环控制系统。 伺服系统通过电流检测电路和光电编码器检测电动机三相绕组电流和转子位置θ,通过坐标变换,计算出转矩电流分量iq和励磁电流分量id。 位置信号指令与实际转子位置信号的差…...
P1603 斯诺登密码详解
这个题目,我详细讲题解的两种方法,洛谷里面的题解,我是觉得大部分的时候是差了点意思的,不是看不懂,就是新知识没人详细讲解,我也是经常破防 先看题目: 题目是什么意思: 1…...
计算方法实验六 数值积分
【实验性质】综合性实验。 【实验目的】理解插值型积分法;掌握复化积分法算法。 【实验内容】 1对 ,用复化梯形积分和变步长梯形积分求值(截断误差不超过)。 【理论基础】 积分在工程中有重要的应用,数值积分…...
avx指令实现FFT
avx指令实现FFT 参考代码实现的难点补充的avx指令fft_avx256实现可继续优化的点 C语言实现FFT变换参考的代码是参考大模型生成的代码,很明显其使用的是位反转和蝶形变换的方法实现的FFT变换。但是大模型无法正确的生成用avx指令写的FFT变换的算法,所以这…...
Nginx 核心功能之正反代理
目录 一、Nginx 二、正向代理 三、反向代理 四、Nginx 缓存 1. 缓存功能的核心原理和缓存类型 2. 代理缓存功能设置 五、Nginx rewrite和正则 (1)Nginx 正则 (2)nginx location (3)Rewrite &…...
function包装器的意义
一:function包装器的概念 function包装器 也叫作适配器。C中的function本质是一个类模板,也是一个包装器。 二:需要function包装器的场景 那么我们来看看,我们为什么需要function呢? 一个需要包装器的场景:…...
【ThinkBook 16+ 电脑重做系统type-c接口部分功能失效解决方案】
ThinkBook 16 电脑重做系统type-c接口部分功能失效解决方案 问题回顾:重做电脑后,type-c接口部分功能失效,充电正常,连接外置硬盘正常,无法连接外拓显示器,显示usbc无信号(不同设备可能显示不同…...