【Nginx26】Nginx学习:日志与镜像流量复制
Nginx学习:日志与镜像流量复制
总算到了日志模块,其实这个模块的指令之前我们就用过了,而且也是是非常常见的指令。相信这一块的学习大家应该不会有什么难度。另一个则是镜像功能,这个估计用过的同学就比较少了,不过也并不是特别的复杂,一会讲到的时候咱们再详细说哦。
今天的两个模块都是包含在 Nginx 源码中的,不需要额外单独编译安装。所有的配置指令大分部都可以在 http、server、location 中使用,仅有一个指令是只能配置在 http 中的,我会单独说明。
日志
日志模块是非常常用的模块,这里指的是访问日志哦,不是 error_log 。错误日志是属于 HTTP 核心模块的内容,之前我们已经学习过了。大多数情况下,我们只是去为每个 Server 指定一个单独的日志文件,这样便于管理,或者有特殊需要就为某些 Location 指定。另外还有一些情况就是会屏蔽掉一些比如说 favicon.ico 文件或者静态图片等资源文件的访问日志记录。
它的全名是 ngx_http_log_module 模块,用于以指定的格式写入请求日志。请求记录在处理结束位置的上下文中。如果在请求处理期间发生内部重定向,它可能与原始位置不同。
还是先来学习它的配置指令,最后再进行简单地测试。
access_log
设置缓冲日志写入的路径、格式和配置。
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
默认值是 logs/access.log combined 。可以在同一配置级别上指定多个日志。可以通过在第一个参数中指定“syslog:”前缀来配置日志记录到 syslog。特殊值 off 取消当前级别的所有 access_log 指令。如果未指定格式,则使用预定义的“组合”格式。
必须要有的这个 path 参数,是指定日志要记录到哪个文件的,可以相对也可以是绝对路径的文件。后面的 format 则是根据后面要讲的 log_format 配置,确定使用哪个日志格式。这个参数可以不填,不填走默认的 combined 格式,下面会看到。
如果使用了 buffer 或 gzip (1.3.10, 1.2.7) 参数,写入日志将被缓冲。缓冲区大小不得超过对磁盘文件的原子写入大小。对于 FreeBSD,这个大小是无限的。这个一会我们会测试。
启用缓冲后,这些数据将马上写入文件:
如果下一个日志行不适合缓冲区
如果缓冲的数据比刷新参数(1.3.10、1.2.7)指定的时间早
当工作进程重新打开日志文件或正在关闭时
如果使用 gzip 参数,则缓冲的数据将在写入文件之前进行压缩。压缩级别可以设置在 1(最快,较少压缩)和 9(最慢,最佳压缩)之间。默认情况下,缓冲区大小等于 64K 字节,压缩级别设置为 1。由于数据是按原子块压缩的,因此日志文件可以随时被“zcat”解压缩或读取。
文件路径可以包含变量(0.7.6+),但是这样的日志有一些限制:
工作进程使用其凭据的用户应有权在具有此类日志的目录中创建文件
缓冲写入不起作用
每次写入日志时都会打开和关闭文件。但是,由于常用文件的描述符可以存储在缓存中,因此可以在 open_log_file_cache 指令的有效参数指定的时间内继续写入旧文件
在每次日志写入期间,都会检查请求的根目录是否存在,如果不存在,则不会创建日志。因此,在同一配置级别上同时指定 root 和 access_log 是一个好主意
if 参数 (1.7.0) 启用条件日志记录。如果条件评估为“0”或空字符串,则不会记录请求。就是可以有条件的记录到日志,后面我们也会测试这个参数。
另外,如果是新安装好的 Nginx ,没有别的访问日志配置,并且在编译时有 --http-log-path=/var/log/nginx/access.log
那么就是默认找不到 access_log 和 log_format 配置的其它所有日志全被记录到这个编译时参数所指定的日志文件中。如果你找不到日志在哪了,可以 nginx -V
看一下是不是记录到这里了哦。
log_format
指定日志的格式。
log_format name [escape=default|json|none] string ...;
默认值 combined "..." ,它只能配置在 http 模块下。转义参数 (1.11.8) 允许在变量中设置 json 或默认字符转义,默认情况下使用默认转义。none 值 (1.13.10) 禁用转义。对于默认转义,字符“"”、“\”和其他值小于 32 (0.7.0) 或大于 126 (1.1.6) 的字符将转义为“\xXX”。如果找不到变量值,将记录一个连字符(“-”)。对于json转义,JSON字符串中不允许的所有字符都将被转义:字符“”和“\”被转义为“\”和“\\”,值小于32的字符被转义为“\n”, “\r”、“\t”、“\b”、“\f”或“\u00XX”。
必须的 name 参数就是上面 access_log 所需要的那个 format 参数。这样两边配合起来就是一套完整的日志记录功能了。
日志格式可以包含公共变量,以及仅在写入日志时存在的变量:
$bytes_sent
发送到客户端的字节数$connection
连接序列号$connection_requests
当前通过连接发出的请求数 (1.1.18)$msec
以秒为单位的时间,在日志写入时以毫秒为单位$pipe
“p”如果请求是流水线的,“.”否则$request_length
请求长度(包括请求行、请求头和请求体)$request_time
以毫秒为单位的请求处理时间;从客户端读取第一个字节到最后一个字节发送到客户端后写入日志之间经过的时间$status
响应状态$time_iso8601
ISO 8601 标准格式的当地时间$time_local
通用日志格式的本地时间
在现代 nginx 版本中,变量 $status (1.3.2, 1.2.2), $bytes_sent (1.3.8, 1.2.5), $connection (1.3.8, 1.2.5), $connection_requests (1.3.8, 1.2 .5), $msec (1.3.9, 1.2.6), $request_time (1.3.9, 1.2.6), $pipe (1.3.12, 1.2.7), $request_length (1.3.12, 1.2.7 )、$time_iso8601 (1.3.12, 1.2.7) 和 $time_local (1.3.12, 1.2.7) 也可用作公共变量。
发送到客户端的标题行具有前缀“sent_http_”,例如,$sent_http_content_range。
配置始终包含预定义的“组合”格式:
log_format combined '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$http_user_agent"';
默认安装完成后提供的 nginx.conf 或 nginx.conf.default 中,有两段注释掉的日志配置,其实就是最基本的日志配置信息。你可以打开试试哦。
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;
open_log_file_cache
定义一个缓存,用于存储名称包含变量的常用日志的文件描述符。
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
该指令具有以下参数:
max
设置缓存中描述符的最大数量;如果缓存已满,则关闭最近最少使用 (LRU) 描述符inactive
如果在此期间没有访问,则设置缓存描述符关闭的时间;默认情况下,10 秒min_uses
设置在由 inactive 参数定义的时间内文件使用的最小数量,以让描述符在缓存中保持打开状态;默认情况下,1valid
设置应检查文件是否仍以相同名称存在的时间;默认情况下,60 秒off
禁用缓存
这个确实没用过,不过看样子是缓存打开的日志文件的句柄的。也不知道怎么测出效果,所以咱们就不演示了哈。有兴趣的小伙伴可以自己看一下,有相关的经验的大佬也欢迎留言评论哈。
日志测试
好了,日志模块的配置指令就是上面那三个,不是特别复杂吧,接下来我们就简单测试一下。先配置两个 log_format ,名字就叫 log1 和 log2 吧,为了测试方便。真实业务场景下还是要根据自己的需求好好起名字哈。
log_format log1 'This is Log1 Format: $remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" "$arg_a"' ;log_format log2 escape=json '{"remote_addr":"$remote_addr"}';
然后找一个 Server ,建个 lcoation 。
location /log1/ {alias html/;access_log logs/log1_access_con.log.gz log1 buffer=1000 gzip=1 if=$arg_a;access_log logs/log1_access.log log1;
}
这个配置是啥意思呢?第一条 access_log ,加了一些参数,分别是缓冲区配置、gzip压缩一下,然后还有条件。也就是说,当我们的 GET 参数中有 a 这个参数时,访问日志会记录到 logs/log1_access_con.log.gz 这个文件中。
第二条 access_log ,没有别的参数,就是最简单的使用 log1 的配置。现在直接访问一下吧,先看下不带任何参数。
# /usr/local/nginx/logs/log1_access.log
This is Log1 Format: 192.168.56.1 - [05/Sep/2022:09:18:47 +0800] "GET /log1/ HTTP/1.1" 200 621 "" "PostmanRuntime/7.29.2" "" ""
普通的日志记录文件中,清楚地看到了访问请求的情况。注意最后有两个空的双引号,并且 logs/log1_access_con.log.gz 创建了,但还是空的。然后我们再带一个 ?a=111
这样的 GET 参数试一下。
# /usr/local/nginx/logs/log1_access.log
This is Log1 Format: 192.168.56.1 - [05/Sep/2022:09:19:22 +0800] "GET /log1/?a=111 HTTP/1.1" 200 621 "" "PostmanRuntime/7.29.2" "" "111"
看出来不同了吧,最后的一个空引号有值了,因为我们在上面的 log1 的 log_format 中最后加入了 $arg_a
这个变量。现在 if 参数的条件满足了,我们再看一下 log1_access_con.log.gz 文件,我这里还是 0 ,还是没有内容,这是为啥?因为 buffer 参数的问题啦,日志内容还没有刷到文件中。这时可以多刷几下,或者重载配置 nginx -s reload
,重载日志 nginx -s reopen
都可以。然后就会看到 log1_access_con.log.gz 有内容了。直接使用 gzip 命令解压。
gzip -d log1_access_con.log.gz
查看解压出来文件内容,应该和上面记录的日志是一样的。不过这边记录的日志都是有最后那个 GET 参数的。
好了,上面还有一个 log2 的格式配置,使用了 escape=json
,就是要记录一个 JSON 格式的日志。那么咱们也单独再来一个 location 测试吧,为了看得清楚一点。
location /log2/ {alias html/;access_log logs/log2_access.log log2;
}
访问之后查看日志文件,记录的内容是这样的。
# /usr/local/nginx/logs/log2_access.log
{"remote_addr":"192.168.56.1"}
记录 POST 日志
在之前学习内嵌变量时,我们就说过,所有的变量都可以用在日志记录中,而且之前还学习过一些变量是只能在日志中体现的。比如说 $gzip_ratio
这种。另外,还有一种非常常见的需求就是要记录 POST 参数,为啥呢?因为现在很多大数据分析系统,会直接通过日志分析来提取数据。就像我们在讲 emptygif 时说过的数据采集。不过空图片一般都是以 GET 参数的提取分析为主,实际业务中还是可能会有 POST 数据提取的需求。
为了利用 Nginx 的强大性能,并同步收集到 POST 数据埋点信息,我们也可以直接简单地将 POST 数据变量放到日志格式配置中就可以实现这种功能了。
log_format postinfo '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$http_user_agent" ''"$request_body"';
server {listen 8026;location ~ \.php$ {root html;fastcgi_pass unix:/var/sock/php-fpm/www.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}access_log logs/26.post.log postinfo;
}
上面的配置中,只是在默认日志最后多加了一个 $request_body
变量。它的意思就是获取 Body 中的内容,也就是 POST 的数据信息。这个变量之前我们已经学习过哦,不记得的小伙伴可以回到 Nginx学习:HTTP核心模块(十二)内嵌变量 https://mp.weixin.qq.com/s/0ks7GgfcvJpQp7mA1IgQcA 再看一下哦。
curl --request POST 'http://192.168.56.88:8026/1.php?a=123' --data-urlencode 'bbb=4444'
192.168.56.1 - - [05/Sep/2022:10:55:34 +0800] "POST /1.php?a=123 HTTP/1.1" 200 1366 "-" "PostmanRuntime/7.29.2" "bbb=4444"
看到日志记录的结果了吧。不过需要注意的是,POST 还有一种提交格式是 FORM-DATA ,就是需要上传文件时要用的那种格式,这种格式获得的结果是不一样的哦。
curl --request POST 'http://192.168.56.88:8026/1.php?a=123' --form 'aaa=555'
192.168.56.1 - - [05/Sep/2022:10:59:00 +0800] "POST /1.php?a=123 HTTP/1.1" 200 1102 "-" "curl/7.79.1" "--------------------------02b9bcad6dd94cb3\x0D\x0AContent-Disposition: form-data; name=\x22aaa\x22\x0D\x0A\x0D\x0A555\x0D\x0A--------------------------02b9bcad6dd94cb3--\x0D\x0A"
大数据提取日志时需要注意这两块的不同哦。
镜像 Mirror
这个镜像是啥?在没系统学习文档之前我都不知道还有这么个东西。它的全称是 ngx_http_mirror_module 模块(1.13.4)通过创建后台镜像子请求来实现原始请求的镜像,并且会忽略对镜像子请求的响应。
还是看不懂吧?其实呀,它就是可以将我们的请求再发给另一个镜像地址,它只管发送,不管那边会有什么响应。就相当于是将流量复制了一份。我们先来看它的配置。
mirror
设置原始请求将被镜像到的 URI。
mirror uri | off;
默认值是 off ,打开的话就是设置一个 URI 就可以了,这个 URI 就是要发送到的地址。可以在同一配置级别上指定多个镜像。
mirror_request_body
指示客户端请求正文是否被镜像。启用后,将在创建镜像子请求之前读取客户端请求正文。
mirror_request_body on | off;
在这种情况下,由 proxy_request_buffering、fastcgi_request_buffering、scgi_request_buffering 和 uwsgi_request_buffering 指令设置的无缓冲客户端请求正文代理将被禁用。
这个配置默认是 on ,如果改成 off 的话,POST 请求中的 Body 部分就不会被发送到镜像地址上了。
镜像流量复制测试
好了,直接来测试吧,这个东西要是上面没看懂,那就手动测试一下,不动手,光看概念,不懂的始终还是不懂。我们先准备一个镜像 location 。
location /mirror1/ {alias html/;mirror /26.php;# mirror_request_body off;
}
设置一个 mirror 指定地址为当前目录的 26.php 这个文件,当然我们也可以设置成静态文件,不过为了记录请求是否真的发过去了,使用动态文件还是方便些。
这个 26.php 里面就是记录一下请求的内容到一个日志文件中。不需要返回什么响应,因为镜像是会忽略响应的嘛,它只是将请求发走,响应还是按正常的响应,不会走镜像中的响应。
<?php
$req = json_encode($_REQUEST);
file_put_contents('./26.REQ.log', $req, FILE_APPEND);
上面两个准备好了之后,我们就可以测试了。
// curl 请求
curl --request POST 'http://192.168.56.88/mirror1/?a=123' --data-urlencode 'bbb=4444'// 26.REQ.log
{"a":"123","bbb":"ssss"}{"a":"123","bbb":"ssss"}
可以看到,请求内容被完整记录了下来,但是访问路径返回的响应还是我们的静态首页的内容。不过你会发现一个问题,这个日志被记录了两条,也就是说,这个 26.php 被访问了两次。如果我们直接访问这个 php 页面,是只会正常记录一次的。
curl --request POST 'http://192.168.56.88/26.php?a=123' --data-urlencode 'bbb=4444'
这个原因我也没找到,网上也没有相关的资料。
那么这个镜像功能可以有什么实际的应用吗?一是可以做流量放大,比如多次请求;二是灰度发布验证,通过镜像到新版来验证新版本是否会报错;三是忽略响应很重要,可以发送一些回调验证之类的请求。
不过需要注意的是,虽然会忽略响应,但如果镜像的地址无响应或者响应慢的时候,也会拖累主请求的响应速度。另外如果是 POST/PUT/DELETE 这些请求,一定要清楚地知道自己发送的请求会对数据产生的影响,并且镜像端要做好日志记录。
总结
日志功能很重要,虽然错误日志可能更有利于我们进行调试,发现问题。但是访问日志同样也很关键,网站的很多统计,流量、热点链接、爬虫分析、黑客防护等也都需要通过分析访问日志来实现。因此,大部分情况下,咱们还是要打开并且配置好相应的访问日志信息的。但是访问日志一般会比较大,因此会有日志需要分割保存的问题,关于这个问题,我们后面再说,但其实非常简单,大家自己先去找找相关的资料也没问题。
另一个镜像模块,真的之前从来不知道,现在虽然了解了,但是要想灵活运用还是需要更多的实践的。所以咱们也不瞎吹牛了,功能用法了解之后就是实践运用尝试一下咯。
参考文档:
http://nginx.org/en/docs/http/ngx_http_log_module.html
http://nginx.org/en/docs/http/ngx_http_mirror_module.html
相关文章:
【Nginx26】Nginx学习:日志与镜像流量复制
Nginx学习:日志与镜像流量复制 总算到了日志模块,其实这个模块的指令之前我们就用过了,而且也是是非常常见的指令。相信这一块的学习大家应该不会有什么难度。另一个则是镜像功能,这个估计用过的同学就比较少了,不过也…...
Stability AI发布基于稳定扩散的音频生成模型Stable Audio
近日Stability AI推出了一款名为Stable Audio的尖端生成模型,该模型可以根据用户提供的文本提示来创建音乐。在NVIDIA A100 GPU上Stable Audio可以在一秒钟内以44.1 kHz的采样率产生95秒的立体声音频,与原始录音相比,该模型处理时间的大幅减少…...
华为OD机试 - 计算面积 - 逻辑分析(Java 2023 B卷 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…...
Ganache本地测试网+cpolar内网穿透实现公网访问内网
文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网:我们通常说的是互联网&am…...
【每日一题】ARC071D - ### | 前缀和 | 简单
题目内容 原题链接 给定一个长度为 n n n 的数组 a a a 和一个长度为 m m m 的数组 b b b 。 从数组 a a a 中挑出两个数,作为两条平行于 y y y 轴的直线,数组 b b b 中挑出两个数,作为两条平行于 x x x 轴的直线,问这四…...
(Vue2)VueRouter
VueRouter 修改地址栏路径时,切换显示匹配的组件 使用52: 1下载版本3.6.5(Vue3对应版本4.X) npm add vue-router3.6.5 2引入 import VueRouter from vue-router 3安装注册 Vue.use(VueRouter) 4创建路由对象 const route…...
6.文本注释方法
1.单行注释 在 LaTeX 中,可以使用 % 符号进行单行注释。 2.整段的注释 但如果要注释一整段文字,可以使用 comment 宏包或 \iffalse 和 \fi 命令来实现。 2.1 使用 comment 宏包 在导言区使用 \usepackage{comment} 命令加载 comment 宏包。然后&…...
[Linux打怪升级之路]-缓冲区
前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习目标&…...
【力扣】13. 罗马数字转整数
题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符数值I1V5X10L50C100D500M1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X II 。 27 写…...
高效时间管理,事无巨细掌握——OmniFocus Pro 3 for Mac最强GTD工具
在快节奏的现代生活中,有效地管理和安排时间变得至关重要。如果您正在寻找一款功能强大的时间管理工具,那么OmniFocus Pro 3 for Mac将是您的最佳选择。作为一款专业的GTD(Getting Things Done)应用程序,它为您提供了一…...
解锁前端Vue3宝藏级资料 第五章 Vue 组件应用 3( Slots )
5.4 Slots 我们已经了解到组件能够接收任意类型的 JavaScript 值作为 props,但组件要如何接收模板内容呢?在某些场景中,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段。Slots 可用于将Html内容从父组…...
接口测试之文件上传
在日常工作中,经常有上传文件功能的测试场景,因此,本文介绍两种主流编写上传文件接口测试脚本的方法。 首先,要知道文件上传的一般原理:客户端根据文件路径读取文件内容,将文件内容转换成二进制文件流的格…...
7.Flask-Migrate数据库迁移
基本介绍 flask-migrate是基于Alembic的一个封装,并集成到Flask中 所有的迁移操作其实都是Alembic做的,能跟踪模型的变化,并将变化映射到数据库中 一.安装 pip install flask-migrate二.基本使用 2.1初始化数据库迁移脚本 在Flask应用的根目录下,运行命令 flas…...
信创办公–基于WPS的PPT最佳实践系列 (项目8创建电子相册)
信创办公–基于WPS的PPT最佳实践系列 (项目8创建电子相册) 目录 应用背景操作步骤 应用背景 如果我们想把图片弄成相册,或者弄成一段有音乐的视频分享给朋友。我们可以利用PPT来制作。那我们如何用PPT制作电子相册或视频呢?可以跟…...
JRedis的基本操作,基本数据类型操作
Redis的基本数据类型: stringhashlistsetzset {public static void main(String[] args) {Jedis jedis new Jedis("127.0.0.1", 6379);// stringjedis.set("hello", "word");String hello jedis.get("hello");System.o…...
QT网页 webengine / CEF
QT WebEngine 官方文档 WebEngine 架构: 能看到 WebEngine 有一个核心模块是基于 Chromium 构造的,通过使用 Chromium 的Blink渲染引擎和V8 JavaScript引擎来处理和渲染Web内容,并将这些底层技术封装为一系列高级的C类和接口,以…...
Golang笔试题:编写一个函数,接收一个整数参数n,输出n的阶乘结果
今天,我们开发的AI笔试题工具,ai扁食——AI程序员笔试系统给我出了中级Golang题目,就是这道题:《请编写一个函数,接收一个整数参数n,输出n的阶乘结果》,希望我写一个函数,输出n的阶乘…...
外包干了2个月,技术退步明显.......
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...
无涯教程-JavaScript - BINOM.DIST函数
描述 BINOM.DIST函数返回单个项二项式分布概率。 在具有固定数量的测试或试验的问题中使用BINOM.DIST。 当任何试验的输出只是成功或失败时 试验是独立的,并且 在整个实验中成功的概率不变的情况 语法 BINOM.DIST (number_s,trials,probability_s,cumulative)争论 Argu…...
linux定时重启tomcat
1.编辑重启Tomcat命令 首先编辑一个文件 vi my_restart.sh 然后输入: #!/bin/bash . /etc/profile tomcatPath"/opt/finereport/tomcat" binPath"$tomcatPath/bin" echo "[info][$(date %F %H:%M:%S)]正在监控tomcat,路径&a…...
在静态方法中访问@Value注入的静态变量!!
一、 静态变量 static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的 简单来说:在某些类的对象中存在一些相同的成员变量,那么这种成员变量就可以设置…...
掌握这些算法,让你的编程之路更顺畅——重要算法解析
一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。这些算法通常被广泛应用于日常编程工作中,是提升编程效率和解决实际问题的重要工具。本文将介绍几种十分重要的“必抓…...
flink集群与资源@k8s源码分析-总述
1 简介 集群和资源模块提供动态资源能力,是分布式系统关键基础设施,分布式datax,分布式索引,事件引擎都需要集群和资源的弹性资源能力,提高伸缩性和作业处理能力。本文分析flink的集群和资源的k8s模块,深入了解其设计原理,为开发自有的集群和资源组件做技术准备, 同时涉…...
LeetCode 0213. 打家劫舍 II:动动态规划
【LetMeFly】213.打家劫舍 II:动动态规划 力扣题目链接:https://leetcode.cn/problems/house-robber-ii/ 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味…...
VMware17 不可恢复错误mks解决方案
用的虚拟机VMware17版本,然后运行带HDR的unity程序,结果报错 网上找了很多解决方案,都没用。毕竟需要在不放弃虚拟机3D加速的情况下运行。 最终皇天不负有心人,亲测有效的方法: 在虚拟机名字.vmx文件里添加以下2行&a…...
【深度学习】 Python 和 NumPy 系列教程(廿五):Matplotlib详解:3、多子图和布局:subplot()函数
目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 3、多子图和布局 1. subplot()函数 简单示例 一、前言 Python是一种高级编程语言,由Guido van Rossum于1991年创建。它以简洁、易读的语法而闻名,并且具有强大的功能…...
计算机网络知识补充(1)
计算机网络:是一个将分散的,具有独立功能的计算机系统,通过通信设备和线路进行连接起来,由功能完善的软件实现资源共享和信息共享的系统,计算机网络是互连的,自治的计算机集合 互连:通过通信链路来进行互联互通 自治:没…...
C# Onnx Yolov8 Pose 姿态识别
效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…...
7.algorithm2e中while怎么使用
algorithm2e中while怎么使用 在 algorithm2e 宏包中,要使用 while 循环,您可以使用 \While 和 \EndWhile 命令来定义循环的开始和结束。以下是如何使用 while 循环的示例: \documentclass{article} \usepackage[linesnumbered,boxed]{algorit…...
Flask狼书笔记 | 08_个人博客(下)
文章目录 8 个人博客8.4 初始化博客8.5 使用Flask-Login管理用户认证8.6 CSRFProtect实现CSRF保护8.7 编写博客后台小结 8 个人博客 8.4 初始化博客 1、安全存储密码 密码不要以明文的形式直接存储在数据库中,以防被攻击者盗取、泄露。一般的做法是,不…...
商城网站布局/提交百度收录
java中的类和方法的修饰符Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性。类的修饰符分为访问控制符和非访问控制符两大类。修饰符之间的先后排列次序对类的性质没有任何影响。一&…...
南通通州建设工程质量监督网站/慈溪seo排名
什么是readline readline允许从可读流中以逐行的方式读取数据,比如process.stdin等。 在node.js命令行模式下默认引入了readline模块,但如果是使用node.js运行脚本的话,则需要自己通过require(‘readline’)方式手动引入该模块。 怎么使用r…...
公司装修效果图办公室/网店seo关键词
很简单,这个问题是这样的,su 或者 su root:的话只是将当前身份转为root,用户shell并没有改变.所以有些系统命令不能使用. su -或者su -l或者su -l root,可以完全的将当前环境转为root环境.如同root直接登陆. 其次,serv…...
wordpress 酷播/整站优化快速排名
mysql主键约束主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。使用主键应注意以下几点:每个表只能定义一个主键。主键值必…...
做网站找个人还是找公司好/合肥品牌seo
原文链接:http://blog.csdn.net/fengbingchun/article/details/47378515 Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C库,它里面包含了很多算法。它的License是MPL2。它支持多平台。 Eigen采用源码的方式提供给用户使用,在使用时只…...
ae做动画教程网站/长沙seo网站
导读: 在开发项目过程中,当需要使用条件运算符时,小白首选if else或者switch,而大佬一般都是首先考虑使用三目运算符,因为三目运算符只要一行代码就可以搞定,代码块看起来也比较常清爽。 switch的写法&am…...