当前位置: 首页 > news >正文

Nginx日志格式化和追踪

背景

Nginx是一款功能强大的Web服务器,对于网络环境中的日志记录和配置至关重要。定制化Nginx日志格式可以帮助管理员更好地监控服务器性能、分析用户行为并做出相应优化。在本文中,我们将深入探讨Nginx日志格式的高级定制化策略,包括理解基础日志结构、日志格式自定义实例、模块集成与扩展以及日志切割与管理。

  1. Nginx的自定义日志(指标全面)

  2. Nginx之间的日志追踪(分析整个流程)

Nginx自定义日志格式

1. 理解基础日志结构

log_format 有一个默认的无需设置的 combined 日志格式,相当于apache 的 combined 日志格式,如下所示:

log_format combined '$remote_addr - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent '
' "$http_referer" "$http_user_agent" ';

Nginx默认日志格式包含多个字段,每个字段都提供了有用的信息来帮助分析服务器行为。以下是一些常见字段及其含义:

  • $remote_addr: 客户端的IP地址
  • $remote_user: 客户端用户的名称
  • $time_local: 访问时间与时区
  • $request: 完整的HTTP请求行,包括请求方法、URI和协议
  • $status: 服务器响应的HTTP状态码
  • $body_bytes_sent: 发送给客户端的字节数,不包括响应头的大小
  • $http_referer: 客户端发送的HTTP Referer头部信息
  • $http_user_agent: 客户端发送的User-Agent头部信息

这些字段的组合可以提供全面的请求和响应信息,有助于分析用户行为和服务器性能。

如果 nginx 位于负载均衡器, squid, nginx 反向代理之后, web 服务器无法直接获取到客户端真实的 IP 地址了。
$remote_addr 获取反向代理的 IP 地址。反向代理服务器在转发请求的 http 头信息中,可以增加 X-ForwardedFor 信息,用来记录 客户端 IP 地址和客户端请求的服务器地址。 如下所示:

log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent '
' "$http_referer" "$http_user_agent" ';

2. 日志格式自定义实例

通过Nginx的access_log指令,管理员可以轻松自定义日志格式

具体log_format的语法如下:

log_format name [escape=default|json|none] string ...;

每一个日志格式都有一个名称,然后在配置access_log的时候可以指定用哪种格式来进行记录日志。log_format只能定义在http块中。查看在Nginx配置文件中的定义:

http {#可以定义多个log_format,名称只需要不一样即可log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
}server {access_log              /var/log/nginx/access.log main; # 注意这里的配置 error_log               /var/log/nginx/error.log;
}

如上在http块中定义了一个名称为main的日志格式,在server块中通过名称对该日志格式进行了引用,这样子日志的格式都会按找main中定义的一些属性来进行记录访问信息。

通过上边对日志格式和日志文件的一些了解,我们就可以非常容易的把日志的格式设置成JSON了,只需要定义一个log_format,把它的格式定义成一个json字符串,然后在打印日志的时候引用这个格式就可以实现了,下边是一个完成的定义文件:(可根据自己的需求定制)

第一种 程序友好型json格式:

log_format json escape=json '{''"time_iso8601": "$time_iso8601", ' # local time in the ISO 8601 standard format'"request_time": "$request_time", ' # request processing time in seconds with msec resolution'"status": "$status", ' # response status code'"body_bytes_sent": "$body_bytes_sent", ' # the number of body bytes exclude headers sent to a client'"bytes_sent": "$bytes_sent", ' # the number of bytes sent to a client'"remote_addr": "$remote_addr", ' # client IP'"remote_user": "$remote_user", ' # client HTTP username'"remote_port": "$remote_port", ' # client port'"request_uri": "$request_uri", ' # full path and arguments if the request'"args": "$args", ' # args'"request_id": "$request_id", ' # the unique request id'"connection": "$connection", ' # connection serial number'"connection_requests": "$connection_requests", ' # number of requests made in connection'"pid": "$pid", ' # process pid'"request_length": "$request_length", ' # request length (including headers and body)'"time_local": "$time_local", ''"http_referer": "$http_referer", ' # HTTP referer'"http_user_agent": "$http_user_agent", ' # user agent'"http_x_forwarded_for": "$http_x_forwarded_for", ' # http_x_forwarded_for'"http_host": "$http_host", ' # the request Host: header'"server_name": "$server_name", ' # the name of the vhost serving the request'"ssl_protocol": "$ssl_protocol", ' # TLS protocol'"ssl_cipher": "$ssl_cipher", ' # TLS cipher'"scheme": "$scheme", ' # http or https'"request_method": "$request_method", ' # request method'"server_protocol": "$server_protocol", ' # request protocol, like HTTP/1.1 or HTTP/2.0'"pipe": "$pipe", ' # "p" if request was pipelined, "." otherwise'"gzip_ratio": "$gzip_ratio", ''"http_cf_ray": "$http_cf_ray", ''"request_host": "$host", ''"is_completion": "$request_completion", ''"upstream": "$upstream_addr", ' # upstream backend server for proxied requests'"upstream_name": "$proxy_host", ' # upstream name'"upstream_status": "$upstream_status", ' # upstream status'"upstream_bytes_sent": "$upstream_bytes_sent", ' # upstream bytes sent'"upstream_bytes_received": "$upstream_bytes_received", ' # upstream bytes received'"upstream_connect_time": "$upstream_connect_time", ' # upstream handshake time incl. TLS'"upstream_header_time": "$upstream_header_time", ' # time spent receiving upstream headers'"upstream_response_time": "$upstream_response_time", ' # time spend receiving upstream body'"upstream_response_length": "$upstream_response_length", ' # upstream response length'"upstream_cache_status": "$upstream_cache_status", ' # cache HIT/MISS where applicable'"nginx_host": "$hostname"'
'}';

json格式对程序友好,配合ELK等日志采集、分析系统使用很方便,方便对日志进行深度分析。但是多数人平时比较喜欢直接查看日志文件,这时json格式的日志文件看起来就不够清晰了,日志较长,冗余信息较多,使用shell命令进行统计和分析也不方便。

{"time_iso8601": "2024-04-10T16:55:26+08:00", "request_time": "0.009", "status": "200", "body_bytes_sent": "397", "bytes_sent": "916", "remote_addr": "192.168.96.19", "remote_user": "", "remote_port": "8145", "request_uri": "/default_sso_heartbeat.html", "args": "", "request_id": "c002e29f30c5e85a01dc1927991a9175", "connection": "759864", "connection_requests": "1", "pid": "8459", "request_length": "1017", "time_local": "10/Apr/2024:16:55:26 +0800", "http_referer": "https://apollo.ownit.top/default_sso_heartbeat.html", "http_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", "http_x_forwarded_for": "", "http_host": "apollo.ownit.top", "server_name": "apollo.ownit.top", "ssl_protocol": "TLSv1.2", "ssl_cipher": "ECDHE-RSA-AES256-GCM-SHA384", "scheme": "https", "request_method": "GET", "server_protocol": "HTTP/1.1", "pipe": ".", "gzip_ratio": "", "http_cf_ray": "", "request_host": "apollo.ownit.top", "is_completion": "OK", "upstream": "192.168.102.40:80", "upstream_name": "kubernetes-cluster", "upstream_status": "200", "upstream_bytes_sent": "1100", "upstream_bytes_received": "880", "upstream_connect_time": "0.000", "upstream_header_time": "0.009", "upstream_response_time": "0.009", "upstream_response_length": "397", "upstream_cache_status": "", "nginx_host": "bt"}

第二种 运维友好型自定义格式:

log_format  main  escape=json'$remote_addr |$ipdb_raw |[$time_local] |$host |$request |$status |BodySent:$body_bytes_sent |ReqTime:$request_time |$request_completion |$http_x_forwarded_for |$proxy_host |$upstream_addr |$upstream_status |$upstream_cache_status |UpResTime:$upstream_response_time |UpConnTime:$upstream_connect_time |UpResLen:$upstream_response_length |$hostname-$request_id |$scheme |$request_body |$http_referer |$http_user_agent |$http_cookie';

这种格式使用“|”作为分隔符,日志打印也不是很长,方便使用AWK等命令进行统计

需注意以下几点:

  1. $ipdb_raw这个变量是ipip.net ip库的nginx模块,如果未使用这个模块会报错,去掉或换成GEOIP即可。
  2. escape=json 表示以json格式输出,高版本的Nginx已经支持json格式,对于第二种自定义格式,开启这个参数能在access log中打印中文,不会乱码
  3. $http_cookie是打印所有cookies,当然也可以打印session,对于高安全要求的情况,日志中不会允许泄漏用户cookies。但是某些情况需调试或打印非敏感的cookies,可以打印指定cookies,如打印nginx session sticky生产的cookies,假设名字叫backend: ‘TRACE:$cookie_backend’。
  4. $hostname-$request_id 如果有做全局调用链分析的需求,这个参数可以做为全局的UUID,nginx对每个请求都生成一个唯一的UUID,传给后端工程打印出来即可。

模块集成与扩展

通过集成第三方模块,如ngx_http_geoip_modulengx_http_log_module,可以进一步丰富日志信息。ngx_http_geoip_module允许在日志中添加客户端的地理位置信息,例如国家、城市等,这对于分析用户的地理分布非常有用。ngx_http_log_module则提供了灵活的日志配置选项,包括基于变量的日志记录和条件日志记录,使日志记录更加精细和高效。

请参考:

https://blog.csdn.net/fishinhouse/article/details/88966258
https://blog.csdn.net/zzhongcy/article/details/86214969

日志切割与管理

日志文件的定期滚动分割是日志管理中的一个重要方面。这可以通过设置定时任务(如使用cron)来实现,以定期执行日志切割操作,例如每天或每周切割一次日志文件。此外,还需要考虑日志的归档和安全存储,确保日志数据在保持可访问性的同时,不会因过时或安全问题而遭到破坏。使用如logrotate等工具可以帮助实现这些日志管理任务,保证日志数据的完整性和安全性。

通过深入探索这些策略,可以实现对Nginx服务器日志记录的精细化配置,从而为应用程序的监控和分析提供强大的支持

在Nginx的使用过程中,如果不对Nginx的日志做自定义的配置的话,那么默认的access.log日志默认就只有这么一个日志文件,随着系统使用时间越来越就,日志文件就会越来越大,而且默认的日志记录的格式也不方便分析。所以我们在实际使用Nginx的过程中需要对其日志做一些配置。
http配置块中进行配置,也可以在每个server块中配置不同的access_log用以区分

http{# 定义一个变量来存储年月日  map $time_iso8601 $date {  default "date-not-found";  '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;}  # 定义一个变量来存储时分秒  map $time_iso8601 $time {  default "time-not-found";  '~T(?<hms>\d{2}:\d{2}:\d{2})' $hms;}# 定义日志格式为json格式log_format json_format '{  "timestamp": "$date $time",  "remote_addr": "$remote_addr",  "remote_user": "$remote_user",  "request": "$request",  "status": "$status",  "body_bytes_sent": "$body_bytes_sent",  "http_referer": "$http_referer",  "http_user_agent": "$http_user_agent",  "http_x_forwarded_for": "$http_x_forwarded_for"  
}';# 定义一个变量来存储年月,可用来作为access.log的日志文件名,按月自动分割日志map $time_iso8601 $logmonth {  '~^(?<ym>\d{4}-\d{2})' $ym;  default 'date-not-found';  }# 定义一个变量来存储年月日,可用来作为access.log的日志文件名,按天自动分割日志map $time_iso8601 $logdate {  '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;  default 'date-not-found';  }# 开启access.log日志,可设置日志名变量(这里选择上面的按天)以便分割日志;可设置日志格式,以便更直观分析日志access_log logs/access-$logdate.log json_format;
}

Nginx的日志常见配置项

$args                    #请求中的参数值
$query_string            #同 $args
$arg_NAME                #GET请求中NAME的值
$is_args                 #如果请求中有参数,值为"?",否则为空字符串
$uri                     #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
$document_uri            #同 $uri
$document_root           #当前请求的文档根目录或别名
$host                    #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称
$hostname                #主机名
$https                   #如果开启了SSL安全模式,值为"on",否则为空字符串。
$binary_remote_addr      #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent         #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent              #传输给客户端的字节数
$connection              #TCP连接的序列号
$connection_requests     #TCP连接当前的请求数量
$content_length          #"Content-Length" 请求头字段
$content_type            #"Content-Type" 请求头字段
$cookie_name             #cookie名称
$limit_rate              #用于设置响应的速度限制
$msec                    #当前的Unix时间戳
$nginx_version           #nginx版本
$pid                     #工作进程的PID
$pipe                    #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr     #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root           #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr             #客户端地址
$remote_port             #客户端端口
$remote_user             #用于HTTP基础认证服务的用户名
$request                 #代表客户端的请求地址
$request_body            #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file       #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传 递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion      #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename        #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length          #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method          #HTTP请求方法,通常为"GET"或"POST"
$request_time            #处理客户端请求使用的时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$request_uri             #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme                  #请求使用的Web协议,"http" 或 "https"
$server_addr             #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name             #服务器名
$server_port             #服务器端口
$server_protocol         #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
$status                  #HTTP响应代码
$time_iso8601            #服务器时间的ISO 8610格式
$time_local              #服务器时间(LOG Format 格式)
$cookie_NAME             #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
$http_NAME               #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",$http_accept_language即可
$http_cookie
$http_host               #请求地址,即浏览器中你输入的地址(IP或域名)
$http_referer            #url跳转来源,用来记录从那个页面链接访问过来的
$http_user_agent         #用户终端浏览器等信息
$http_x_forwarded_for
$sent_http_NAME          #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location
$sent_http_transfer_encoding

Nginx之间的日志追踪

在当今互联网架构中,Web应用防火墙(WAF)与Nginx作为前端代理的整合越来越常见,特别是在提升Web应用程序的安全性方面。这种结构不仅增强了对应用的保护,还提升了系统的整体性能。在这种架构中,理解WAF与Nginx如何协作,以及如何实现日志追踪的整合尤为重要。

WAF与Nginx协作原理

WAF通常作为Nginx的上游组件部署,拦截向Web应用程序发起的请求。它的主要作用是评估每个请求中的潜在威胁,如SQL注入、跨站脚本(XSS)等,然后根据预定义的规则集来决定是否允许请求通过。通过与Nginx的紧密协作,WAF能够在请求到达应用服务器之前提供一层额外的保护。

在请求和响应过程中,WAF与Nginx之间的交互涉及到请求的接收、分析、处理和转发。当WAF检测到潜在威胁时,可以决定直接阻止该请求,或者将其转发给Nginx进行进一步的处理。

日志集成挑战与解决方案

在将WAF与Nginx整合进一致性和可追溯性的日志系统时,面临的挑战主要包括跨组件的日志同步和关联。日志记录需要从WAF到Nginx,再到应用服务器,形成一个连续的链路,以确保对整个请求-响应周期的完全可见性。

为了解决这一挑战,一种方法是在所有组件中使用统一的日志ID。通过在HTTP头部插入一个唯一的跟踪标识符,例如通过X-Request-ID,可以跨多个系统跟踪单个请求,从而简化日志数据的关联和分析。

用户访问流程日志分析

总结:阿里云的WAF日志更加详细,Nginx层面的日志也是WAF过来的(数据一样的)

下方三个截图的数据日志,就是一条的请求的访问。数据都是一样的,各个层面都有日志记录。毫无疑问 WAF更加专业 ,图像化更多。
在这里插入图片描述
阿里云的WAF
在这里插入图片描述
Nginx中转

server {listen       80;server_name  bd.xxx.com ;rewrite ^/(.*)$ https://$host/$1 permanent;
}
server {listen       443 ssl;server_name  bd.xxx.com;ssl                   on;ssl_certificate      /usr/local/openresty/nginx/ssl/xx.com.crt;ssl_certificate_key  /usr/local/openresty/nginx/ssl/xxx.com.key;include ssl.conf;location / {proxy_pass  http://172.18.199.115:8085;include https_proxy.conf;}
}

在这里插入图片描述
Nginx前端
前端机器:172.18.199.115

server {listen       8085;server_name  bd.xxxx.com;root   /opt/mfbd/dist;index  index.html index.htm;location / {try_files $uri /index.html;add_header Access-Control-Allow-Origin *;  add_header Access-Control-Allow-Headers Content-Type;  add_header Access-Control-Allow-Methods GET,POST,OPTIONS;  add_header Access-Control-Allow-Credentials true; }
}

在这里插入图片描述
在这里插入图片描述

日志分析与可视化

利用自定义日志数据进行日志分析与可视化是提高安全性和响应能力的关键。通过集成SIEM工具、ELK栈(Elasticsearch、Logstash、Kibana)或其他日志分析平台,可以对日志数据进行实时监控、异常检测和攻击行为分析。这些工具能够帮助团队快速识别并响应安全威胁,同时提供直观的数据可视化,以便深入理解和改进安全策略。

综上所述,WAF与Nginx前端代理的整合不仅加强了Web应用的安全层,而且通过有效的日志追踪和分析,为团队提供了关键的洞察,以持续改进安全姿态和响应能力。

参考文档:

https://www.cnblogs.com/ouym/p/15393191.html

https://www.iminling.com/2023/10/04/272.html

https://opswill.com/articles/nginx-custom-access-log-format.html

相关文章:

Nginx日志格式化和追踪

背景 Nginx是一款功能强大的Web服务器&#xff0c;对于网络环境中的日志记录和配置至关重要。定制化Nginx日志格式可以帮助管理员更好地监控服务器性能、分析用户行为并做出相应优化。在本文中&#xff0c;我们将深入探讨Nginx日志格式的高级定制化策略&#xff0c;包括理解基…...

华为交换机配置telnet SSH登录步骤

这次项目中的交换机是华为 S5735-L24T4X 需要配置telnet和 SSH登录 在平时项目中发现&#xff0c;华为不同型号&#xff0c;不同版本的配置命令也是不同&#xff0c;&#xff08;这不是脑子有问题吗&#xff1f; 干啥搞成不一样的&#xff09; 本次型号&#xff1a;S5735-L2…...

市面上加密混淆软件的比较和推荐

引言 市面上有许多加密混淆软件可供开发者使用&#xff0c;但哪些软件是最好用的&#xff1f;哪些软件受到开发者的喜爱&#xff1f;本文将根据一次在CSDN上的投票结果&#xff0c;为大家介绍几款在程序员中普及度较高的加密软件。以下是投票结果&#xff0c;希望能对大家的选择…...

最新AI创作系统ChatGPT网站源码AI绘画,GPTs,AI换脸支持,GPT联网提问、DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…...

电视盒子哪个好?2024口碑网络电视盒子排行榜

多年来电视盒子始终占据重要地位&#xff0c;功能上并没有受到影响。在这么多品牌中哪些电视盒子的评价是最好的呢&#xff1f;小编根据各大电商平台的用户评价情况整理了口碑最好的网络电视盒子排行榜&#xff0c;跟着小编一起看看市面上的电视盒子哪个好吧。 TOP 1&#xff1…...

CookieSession

目录 什么是会话 一.Cookie 1.Cookie介绍 2.Cookie的作用 3.Cookie的基本使用 4.Cookie生命周期 5.Cookie有效路径 6.注意事项 二.Session 1.Session基本原理 2 Session的作用 3.Session的基本使用 4.Session底层实现机制 5.Session生命周期 什么是会话 Cookie和S…...

Nginx服务 重写功能与反向代理

六、重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c;此功能依靠 PCRE(perl compatible regular expression)&#xff0c;因此编译之前要安装PCRE库&#xff0c;rewrite是nginx服务器的重要功能之一&#xff0c;用于实现URL的…...

Midjourney教程(完整版)-看这篇就够了

Midjourney使用指南 - 订阅计划费用比较 Midjourney 具有三个订阅版本。按月或全年支付可享受 20% 的折扣。每个订阅计划都包括访问 Midjourney 图库、官方 Discord、一般商业使用条款等。 如何订阅 使用该/subscribe命令生成指向订阅页面的个人链接。 或者&#xff0c;转到Mi…...

服务器上部署GPU版的milvus向量数据库

1、安装docker compose 我们可以从 Github 上下载它的二进制包来使用&#xff0c;最新发行的版本地址&#xff1a; https://github.com/docker/compose/releases sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-$(uname -s)…...

【配置】Docker安装可道云网盘

环境 一台云服务器&#xff0c;centos8&#xff0c;必须安装docker Docker安装 1、卸载旧版 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2、需要的安装包 yum ins…...

复盘中得道,技术人的自由之路

从今天开始&#xff0c;后面会推出一个系列&#xff0c;也就是「复盘中得道&#xff0c;技术人的自由之路」。 如果再给我一次机会&#xff0c;我会这样规划我的成长路线&#xff0c;实现职业自由、财富自由、身心自由。 如果你站在童年的位置瞻望未来&#xff0c;你会说你前…...

Nginx配置大全【六大使用场景、七大负载均衡策略、四大负载健康检查】

目录 基础配置信息应用场景一&#xff1a;配置web服务器应用场景二&#xff1a;反向代理服务器应用场景三&#xff1a;URL重定向应用场景四&#xff1a;防盗链应用场景五&#xff1a;根据设备类型重定向/代理/访问 不同域名/资源应用场景六&#xff1a;&#xff01;负载均衡服务…...

GDPU Java 天码行空8

文章目录 &#xff08;一&#xff09;实验目的&#xff08;二&#xff09;实验内容和步骤1、LinkedList 实现队列&#x1f496; MyQueueDemo.java&#x1f496; 运行结果&#xff1a; 2、集合的嵌套遍历&#x1f496; StudentDemo.java&#x1f496; 运行结果&#xff1a; 3、类…...

《前端面试题》- JS基础 - 伪数组

第一次听说伪数组这个概念&#xff0c;听到的时候还以为是说CSS的伪类呢&#xff0c;网上一查&#xff0c;这东西原来还是个很常见的家伙。 何为伪数组 伪数组有两个特点&#xff1a; 具有length属性&#xff0c;其他属性&#xff08;索引&#xff09;为非负整数但是却不具备…...

TypeScript 基础语法

文章目录 1. 类型注解2. 接口&#xff08;Interfaces&#xff09;3. 类&#xff08;Classes&#xff09;4. 泛型&#xff08;Generics&#xff09;5. 枚举&#xff08;Enums&#xff09;6. 高级类型7. 模块8. 装饰器&#xff08;Decorators&#xff09;9. 映射类型&#xff08;…...

服务器数据恢复—V7000存储raid5数据恢复案例

服务器数据恢复环境&#xff1a; P740AIXSybaseV7000存储阵列柜&#xff0c;阵列柜上有12块SAS机械硬盘&#xff08;包括1块热备盘&#xff09;。 服务器故障&#xff1a; 管理员在日常巡检过程中发现阵列柜中有一块磁盘发生故障&#xff0c;于是更换磁盘并同步数据&#xff0…...

扫雷 【搜索,哈希】

9.扫雷 - 蓝桥云课 (lanqiao.cn) #include<bits/stdc.h> using namespace std; #define int long long const int N1e5100; int n,m,res0; struct pt{int x,y,r; }; typedef pair<int,int> pii; map <pii,int> a;//炸雷的map,键是x,y,值是r map <pii,int&…...

如何在CentOS安装Firefox并结合内网穿透工具实现公网访问本地火狐浏览器

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…...

LlamaIndex 组件 - Loading

文章目录 一、概览加载Transformations将所有内容放在一起抽象 二、文档/节点概览1、概念2、使用模式文件节点 三、定义和定制文档1、定义文档2、自定义文档2.1 元数据2.2 自定义id2.3 高级 - 元数据定制1&#xff09;自定义LLM元数据文本2&#xff09;自定义嵌入元数据文本3&a…...

再见了 wordpress !又一款简洁实用的个人博客,简单好使【文末领福利】

最近想搭一个简单的博客&#xff0c;不想要 wordpress 这类那么臃肿的系统&#xff0c;于是开源站找了下&#xff0c;看看有没有搭建简单&#xff0c;又好使的博客系统。于是还真找到了一个项目 -- VanBlog 简介 VanBlog 是一款简洁优雅的个人博客系统&#xff0c;它拥有很好性…...

【经典算法】LeetCode 136:只出现一次的数字(Java/C/Python3实现含注释说明,Easy)

个人主页&#xff1a; 进朱者赤 阿里非典型程序员一枚 &#xff0c;记录平平无奇程序员在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法&#xff08;公众号同名&#xff09; 目录 题目描述思路及实现方式一&#xff1a;使用异或运算&#xff08;推荐&#xff09;思…...

ST-LINK Utility 4.6.0 下载安装及使用方法介绍

一、介绍 STM32 ST-LINK Utility是针对STM32全系芯片进行编程&#xff08;读、写、擦除、选项字&#xff09;的一款工具。 STM32 ST-LINK Utility软件主要的功能就是量产&#xff08;批量下载代码的工具&#xff09;。它也是比较实用的一个工具&#xff0c;当我们需要查看芯片F…...

【教程】cocos2dx资源加密混淆方案详解

1,加密,采用blowfish或其他 2,自定是32个字符的混淆code 3,对文件做blowfish加密,入口文件加密前将混淆code按约定格式(自定义的文件头或文件尾部)写入到文件 4,遍历资源目录,对每个文件做md5混淆,混淆原始串“相对路径”“文件名”混淆code, 文件改名并且移动到资源目录根…...

【Altium Designer 20 笔记】PCB板框

Altium Designer中设置PCB板框 PCB板框位于Mechanical1层 点击放置中的线条或使用其他绘图工具来绘制板框, 可以绘制矩形、圆形或其他形状的板框,确保板框是闭合的 注意&#xff1a;在绘制板框时&#xff0c;确保线条的起点和终点相连&#xff0c;形成一个闭合的图形。 快捷键D…...

el-date-picker限制只能选择当前时间前/后的时间(包含日期、时、分)

限制只能选择当前时间前/后的时间&#xff08;包含日期、时、分&#xff09; 首先需要给添加一个属性picker-options属性,然后在data中定义这个pickerOptions属性。 <el-date-pickerv-model"saveForm.startTime":picker-options"pickerOptions"format…...

MySQL 5.7 重置root用户密码

MySQL 5.7 重置root用户密码 如果你忘记了 MySQL 5.7 的 root 用户密码&#xff0c;可以按照以下步骤来重置密码&#xff1a; 1、停止 MySQL 服务。 # systemctl stop mysql.service 2、进入MySQL服务的安全启动模式 # mysqld_safe --skip-grant-tables &3、连接到 MyS…...

分布式数据库Polardb-X架构及特点

PolarDB-X架构 计算节点&#xff08;Compute Node&#xff0c;CN&#xff09;是系统的入口&#xff0c;采用无状态设计的sql引擎提供分布式路由和计算&#xff0c;包括SQL解析器、优化器、执行器等模块。负责数据分布式路由、计算及动态调度&#xff0c;负责分布式事务2PC协调…...

【spring】@Resource注解学习

Resource介绍 在Spring框架中&#xff0c;Resource 注解是一个JSR-250标准注解&#xff0c;用于自动装配&#xff08;autowiring&#xff09;Spring容器中的bean。Resource 注解可以用于字段、方法和方法参数上&#xff0c;以声明依赖注入。 Resource源码 Target({TYPE, FIE…...

【leetcode面试经典150题】43. 字母异位词分组(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…...

计算机网络 Cisco路由器基本配置

一、实验内容 1、按照下表配置好PC机IP地址和路由器端口IP地址 2、配置好路由器特权密文密码“abcd&#xff0b;两位班内序号”和远程登录密码“star” 3、验证测试 a.验证各个接口的IP地址是否正确配置和开启 b.PC1 和 PC2 互ping c.验证PC1通过远程登陆到路由器上&#…...

网站主持人制作网站代言人/网页广告调词平台

MyBatis逆向工程1、什么是MyBatis逆向工程2、逆向工程的使用2.1、创建工程2.2、pom依赖2.3、配置文件2.4、生成程序2.5、测试3、逆向工程的优缺点1、什么是MyBatis逆向工程 按照普通的模式&#xff0c;我们建立完数据表之后&#xff0c;需要手动建立与表对应的实体pojo类&…...

wordpress google ajax/淘宝关键词top排行榜

1、项目目的&#xff1a; 本项目主要通过编写贪吃蛇游戏来学习&#xff0c;熟悉Qt中封装的类。 2、编译环境 VS2019Qt5.9 3、功能实现 主要实现下面所列基本功能&#xff1a; 控制贪吃蛇吃食物 表示蛇控制贪吃蛇上下左右移动控制食物的随机分配控制蛇的增长 暂停游戏结束…...

请选择一个网站制作软件/百度 搜索热度

总是会在QQ群里听到初学者或者还未入门的朋友们问诸如“编程好学么”、“学编程对英语要求高么”等等这样的问题。很清楚问这些问题的人们的想法&#xff0c;如果编程很难学那我就不必花时间学了&#xff0c;免得浪费时间&#xff0c;如果编程对英文的要求很高&#xff0c;但我…...

网站开发的比较/百度用户服务中心

Pandora FMS 是一个 开源的应用程序 &#xff0c;用来监测网站的各种活动,它可以收到实时的监测报告&#xff0c;并发送到你指定的邮箱&#xff0c;也可以通过e-mail&#xff0c; SMS 发送。 更多Linux下的监控软件请关注《Linux企业应用案例精解》一书本文出自 “李晨光原创技…...

福州商城网站开发公司/网站代搭建维护

●考研“大小年”是什么&#xff1f;●考研“大年”&#xff0c;就是指某学校或专业在某年内特别火&#xff0c;报考人数特别多&#xff0c;分数线也随之升高&#xff0c;这年就是它的“大年”。小年&#xff0c;就是由于报考人数少&#xff0c;分数线降低。“大年”和“小年”…...

聊城设计网站/网络营销论坛

1. 应用需求 在权限系统开发中除了以上数据表关系的设计之外&#xff0c;比较麻烦的地方是级联模块在页面的展示&#xff0c;由于设计中最多是控制到三级&#xff0c;因此三级级联模块的展示、编辑等页面操作是需要解决的问题&#xff0c;这里采用KendoUi中的KendoDropDown…...