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

Nginx--代理与负载均衡(扩展nginx配置7层协议及4层协议方法、会话保持)

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除

一、代理原理

1、反向代理产生的背景

单个服务器的处理客户端(用户)请求能力有一个极限,当接入请求过多时,会造成服务器繁忙,可以使用多个服务器来共同分担成千上万的用户请求,这些服务器提供相同的服务,但对用户来说,感觉不到任何区别。

2、反向代理服务的实现

需要有一个负载均衡设备(即反向代理服务器)来分发用户请求,将用户请求分发到空闲的服务器上。服务器返回自己的服务到负载均衡设备。负载均衡设备将服务器返回用户。

3、正/反向代理的区别

正向代理代理客户端,正向代理的过程隐藏了真实的请求客户端,服务器不知道真实的客户端是谁,客户端的服务都被代理服务器代替请求

反向代理代理服务端,反向代理的过程隐藏了真实的服务器,客户端不知道真正提供服务的是谁,客户端请求的服务都被代理服务器接收

4、知识扩展

4.1、HTTP Server和Application Server的区别和联系

Apache/nignx是静态服务器(HTTP Server)

  • Nginx优点负载均衡、反向代理、处理静态文件优势。nginx处理静态请求的速度高于apache;
  • Apache优点:相对于Tomcat服务器来说处理静态文件是它的优势,速度快。Apache是静态解析, 适合静态HTML、图片等

HTTP Server 关心的是 HTTP 协议层面的传输和访问控制,所以在 Apache/Nginx 上你可以看到代理、负载均衡等功能

HTTP ServerNginx/Apache常用做静态内容服务和代理服务器,将外来请求转发给后面的应用服务(tomcat,jboss,jetty等)。

应用服务器tomcat/jboss/jetty)是动态服务器(Application Server)

应用服务器Application Server,则是一个应用执行的容器。它首先需要支持开发语言的 Runtime (对于 Tomcat 来说,就是 Java,若是Ruby/Python 等其他语言开发的应用也无法直接运行在Tomcat 上)。

4.2、 应用服务器与HTTP服务器的集成与协同工作

应用服务器(如tomcat)往往也会集成 HTTP Server 的功能,nginx也可以通过模块开发来提供应用功能,只是不如专业的 HTTP Server 那么强大,所以应用服务器往往是运行在 HTTP Server 的背后,执行应用,将动态的内容转化为静态的内容之后,通过 HTTP Server分发到客户端

4.3、常用软硬件

常用开源集群软件有:lvs,keepalived,haproxy,nginx,apache,heartbeat

常用商业集群硬件有:F5, Netscaler,Radware,A10

二、Nginx Proxy配置

1、代理模块

1.1、代理配置

 # ----------------代理--------------------#Syntax: proxy_pass URL; #代理的后端服务器URLDefault: —Context: location, if in location, limit_except​# ---------------缓冲区--------------------#Syntax: proxy_buffering on | off;Default: proxy_buffering on;    #缓冲开关Context: http, server, locationproxy_buffering # 开启的情况下,nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端(边收边传,不是全部接收完再传给客户端)。Syntax: proxy_buffer_size size;Default: proxy_buffer_size 4k|8k; #缓冲区大小Context: http, server, locationSyntax: proxy_buffers number size;Default: proxy_buffers 8 4k|8k; #缓冲区数量Context: http, server, locationSyntax: proxy_busy_buffers_size size;Default: proxy_busy_buffers_size 8k|16k;#忙碌的缓冲区大小控制同时传递给客户端的buffer数量Context: http, server, location​# ----------------头信息--------------------#Syntax: proxy_set_header field value;Default: proxy_set_header Host $proxy_host; #设置真实客户端地址proxy_set_header Connection close;Context: http, server, location​# ----------------超时--------------------#Syntax: proxy_connect_timeout time;Default: proxy_connect_timeout 60s; #链接超时Context: http, server, location​Syntax: proxy_read_timeout time;Default: proxy_read_timeout 60s;Context: http, server, location​Syntax: proxy_send_timeout time; #nginx进程向fastcgi进程发送request的整个过程的超时时间Default: proxy_send_timeout 60s;Context: http, server, location

1.2、buffer/缓冲区工作原理

  1. 缓冲区分配:每个请求都有自己的缓冲区,这些缓冲区不是全局的,而是针对每个请求的。
  2. 缓冲开关:proxy_buffering用于控制是否开启代理服务器的响应缓冲。只有开启时,proxy_buffers和proxy_busy_buffers_size参数才会生效。
  3. 主缓冲区:无论proxy_buffering是否开启,proxy_buffer_size设置的主缓冲区始终工作,用于存储上游服务器响应的头部信息。
  4. 数据读取与传输
    • 在proxy_buffering开启的情况下,Nginx会尝试将上游服务器的所有数据读入缓冲区,直到所有proxy_buffers被填满或数据结束。

    • 数据开始向客户端传输,同时Nginx继续接收数据并可能将其写入临时文件,由proxy_max_temp_file_size控制大小。

    • 如果响应内容很大,Nginx会从临时文件继续读取数据,直到传输完成。

  5. 忙碌缓冲区:一旦proxy_buffers中的缓冲区被填满,它们就会处于忙碌状态,直到其中的数据完全传输给客户端。忙碌缓冲区的总大小不能超过proxy_busy_buffers_size,这个参数用来控制同时向客户端传输的缓冲区数量。

2、代理实验

2.1、环境准备

角色
nginx-1:10.0.0.2网站服务器
nginx-2:10.0.0.3代理服务器

2.2、nginx-1启动网站

 [root@centos ~]# cat /usr/share/nginx/html/index.html This is proxy test![root@centos ~]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@centos ~]# nginx -s reload

2.3、nginx-2启动代理程序

 [root@centos ~]# cat /etc/nginx/conf.d/default.conf server {listen 80;server_name localhost;location / {proxy_pass http://10.0.0.2:80;   # 真实服务器地址:IP/域名proxy_redirect default;  # 代理后的URL重定向行为,默认情况下不进行重定向proxy_set_header Host $http_host;    # 转发请求时使用原始请求中的Host头proxy_set_header X-Real-IP $remote_addr; # X-Real-IP头:客户端IP地址#proxy_set_header REMOTE-HOST $remote_addr; # REMOTE-HOST:客户端IP地址proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 跟踪请求经过的代理服务器proxy_connect_timeout 30;    # 与后端服务器建立连接的超时时间   proxy_send_timeout 60;       # 向后端服务器发送请求的超时时间   proxy_read_timeout 60;       # 从后端服务器读取响应的超时时间   proxy_buffering on;          # 开启响应缓冲,可以提高代理性能proxy_buffer_size 32k;       # 缓冲区的大小proxy_buffers 4 128k;        # 缓冲区的数量和大小proxy_busy_buffers_size 256k;    # 忙碌缓冲区的大小proxy_max_temp_file_size 256k;   # 临时文件的最大大小}}[root@centos ~]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@centos ~]# nginx -s reload

2.4、浏览器访问

(1)使用PC客户端访问nginx-2服务器地址

成功访问nginx-1服务器页面

(2)客户端配置路由映射

若想使用域名进行访问,在 C:\Windows\System32\drivers\etc\hosts 文件中添加一行 | (linux:/etc/hosts)

 # 主机IP 配置的域名10.0.0.3 www.test.com

(3)、观察nginx-1服务器的日志
 [root@centos ~]# cat /var/log/nginx/access.log10.0.0.3 - - [09/Aug/2024:18:41:08 +0800] "GET /favicon.ico HTTP/1.0" 404 555 "http://10.0.0.3/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36" "10.0.0.1"​# 10.0.0.3:代理服务器地址# 10.0.0.1:客户机地址

访问成功。记录了客户机的IP和代理服务器的IP

三、负载均衡

1、负载均衡的作用

在计算机的世界里,负载均衡就是让多个服务器或者网络资源来分担工作,这样即使某个服务器或者资源很忙或者出现问题,其他的服务器或资源还可以继续工作,保证整个系统的稳定和效率

下面的配置是解决方案之一

 proxy_connect_timeout 1; #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒  proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒  

proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒  

proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否中断对被代理服务器的请求。默认为off

使用upstream指令配置一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理

 proxy_next_upstream timeout; #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。  error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off

  • error:建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误
  • timeout:建立连接,想被代理服务器发送请求或读取响应信息时服务器发生超时
  • invalid_header:被代理服务器返回的响应头异常
  • off:无法将请求分发给被代理的服务器
  • http_400,...:被代理服务器返回的状态码为400,500,502等

2、Nginx负载均衡组件模块

实现Nginx负载均衡的组件主要有两个:

  • ngx_http_upstream_module:负载均衡模块;实现网站的负载均衡功能以及节点的健康检查
  • ngx_http_proxy_module:proxy代理模块;用于把请求转发给服务器节点或upstream服务器池

2.1、upstream模块

(1)模块介绍

upstream模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应upstream组的名字上,具体写法为:

 proxy_pass http://server_pools

server_pools就是一个upstream节点服务器组名字

(2)upstream配置示例
upstream server_pool {server 10.0.0.2;	# 默认80端口server 10.0.0.3;
}
(3)upstream模块参数
参数说明
server负载后面的RS配置,可以是ip或者域名
weight请求服务器的权重。默认值为1,越大表示接受的请求比例越大
max_failsnginx 尝试连接后端主机失败的次数,需要配合proxy_net_upstreamfastcgi_next_upstreammemcached_next_upstream这三个参数来使用
fail_timeoutmax_fails定义的失败次数后,距离下次检查的时间间隔,默认10s
backup热备配置,标志这台服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求
down表示这个服务器永不可用,可配合ip_hash使用

下面给出一个示例:

upstream web_pools {server linux.example.com weight=5;
server 127.0.0.1:8080 max_fail=5 fail_timeout=10s;
# 当5次连续检查失败后,间隔10s后重新检测。
server linux.example.com:8080 backup;
# 指定备份服务器。作用:等上面服务器全部不可访问时就向它转发请求。}

2.2、http_proxy_module模块

(1)proxy_pass指令介绍

proxy_pass指令属于ngx_http_proxy_module模块,此模块可以将请求转发到另一台服务器上。在实际的反向代理工作中,会通过location功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池

(2)http proxy模块参数
参数说明
proxy_set_header设置http请求header项传给后端服务器节点
client_body_buffer_size指定客户端请求主题缓冲区大小
proxy_connect_timeout表反向代理与后端节点服务器连接的超时时间,即发起握手等候响应的超时时间
proxy_send_timeout表示代理后端服务器的数据回传时间,即在规定时间之内,后端服务器必须传完所有的数据,否则,nginx将断开这个连接
proxy_read_timeout设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,nginx等待后端服务器的响应时间,其实是nginx在后端排队等候处理的时间
proxy_buffer_size设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小
proxy_buffers设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息,会放置在缓冲区
proxy_busy_buffers_size用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy_bufer*2
proxy_temp_file_write_size指定proxy缓存临时文件的大小

3、负载均衡算法

upstream支持4种负载均衡调度算法:

4.1、rr轮询(默认)

默认调度算法,每个请求按时间顺序逐一分配到不同的后端服务器,宕机的服务器会自动从节点服务器池中剔除。

upstream server_pool {server 10.0.0.2;server 10.0.0.2;
}

注意:对于服务器性能不同的集群,该算法容易引发资源分配不合理等问题

4.2、wrr加权轮询(weight)

在rr轮询算法的基础上加上权重,权重和用户访问成正比,权重值越大,被转发的请求也就越多

upstream server_pool {server 10.0.0.2 weight=5;server 10.0.0.2 weight=10;
}

加权轮询应用于服务器性能不等的集群中,使资源分配更加合理化

4.3、ip_hash(会话保持)

每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题

upstream server_pool {ip_hash;server 10.0.0.2;server 10.0.0.2;
}

4.4、fair(动态调度算法)

此种算法根据后端服务器的响应时间来分配请求,响应时间短的优先分配。 Nginx 本身是 不支持 fair 的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair 模块

upstream server_pool {server 10.0.0.2;server 10.0.0.2;fair;
}

4.5、url_hash算法(web缓存节点)

根据访问URL的hash结果来分配请求,让每个URL定向到同一个后端服务器, 同样,Nginx本身是不支持url_hash,如果需要使用这种调度算法,必须安装Nginx的hash模块软件包。

upstream server_pool {server 10.0.0.2;		# 指定后端服务器的地址和端口server 10.0.0.2;hash $request_uri;		# 使用哈希方法来分配请求并使用请求的URI作为哈希的键hash_method crc32;		# 使用CRC32算法来计算哈希值
}

4、Nginx负载均衡配置示例

4.1、实现效果

在浏览器输入http://testapp.com,实现负载均衡效果(平均访问到两台服务器)

4.2、环境准备

这边使用两台服务器以及一台负载均衡器

主机名IP地址角色
centos-110.0.0.2nginx服务器
centos-210.0.0.3nginx服务器
centos-310.0.0.4nginx 负载均衡服务器

4.3、三台服务器均安装Nginx

4.4、配置用于测试的nginx首页

为了更便于观察到负载均衡实现出的效果,下面为两台服务器编写不同的首页文件

# 配置文件参数默认即可,下面修改首页测试文件
[root@centos-1 ~]# cat /usr/share/nginx/html/index.html 
My domain IP is 10.0.0.2[root@centos-2 ~]# cat /usr/share/nginx/html/index.html 
My domain IP is 10.0.0.3
[root@centos ~]# nginx -s reload
# nginx服务别忘记启动

4.5、配置nginx负载均衡服务器

[root@centos-3 ~]# cat /etc/nginx/conf.d/default.conf 
upstream testapp {server 10.0.0.2:80;server 10.0.0.3:80;
}
server {listen       80;server_name  localhost;location / {proxy_pass http://testapp;}
}

4.6客户端配置路由映射

因为使用域名进行访问,在 C:\Windows\System32\drivers\etc\hosts 文件中添加一行 | (linux:/etc/hosts)

# 主机IP 配置的域名
10.0.0.4 www.testapp.com

4.7、浏览器访问

不断刷新会发现所有请求被负载均衡器(10.0.0.4)均分配到10.0.0.2和10.0.0.3服务器上,实现了负载均衡的效果

四、Nginx配置7层协议及4层协议方法(扩展)

1、7层协议

OSI(Open System Interconnection)是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范,共包含七层协议

2、4层协议

TCP/IP协议

之所以说TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。

从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层

3、协议配置

在nginx做负载均衡,负载多个服务,部分服务是需要7层的,部分服务是需要4层的,也就是说7层和4层配置在同一个配置文件中

3.1、环境准备

在这同样使用第三点负载均衡中的机器环境

3.2、配置代理服务器的nginx配置文件实现7层协议

使用负载均衡来分发请求到多个上游服务器,编辑/etc/nginx/nginx.conf

worker_processes 4;
worker_rlimit_nofile 102400;
events {worker_connections 1024;
}
http {include 		mime.types;default_type 	application/octet-stream;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;sendfile on;keepalive_timeout 65;gzip on;# 定义两个上游服务器组,testweb和testapp,用于负载均衡upstream testweb {ip_hash;server 10.0.0.2:80 weight=2 max_fails=2 fail_timeout=2s;server 10.0.0.3:80 weight=2 max_fails=2 fail_timeout=2s;}server {listen 80;server_name www.test.com;charset utf-8;#access_log logs/host.access.log main;location / {proxy_pass http://testweb;proxy_set_header Host $host:$server_port;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}upstream testapp {server 10.0.0.2:8081 weight=2 max_fails=2 fail_timeout=2s;server 10.0.0.3:8081 weight=2 max_fails=2 fail_timeout=2s;}server {listen 81;server_name www.app.com;charset utf-8;#access_log logs/host.access.log main;location / {proxy_pass http://testapp;proxy_set_header Host $host:$server_port;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
}

3.3、4层协议配置

在使用yum安装的nginx版本大于1.9.0的时候,增加了一个stream模块,来实现4层协议(网络层和传输层)的转发、代理、负载均衡等。stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听,然后通过proxy_pass来转发我们的请求,通过upstream添加多个后端服务,实现负载均衡。

stream {upstream myweb {hash $remote_addr consistent;server 172.17.14.2:8080;server 172.17.14.3:8080;}server {listen 82;proxy_connect_timeout 10s;proxy_timeout 30s;proxy_pass myweb;}
}

五、Nginx会话保持

1、ip_hash

这个上述介绍过;ip_hash使用源地址哈希算法,将同一客户端的请求总是发往同一个后端服务器,除非该服务器不可用

upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com down;
}

ip_hash简单易用,但有如下问题:

  • 当后端服务器宕机后,session会丢失;
  • 来自同一局域网的客户端会被转发到同一个后端服务器,可能导致负载失衡;
  • 不适用于CDN网络,不适用于前段还有代理的情况。

2、sticky_cookie_insert

使用sticky_cookie_insert启用会话亲缘关系,这会导致来自同一客户端的请求被传递到一组服务器的同一台服务器。与ip_hash不同之处在于,它不是基于IP来判断客户端的,而是基于cookie来判断。因此可以避免上述ip_hash中来自同一局域网的客户端和前段代理导致负载失衡的情况。(需要引入第三方模块才能实现)

upstream backend {server backend1.example.com;server backend2.example.com;sticky_cookie_insert srv_id expires=1h domain=3evip.cn path=/;
}
# expires:设置浏览器中保持cookie的时间
# domain:定义cookie的域
# path:为cookie定义路径

3、jvm_route方式

jvm_route是通过session_cookie这种方式来实现session粘性。将特定会话附属到特定tomca上,从而解决session不同步问题,但是无法解决宕机后会话转移问题。如果在cookie和url中并没有session,则这只是个简单的round-robin负载均衡。

jvm_route的原理

  • 一开始请求过来,没有带session的信息,jvm_route就根据round robin的方法,发到一台Tomcat上
  • Tomcat添加上session信息,并返回给客户
  • 用户再次请求,jvm_route看到session中有后端服务器的名称,他就把请求转到对应的服务器上

暂时jvm_route模块还不支持fair的模式。jvm_route的工作模式和fair是冲突的。对于某个特定用户,当一直为他服务的Tomcat宕机后,默认情况下它会重试max_fails的次数,如果还是失败,就重新启用round robin的方式,而这种情况下就会导致用户的session丢失

4、使用后端服务器自身通过相关机制保持session同步

使用数据库、redis、memcached等做session复制

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

学习永无止境,让我们共同进步!!

相关文章:

Nginx--代理与负载均衡(扩展nginx配置7层协议及4层协议方法、会话保持)

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、代理原理 1、反向代理产生的背景 单个服务器的处理客户端(用户)请求能力有一个极限,当接入请求过多时&#…...

Ubuntu20.4 系统安装后无wifi图标

0. 问题排查 1.检查 BIOS 设置: 有时候,无线网卡可能在 BIOS 中被禁用。重启电脑,进入 BIOS 设置,确保无线网卡选项是启用的。 2.检查硬件开关: 检查您的笔记本电脑是否有物理开关或键盘快捷键来启用或禁用无线网卡。 3.在软件更新中切换…...

牛客网SQL进阶135 :每个6/7级用户活跃情况

每个67级用户活跃情况_牛客题霸_牛客网 0 问题描述 基于用户信息表user_info、、试卷作答记录表exam_record、题目练习记录表practice_record,统计 每个6/7级用户总活跃月份数、2021年活跃天数、2021年试卷作答活跃天数、2021年答题活跃天数,结果 按照总…...

SQLite3使用接口写入二进制文件

使用接口的方式写入二进制文件 ,有二种方案。 一、全部文件 一次性写下到数据中 使用sqlite3_bind_blob接口 FILE* fpfopen("user.bmp","rb"); iLenfread(buffer,1,65535,fp); fclose(fp);sqlite3_prepare(pDB,"insert into user values …...

在复杂的数据库架构中,如何优化 SQL 查询以提高性能和减少资源消耗?

在优化 SQL 查询以提高性能和减少资源消耗时,可以考虑以下几个方面: 使用索引:为经常被查询的列创建索引,可以大大加快查询速度。同时,避免过多的索引,因为过多的索引会增加写入操作的开销。 编写高效的查…...

【HarmonyOS】端云一体化初始化项目

简介 端云一体化开发是HarmonyOS对云端开发的支持、实现端云联动。云开发服务提供了云函数、云数据库、云存储等服务,可以使开发者专注于应用的业务逻辑开发,无需关注基础设施,例如:服务器、操作系统等问题。 因此,…...

LLM之KG:利用大语言模型(LLM)对文本语料提取概念和概念之间的语义关系进而实现自动构建知识图谱

LLM之KG:利用大语言模型(LLM)对文本语料提取概念和概念之间的语义关系进而实现自动构建知识图谱 目录 ML之KG:基于MovieLens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)实现对用户进行Top电影推荐案例 LLMs之AutoKG:《大型语言模型在知识图…...

Spring Security 6如何使用?

Spring Security 6 是一个功能强大且高度可定制的身份验证和访问控制框架,它专注于为基于Java的应用程序提供全面的安全解决方案。以下是对Spring Security 6的详细解析: 一、核心功能 身份验证(Authentication): 验…...

PyTorch深度学习快速入门教程--学习笔记

目录 P4 PyCharm和Jupyter的对比 P5 PyTorch加载数据 P6 Dataset类代码实现 P7 Tensorboard 写日志 读取日志文件 Tensorboard 读图片 P10 Transforms使用 Transforms用途 常见的Transforms工具 P14 torchvision数据集使用 P15 Dataloader使用 P16 nn.Module模块使…...

SQLALchemy 分组过滤、子查询

SQLALchemy 分组过滤、子查询 分组和过滤(Group By Having)示例:使用ORM示例:使用SQLAlchemy Core子查询(Subquery)SQLAlchemy 是一个流行的 SQL 工具包和对象关系映射(ORM)库,用于 Python 应用程序。它允许你以 Pythonic 的方式使用 SQL 数据库,同时提供了强大的查询…...

华为od(D卷) 环中最长子串/字符成环找偶数LOX

文章目录 题目描述输入描述输出描述示例1示例2示例3思路代码 题目描述 给你一个字符串 s,字符串 s 首尾相连成一个环形,请你在环中找出 ‘l’、‘o’、‘x’ 字符都恰好出现了偶数次最长子字符串的长度。 输入描述 输入是一串小写的字母组成的字符串 …...

机器学习--常见算法总结

有监督学习算法 1. 线性回归算法 概念:线性回归是一种统计方法,用于预测一个变量(因变量)与一个或多个自变量(特征变量)之间的关系。目标是通过线性方程建立自变量和因变量之间的关系模型。 作用&#x…...

QT 网络聊天室简易版

视频:qt开发网络聊天w室软件3.4界面开发_哔哩哔哩_bilibili 目录 UI部分 设计稿图 放置控件 界面美化 拖动窗体 设置界面 网络部分 配置对话框 多项目结果和服务器端设计 客户端框架开发 UI部分 设计稿图 放置控件 界面美化 现在我们把窗体自带的标题栏给去了,用我们自…...

Linux_Shell三剑客grep,awk,sed-08

三剑客的概述: awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找…...

uniapp实现足球数据分析平台移动端H5

文章目录 前言一直想做一款足球分析平台,大概内容包括竞彩分析模块,即时预测模块,初盘分析模块,找来找去还是前端铺子的样式感觉比较好看。 一、界面一栏二、注册界面1.代码说明 三、首页界面四、竞彩预测五、即时预测总结 前言 …...

Redis5优化-Redis

1、Redis关键参数 a、客户端最大连接数 maxclients 60000 注意该参数受到操作系统最大文件句柄的限制(ulimit -n) b、响应 repl-ping-slave-period/repl-timeout repl-timeout 60 1)、说明:slave 会每隔 repl-ping-slave-period(默认10秒)ping一次mast…...

Element UI【详解】el-scrollbar 滚动条组件

el-scrollbar 滚动条组件用于优化页内滚动条的UI效果,使用时必须指定高度! /*el-scrollbar 必须指定高度*/ .scrollMenuBox {height: 200px;width: 100px;border: 1px solid red; } 控制el-scrollbar内滚动条的方法与控制页面的滚动条的方法基本一样&a…...

【精选】基于Python大型购物商城系统(京东购物商城,淘宝购物商城,拼多多购物商城爬虫系统)

目录: 目录: 系统介绍: 系统开发技术 Python语言 Django框架简介 MySQL数据库技术 B/S架构 系统设计 系统总体设计 系统详细界面实现: 系统测试 测试目的 测试用例 本章小结 参考代码: 为什么选择我&…...

QT翻金币小游戏(含音频图片文件资源)

目录 QT翻金币小游戏 音频图片资源文件获取 效果展示 图片 视频 实现代码 main.cpp mymainwindow.h mymainwindow.cpp startscene.h startscene.cpp selectscene.cpp playscene.h playscene.cpp mypushbutton.h mypushbutton.cpp dataconfig.h dataconfig.cpp QT…...

Linux配置JDK8环境变量

目录 一、yum安装1.1 OpenJDK安装1.2 测试是否能够使用1.3 如何卸载JDK 二、手动安装2.1 下载2.2 上传到linux服务器路径2.3 解压2.4 配置环境变量2.5 测试是否能够使用 一、yum安装 1.1 OpenJDK安装 sudo yum install -y java-1.8.0-openjdk-devel1.2 测试是否能够使用 jav…...

Fiddle抓手机app的包

前言 本次文章讲述的是,fiddle获取手机代理,从而获取手机app的http、https请求! 一.下载安装汉化Fiddle 1.点击Fiddler官网下载链接:Download Fiddler Web Debugging Tool for Free by Telerik 2.直接运行,选择自己需…...

Oracle+ASM+High冗余详解及空间计算

Oracle ASM(Automatic Storage Management)的High冗余模式是一种提供高度数据保护的策略,它通过创建多个数据副本来确保数据的可用性和安全性。 以下是关于Oracle ASM High冗余的详细解释: 一、High冗余的特点 1.数据冗余度 在Hi…...

如何为 Nextcloud 配置自动数据库备份 - 应用程序

自动数据库备份模块简化了生成数据库计划备份的过程。这些备份可以存储在各种位置,包括本地驱动器、FTP 服务器、SFTP 服务器、Dropbox、Google Drive、OneDrive、NextCloud 和 Amazon S3 云存储。用户还可以选择启用自动删除过期备份的功能。此外,用户可…...

child_process.spawn简介

child_process.spawn 是 Node.js 中 child_process 模块的一个重要方法,它用于异步地创建子进程来执行指定的命令。下面是对 child_process.spawn 的深入解析: 一、基本用法 spawn 方法的基本语法如下: const { spawn } require(child_pr…...

整理给测试人看的千页面试题

人往高处走水往低处流,九月已来,“金九银十”招聘季还会远吗? 转眼2024年招聘季就要来了,没点真本事真技术,没点面试经验,不了解点职场套路,如何过五关斩六将?如何打败面试官&#…...

Linux 内核中的并发与竞争

1. 引入并发与竞争的概念 在现代计算环境中,多个任务和线程通常会同时执行,因此理解并发和竞争的特性与挑战至关重要。以下是对这两个概念的详细介绍。 1. 并发(Concurrency) 定义: 并发是指多个任务在同一时间段内…...

Ubuntu修改命令提示符格式PS1

命令提示符组成 通过Xshell进入Ubuntu的默认提示符是这样的 rootDESKTOP:~# root: 当前登录用户DESKTOP:主机名~: 当前目录名(即用户主目录)#:超级用户权限(root用户显示)$: 普通用户权限(非root用户显示) 修改命令提示符 step1…...

指针详解(五)

目录 1. 回调函数 2. qsort使用举例 1)排序整型数据 2)排序结构数据 3. qsort函数的模拟实现(冒泡) 1. 回调函数 回调函数就是一个通过函数指针调用的函数 函数的指针(地址)作为参数传递给另一个函数…...

智慧安防/一网统管/视频监控EasyCVR视频汇聚平台的视频轻量化特点及应用

在数字化时代,视频监控已成为保障公共安全、提升管理效率的重要手段。随着技术的不断进步,EasyCVR视频汇聚平台应运而生,平台以其独特的视频轻量化特点在安防监控领域展现出强大的应用潜力。本文将详细探讨EasyCVR视频汇聚平台的视频轻量化特…...

nginx代理转发如何配置

Nginx配置代理转发是一个常见的需求,用于将客户端的请求转发到后端服务器。以下是Nginx代理转发的配置步骤,包括详细的操作步骤和注意事项: 1. 确定Nginx安装和配置文件位置 首先,确保Nginx已经正确安装在服务器上。Nginx的主配…...

JavaScript学习笔记(十三):网络请求JS AJAX

1、AJAX - XMLHttpRequest 对象 1.1 XMLHttpRequest 对象是 AJAX 的基石。 创建 XMLHttpRequest 对象定义回调函数打开 XMLHttpRequest 对象向服务器发送请求 1.2 XMLHttpRequest 对象 所有现代浏览器都支持 XMLHttpRequest 对象。 XMLHttpRequest 对象可用于在后台与 Web…...

go for 循环变量的使用及易错点

1&#xff0c;for 循环变量&#xff0c;整个for循环中变量i始终使用一个变量&#xff0c;i地址不变&#xff0c;存放的内容在变 func main() {for i : 0; i < 10; i {fmt.Printf("值:%v 地址&#xff1a;%v \n", i, &i)} } 打印&#xff1a; 值:0 地址&am…...

2024嵌入式面试:OPPO嵌入式面试题及参考答案

目录 TCP 与 UDP 的区别是什么? 请简述 TCP 的三次握手过程。 HTTP 协议的工作原理是什么? C++11 引入了哪些新特性? 什么是智能指针?如何解决其内存泄漏问题? 进程间有哪些通信方式? CPU 的调度策略有哪些? 如何保证线程安全?多线程编程需要注意哪些问题? S…...

Cesium模型制作,解决Cesium加载glb/GLTF显示太黑不在中心等问题

Cesium模型制作&#xff0c;解决Cesium加载glb/GLTF显示太黑不在中心等问题 QQ可以联系这里&#xff0c;谢谢...

Java 操作 Redis和redis持久化

一、Jedis 我们要使用 Java 来操作 Redis&#xff0c;Jedis 是 Redis 官方推荐的 java连接开发工具&#xff01; 使用Java 操作 Redis 中间件&#xff01; 1.导入对应的依赖 https://mvnrepository.com/artifact/redis.clients/jedis <dependency><groupId>redi…...

Expo创建的React Native项目如何在Windows上进行打包

文章目录 前言eas打包步骤什么是AAB转换为apk文件 本地打包以Windows为例先安装docker&#xff0c;然后手动创建下面的三个文件构建 前言 下面是Expo如何在本地进行打包的过程&#xff08;windows&#xff09; eas打包 如果使用云打包&#xff0c;花费时间较多&#xff0c;时…...

探索Go语言中的结构体:定义和使用

引言 Go语言是一种静态类型的编程语言&#xff0c;它提供了多种数据结构来组织数据。结构体&#xff08;struct&#xff09;是Go中一种强大的自定义数据类型&#xff0c;允许你将多个不同或相同类型的字段组合成一个单一的实体。本文将介绍Go语言中结构体的基本概念、定义方法…...

Unity Dots学习 (一)

先学习怎么使用&#xff0c;再研究底层代码。Dots大家都有所耳闻。一直没时间研究&#xff0c;最近研究一下 看上图可知&#xff0c;哪怕是CPU的第三级缓存也比内存要快2-5倍。 资料&#xff1a; 《DOTS之路》第零节——前导课(1)——DOTS的5W1H问题_哔哩哔哩_bilibili 《DOT…...

C语言刷题日记(附详解)(1)

一、选择判断部分 第一题&#xff1a; 如下代码是否存在风险&#xff0c;并说明原因和修改方案 #include<stdio.h> int main() {char* str "hello world";*str a;return 0; }思路提示&#xff1a;这种形式的字符串存储在什么区域呢&#xff1f;是否真的有…...

SpringSecurity实现登录功能实战!!!

实现思路 登录 ①自定义登录接口 调用ProviderManager的方法进行认证 如果认证通过生成jwt 把用户信息存入redis中 ②自定义UserDetailsService 在这个实现类中去查询数据库 注意配置passwordEncoder为BCryptPasswordEncoder 退出登录&#xff0c;删除redis中的数…...

mysql中用一个查询获取多个数据库(模式)和表的计数之和

问题 下面的查询返回了4排数据&#xff0c;这很好。但我同时需要对同一个查询中的所有计数求和。这如何实现&#xff1f;我已经尝试了多种不同的方法&#xff0c;但只得到sintax报错。 SELECT COUNT(*) FROM schema1.table WHERE STATE 17 AND LEVEL 1 UNION ALL SELECT CO…...

linux patch 的制作方式

文章目录 制作patch1. 准备工作2. 使用 diff 命令生成补丁文件生成单个文件的补丁生成整个目录的补丁 3. 检查补丁文件 使用patch1. 应用补丁文件1.1 应用单个文件的补丁1.2 应用整个目录的补丁 总结示例&#xff1a;制作和应用补丁 前言&#xff1a; 在Linux系统中&#xff0c…...

白骑士的C#教学进阶篇 2.4 LINQ查询

系列目录 上一篇&#xff1a;白骑士的C#教学进阶篇 2.3 委托与事件 LINQ&#xff08;Language Integrated Query&#xff09;是C#中的一个强大特性&#xff0c;它提供了统一的语法来查询和操作各种数据源&#xff0c;如数组、集合、XML和数据库等。LINQ通过一种类似SQL的查询语…...

2024华为OD机试真题- 贪吃的猴子Python-C卷D卷-200分

目录 题目描述 输入描述 输出描述 用例1 用例2 用例3 解题思路 代码 2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 一只贪吃的猴子,来到一个果园,发现许多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。 猴子获取香蕉,…...

4-1-2 直流电机(电机专项教程)

4-1-2 直流电机&#xff08;电机专项教程&#xff09; 4-1-2 直流电机主要参数尺寸参数额定电压额定电流空载转速 如何控制直流电机有刷直流电机转向控制H桥电路控制转向 如何控制电机转速PWM控制电机转速 4-1-2 直流电机 之前学习了有刷直流电机的基本结构个工作原理&#xff…...

[图解]用例规约之扩展路径

1 00:00:01,710 --> 00:00:03,670 基本路径写完之后 2 00:00:04,690 --> 00:00:07,270 接下来就是扩展路径 3 00:00:08,620 --> 00:00:14,000 扩展路径就是系统要处理的意外和分支 4 00:00:14,010 --> 00:00:19,710 系统要处理的 5 00:00:20,970 --> 00:00:…...

学习记录第二十八天

有名管道&#xff08;FIFO&#xff09; 在Linux系统中&#xff0c;有名管道是一种特殊类型的文件&#xff0c;它允许不相关的进程之间进行通信。有名管道在文件系统中有一个具体的路径和名称&#xff0c;因此它们可以被多个进程共同访问。有名管道的特点包括持久性、多进程访问…...

SpringBoot的事务/调度/缓存/邮件发送和一些Spring知识点总结

目录 1、SpringBoot的事务管理 2、SpringBoot的异步任务 3、SpringBoot定时任务调度 4、SpringBoot整合Mail发送邮件 5、Spring框架中的Bean的作用域 6、Spring框架中的Bean的线程安全 7、 Spring框架中的Bean生命周期 8、Spring框架如何解决循环依赖&#xff1f; 9、…...

透明加密技术

透明加密技术&#xff0c;也被称为透明数据加密&#xff08;Transparent Data Encryption, TDE&#xff09;&#xff0c;是一种加密方法&#xff0c;它允许数据在存储时自动加密和解密&#xff0c;而不需要用户进行任何手动操作。透明加密技术主要应用于数据库、文件系统和磁盘…...

深入理解Faiss:高效向量检索的利器

近年来&#xff0c;随着人工智能和机器学习技术的飞速发展&#xff0c;向量检索技术变得越来越重要。无论是在推荐系统、图像搜索还是自然语言处理等领域&#xff0c;向量检索都扮演着至关重要的角色。而在众多向量检索库中&#xff0c;Faiss&#xff08;Facebook AI Similarit…...