nginx反向代理以及负载均衡(常见案例)
一、nginx反向代理
1、什么是代理服务器?
代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。
2、为什么要用代理服务器?
提高访问速度:由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能明显提高请求速度。
防火墙作用:由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可在代理服务器上设限,过滤某些不安全信息。
通过代理服务器访问不能访问的目标站点:互联网上有许多开发的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点。
3、反向代理 VS 正向代理
正向代理:正向代理,架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。
反向代理:反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端。
4、nginx正向代理实战
由于于nginx正向代理的功能指令较少,只需要进行简单的配置即可:
server {resolver 114.114.114.114; #指定DNS服务器IP地址listen 8080;location / {proxy_pass http://$http_host$request_uri; #设定代理服务器的协议和地址}
}
以上的配置只能访问80 端口的网站,而不能访问https443端口的网站,现在的网站基本上都是https的要解决技能访问
http80端口也能访问https443端口的网站,需要置两个SERVER节点,一个处理HTTP转发,另一个处理HTTPS转发,而客户端都通过HTTP来访问代理,通过访问代理不同的端口,来区分HTTP和HTTPS请求。
由于原生 nginx 只支持 http 正向代理,为了 nginx 支持 https 正向代理,可以打ngx_http_proxy_connect_module 补丁+ ssl 模块支持。
/usr/local/nginx/sbin/nginx -V
wget http://nginx.org/download/nginx-1.15.12.tar.gz
tar -zxvf nginx-1.15.12.tar.gz
下载模块 ngx_http_proxy_connect_module:
git clone https://github.com/chobits/ngx_http_proxy_connect_module
patch -d /root/nginx-1.15.12/ -p 1 <
/root/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite
cd /root/nginx-1.15.12/
./configure --with-http_stub_status_module --with-http_ssl_module --with-fileaio --with-http_realip_module --add-module=/root/ngx_http_proxy_connect_module/
make
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp /root/nginx-1.15.12/objs/nginx /usr/local/nginx/sbin/
# 正向代理上网
server {listen 38080;# 解析域名resolver 8.8.8.8;# ngx_http_proxy_connect_moduleproxy_connect;proxy_connect_allow 443 563;proxy_connect_connect_timeout 10s;proxy_connect_read_timeout 10s;proxy_connect_send_timeout 10s;location / {proxy_pass $scheme://$http_host$request_uri;}
}
5、nginx反向代理实战
HOSTNAME | IP | 说明 |
lb01 | 192.168.150.11 | ngginx主负载均衡器 |
lb02 | 192.168.150.12 | nginx副负载均衡器 |
web01 | 192.168.150.13 | web01服务器 |
web02 | 192.168.150.14 | web02服务器 |
(1)配置虚拟主机
在两台web服务器上:
# cd /etc/nginx/conf.d/
# mv default.conf{,.bak}
# cat vhost.confserver {
listen 80;server_name bbs.yunjisuan.com;location / {root /usr/share/nginx/html/bbs;index index.html index.htm;}access_log /usr/share/nginx/html/bbs/logs/access_bbs.log main;
}server {listen 80;server_name www.yunjisuan.com;location / {root /usr/share/nginx/html/www;index index.html index.htm;}access_log /usr/share/nginx/html/www/logs/access_www.log main;
}
(2)准备测试页面
在两台web服务器上:
mkdir -p /usr/share/nginx/html/{www,bbs}/logs
echo "`hostname -I `www" > /usr/share/nginx/html/www/index.html
echo "`hostname -I `bbs" > /usr/share/nginx/html/bbs/index.html
(3)启动服务测试
[root@lb01 ~]# curl -H host:bbs.yunjisuan.com 192.168.150.13
192.168.150.13 bbs
[root@lb01 ~]# curl -H host:bbs.yunjisuan.com 192.168.150.14
192.168.150.14 bbs
[root@lb01 ~]# curl -H host:www.yunjisuan.com 192.168.150.13
192.168.150.13 www
[root@lb01 ~]# curl -H host:www.yunjisuan.com 192.168.150.14
192.168.150.14 www
二、nginx负载均衡
搭建负载均衡服务的需求如下:
1 ) 把单台计算机无法承受的大规模并发访问或数据流量分担到多台节点设备上,分别进行处理, 减少用户等待响应的时间, 提升用户体验。
2 ) 单个重负载的运算分担到多台节点设备上做并行处理, 每个节点设备处理结束后, 将结果汇总, 返回给用户, 系统处理能力得到大幅度提高。
3 ) 7 x 24 小时的服务保证, 任意一个或多个有限后面节点设备宕机, 不能影响业务。在负载均衡集群中, 同组集群的所有计算机节点都应该提供相同的服务。 集群负载均衡器会截获所有对该服务的入站请求。 然后将这些请求尽可能地平均地分配在所有集群节点上。
实现 Nginx 负载均衡的组件说明
Nginx http 功能模块 | 模块说明 |
ngx_http_proxy_module | proxy 代理模块, 用于把请求后拋给服务器节点或 upstream 服务器池 |
ngx_http_upstream_module | 负载均衡模块, 可以实现网站的负载均衡功能及节点的健康检査 |
配置简单的负载均衡:
在lb01上:
upstream www_server_pools {server 192.168.150.13:80 weight=1;server 192.168.150.14:80 weight=1;
}
server {listen 80;#server_name localhost;server_name www.yunjisuan.com;#charset koi8-r;#access_log /var/log/nginx/log/host.access.log main;location / {# root /usr/share/nginx/html;# index index.html index.htm;# 访问www.yunjisuan.com,请求发送给www_server_pools里面的节点proxy_pass http://www_server_pools;}
}
#这里定义Web服务器池,包含了13,14两个Web节点
[root@lb01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 ~]# systemctl restart nginx
配置hosts解析并测试:
[root@lb01 ~]# tail -1 /etc/hosts
192.168.150.11 www.yunjisuan.com
[root@lb01 ~]# for ((i=1;i<=4;i++)); do curl http://www.yunjisuan.com; done
192.168.150.13 bbs
192.168.150.14 bbs
192.168.150.13 bbs
192.168.150.14 bbs
可以看到按照轮询的算法依次访问后端web服务器,但测试结果是bbs页面,而不是www,需要通过proxy_set_header Host $host解决,在后面有介绍到。
1、Nginx upstream模块
Nginx的负载均衡功能依赖于ngx_http_upsteam_module模块,所支持的代理方式包括 proxy_pass,fastcgi_pass,memcached_pass等,新版Nginx软件支持的方式有所增加。这里主要讲解proxy_pass代理方式。
ngx_http_upstream_module模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应Upstream组的名字上,具体写法为“proxy_pass http:// www_server_pools”,其中www_server_pools就是一个Upstream节点服务器组名字。ngx_http_upstream_module模块官方地址为:http://nginx.org/en/docs/http/ngx_http_upstream_module.html。
示例1:基本的upstream配置案例
upstream www_server_pools {
#upstream是关键字必须有,后面的www_server_pools为一个Upstream集群组的名字,可以自己起名,
调用时就用这个名字server 192.168.0.223:80 weight=5;server 192.168.0.224:80 weight=10;server 192.168.0.225:80 weight=15;
#server关键字是固定的,后面可以接域名(门户会用)或IP。如果不指定端口,默认是80端口。weight代表权重,数值越大被分配的请求越多,结尾有分号。
}
示例2:较完整的upstream配置案例
upstream www_server_pools {server 192.168.0.223; #这行标签和下行是等价的server 192.168.0.224:80 weight=1 max_fails=1 fail_timeout=10s; #这行标签和上一行是等价的,此行多余的部分就是默认配置,不写也可以。server 192.168.0.225:80 weight=1 max_fails=2 fail_timeout=20s backup;# server最后面可以加很多参数,具体参数作用看下文的表格
}
示例3:使用域名及socket的upstream配置案例
upstream backend {server backend1.example.com weight=5;server backend2.example.com:8080; #域名加端口。转发到后端的指定端口上server unix:/tmp/backend3; #指定socket文件#提示:server后面如果接域名,需要内网有DNS服务器或者在负载均衡器的hosts文件做域名解析。server 192.168.0.223;server 192.168.0.224:8080;server backup1.example.com:8080 backup;#备份服务器,等上面指定的服务器都不可访问的时候会启动,backup的用法和Haproxy中用法一样server backup2.example.com:8080 backup;
}
upstream参数:
模块内参数 | 参数说明 |
server 10.0.10.8:80 | 负载均衡后面的RS配置,可以是IP或域名,如果端口不写,默认是80端口。高并发场景下, IP可换成域名,通过 DNS做负载均衡。 |
weigth=1 | 代表服务器的权重,默认值是1。权重数字越大表示接受的请求比例越大。 |
max_fails=3 | Nginx尝试连接后端主机失败的次数,这个值是配合proxy_next_upstream、fastcgi_next_upstream和memcached_next_upstream 这三个参数来使用的。当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404、502、503、 Max_fails的默认值是1 ;企业场景下建议2-3次。如京东1次,蓝汛10次,根据业务需求去配置 |
fail_timeout=10s | 在max_fails定义的失败次数后,距离下次检查的间隔时间,默认是10s ;如果max_fails是5 ,它就检测5次,如果5次都是502,那么,它就会根据fail_timeout的值,等待10s再去检查,还是只检查一次,如果持续502,在不重新加载 Nginx配置的情况下,每隔10s都只检查一次。常规业务2~3秒比较合理,比如京东3秒,蓝汛3秒,可根据业务需求去配置 |
backup | 热备配置(RS节点的高可用),当前面激活的RS都失败后会自动启用热备RS这标志看这个服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求。注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。 |
down | 这标志着服务器永远不可用,这个参数可配合ip_hash使用;类似与注释。 |
模块调度算法:
第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的优先获得请求,响应时间短的优先获得请求。例如:least_conn,fair等都属于动态调度算法。
常用调动算法:
1.定义轮询调度算法-rr-默认调度算法
4.定义最小的连接数-least_conn
2、http_proxy_module模块
proxy_pass指令属于ngx_http_proxy_module模块,此模块可以将请求转发到另一台服务器,在实际的反向代理工作中,会通过location功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池。该指令官方地址:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
示例1:将匹配URI为name的请求抛给http://127.0.0.1/remote/.
location /name/ {proxy_pass http://127.0.0.1/remote/;
}
示例2:将匹配URI为some/path的请求抛给http://127.0.0.1
location /some/path/ {proxy_pass http://127.0.0.1;
}
示例3:将匹配URI为name的请求应用指定的rewrite规则,然后抛给http://127.0.0.1
location /name/ {rewrite /name/( [^/]+ ) /username=$1 break;proxy_pass http://127.0.0.1;
}
nginx负载均衡相关重要参数:
Nginx 反向代理重 要参敎 | 解释说明 |
proxy_pass http://server_pools; | 通过proxy_pass功能把用户的清求转向到反向代理定义的upstream服务器池 |
proxy_set_header Host $host | 在代理向后端服务器发送的 http请求头中加入 host字段信息,用于当后端服务器配置有多个虚拟主机时,可以识别代理的是哪个虚拟主机。这是节点服务器多虚拟主机时的关键配置 |
proxy_set_header X-Forwarded-For $remote_addr; | 在代理向后端服务器发送的 http请求头中加入 X-Forward-For字段信息,用于后端服务器程序、日志等接收记录真实用户的 IP ,而不是代理服务器的IP这是反向代理时,节点服务器获取用户真实 IP的必要功能配置 |
http proxy 模块相关参数说明:
http proxy 模块相关参数 | 说明 |
proxy_set_header | 设置http请求header项传给后端服务器节点,例如:可实现让代理后端的服务器节点获取访问客户端用户的真实IP地址 |
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_buffers * 2 |
proxy_trmp_file_write_size 指 | 指定proxy缓存临时文件的大小 |
三、nginx反向代理负载均衡案例
1、反向代理多虚拟主机节点服务器企业案例
[root@lb01 ~]# cat /etc/nginx/conf.d/vhost.conf
server {listen 80;server_name www.yunjisuan.com;location / {proxy_pass http://www_server_pools;proxy_set_header Host $host;}
}server {listen 80;server_name bbs.yunjisuan.com;location / {proxy_pass http://www_server_pools;proxy_set_header Host $host;}
}
重启代理测试:
[root@lb01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 ~]# systemctl restart nginx[root@lb01 ~]# tail -1 /etc/hosts
192.168.150.11 www.yunjisuan.com bbs.yunjisuan.com[root@lb01 ~]# for ((i=1;i<=4;i++)); do curl http://bbs.yunjisuan.com; done
192.168.150.14 bbs
192.168.150.13 bbs
192.168.150.14 bbs
192.168.150.13 bbs
[root@lb01 ~]# for ((i=1;i<=4;i++)); do curl http://www.yunjisuan.com; done
192.168.150.14 www
192.168.150.13 www
192.168.150.14 www
192.168.150.13 www
2、经过反向代理后的节点服务器记录用户IP企业案例
Web01节点服务器对应的WWW虚拟主机的访问日志的第一个字段记录的并不是客户端的IP而是反向代理服务器本身的IP(192.168.150.1),最后一个字段也是一个“-”,那么如何解决这个问题?其实很简单,同样是增加一行参数:proxy_set_header X-Forwarded-For $remote_addr;
3、根据URL中的目录地址实现代理转发案例
通过Nginx实现动静分离,即通过Nginx反向代理配置规则实现让动态资源和静态资源及其他业务分别由不同的服务器解析,以解决网站性能,安全,用户体验等重要问题。
下图为企业常见的动静分离集群架构图,此架构图适合网站前端只使用同一个域名提供服务的场景,例如,用户访问的域名是www.yunjisuan.com,然后,当用户请求www.yunjisuan.com/upload/xx地址时候,代理会分配请求到上传服务器池处理数据;当用户请求www.yunjisuan.com/static/xx地址的时候,代理会分配请求到静态服务器池请求数据;当用户请求www.yunjisuan.com/xx地址的时候,即不包含上述指定的目录地址路径时,代理会分配请求到默认的动态服务器池请求数据(注意:上面的xx表示任意路径)。
当用户请求www.yunjisuan.com/upload/xx地址时,实现由upload上传服务器池处理请求。当用户请求www.yunjisuan.com/static/xx地址时,实现由静态服务器池处理请求。除此以外,对于其他访问请求,全都由默认的动态服务器池处理请求。
upstream模块服务器池的配置:
#static_pools为静态服务器池,有一个服务器,地址为192.168.150.13,端口为80.
upstream static_pools {server 192.168.150.13:80 weght=1;
}#upload_pools为上传服务器池,有一个服务器地址为192.168.150.14,端口为80.
upstream upload_pools {server 192.168.150.14:80 weight=1;
}#default_pools为默认的服务器池,即动态服务器池,有一个服务器,地址为192.168.150.15,端口为80.
upstream default_pools {server 192.168.150.15:80 weight=1;
}
#提示:需要增加一台测试Web节点Web03(ip:192.168.150.15),配置与Web01,Web02一样。
以location方案实现,将符合static的请求交给静态服务器池static_pools,配置如下:
location /static/ {proxy_pass http://static_pools;proxy_set_header X-Forwarded-For $remote_addr;
}#将符合upload的请求交给上传服务器池upload_pools,配置如下:
location /upload/ {proxy_pass http://upload_pools;proxy_set_header X-Forwarded-For $remote_addr;
}#不符合上述规则的请求,默认全部交给动态服务器池default_pools,配置如下:
location / {proxy_pass http://default_pools;proxy_set_header X-Forwarded-For $remote_addr;
}
准备测试数据:
[root@web01 ~]# cd /usr/share/nginx/html/
[root@web01 html]# mkdir static
[root@web01 html]# echo "static_pools" >> static/index.html[root@web02 ~]# cd /usr/share/nginx/html/
[root@web02 html]# mkdir upload
[root@web02 html]# echo "upload_pools" >> upload/index.html[root@web03 ~]# cd /usr/share/nginx/html/
[root@web03 html]# echo "default_pools" >> index.html
测试:
[root@lb02 ~]# tail -1 /etc/hosts
192.168.150.11 www.yunjisuan.com[root@lb02 ~]# curl http://www.yunjisuan.com/upload/
upload_pools
[root@lb02 ~]# curl http://www.yunjisuan.com/static/
static_pools
[root@lb02 ~]# curl http://www.yunjisuan.com/
default_pools
根据URL目录地址转发的应用场景:
根据HTTP的URL进行转发的应用情况,被称为第7层(应用层)的负载均衡,而LVS的负载均衡一般用于TCP等的转发,因此被称为第4层(传输层)的负载均衡。
业务的域名没有拆分或者不希望拆分,但希望实现动静分离,多业务分离,不同的客户端设备(例如:手机和PC端)使用同一个域名访问同一个业务网站,就需要根据规则将不同设备的用户请求交给后端不同的服务器处理,以便得到最佳用户体验。
4、根据客户端的设备(user_agent)转发
在企业中,为了让不同的客户端设备用户访问有更好的体验,需要在后端架设不同服务器来满足不同的客户端访问,例如:移动客户端访问网站,就需要部署单独的移动服务器及程序,体验才能更好,而且移动端还分苹果,安卓,Ipad等,在传统的情况下,一般用下面的办法解决这个问题。
使用之前的环境:
location / {if ($http_user_agent ~* "MSIE")#如果请求的浏览器为微软IE浏览器(MSIE),则让请求由static_pools池处理{proxy_pass http://static_pools;}if ($http_user_agent ~* "Chrome")#如果请求的浏览器为谷歌浏览器(Chrome),则让请求由upload_pools池处理{proxy_pass http://upload_pools;}proxy_pass http://default_pools;proxy_set_header Host $host;#其他客户端,由default_pools处理
}
测试:curl -A 指定访问类型
[root@lb01 conf.d]# curl -A MSIE -H host:www.yunjisuan.com 192.168.150.11
192.168.150.13 www
[root@lb01 conf.d]# curl -A Chrome -H host:www.yunjisuan.com 192.168.150.11
192.168.150.14 www
[root@lb01 conf.d]# curl -A xxx -H host:www.yunjisuan.com 192.168.150.11
default_pools
5、根据扩展名转发的应用场景
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {proxy_pass http://static_pools;include proxy.conf;
}location ~ .*\.(php|php3|php5)$ {proxy_pass http://dynamic_pools;include proxy.conf
}
相关文章:

nginx反向代理以及负载均衡(常见案例)
一、nginx反向代理 1、什么是代理服务器? 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据…...
Spring 三级缓存机制(解决循环依赖)
文章目录 🔄 现实生活类比:开餐厅的过程💡 结合到 Spring 三级缓存🛠️ Spring 解决循环依赖的步骤1️⃣ Spring 开始创建 A2️⃣ Spring 开始创建 B3️⃣ B 创建完成后,回过头来继续创建 A 📌 三级缓存的作…...

第4章 4.4 EF Core数据库迁移 Add-Migration UpDate-Database
4.4.1 数据库迁移原理 总结一下就是: 1. 数据库迁移命令的执行,其实就是生成在数据库执行的脚本代码(两个文件:数字_迁移名.cs 数字_迁移名.Designer.cs),用于对数据库进行定义和修饰。 2. 数据库迁移…...
web安全——web应用程序技术
文章目录 一、HTTP1.1 HTTP方法1.2 HTTP消息头1.3 cookie1.4 状态码 二、web功能2.1 服务器端功能2.2 客户端功能——同源策略 三、编码方案3.1 URL编码3.2 Unicode编码3.3 HTML编码3.4 Base64编码 一、HTTP HTTP(超文本传输协议)是web应用程序使用的通…...

low rank decomposition如何用于矩阵的分解
1. 什么是矩阵分解和低秩分解 矩阵分解是将一个矩阵表示为若干结构更简单或具有特定性质的矩阵的组合或乘积的过程。低秩分解(Low Rank Decomposition)是其中一种方法,旨在将原矩阵近似为两个或多个秩较低的矩阵的乘积,从而降低复…...

GO 进行编译时插桩,实现零码注入
Go 编译时插桩 Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术,目的是在不修改业务代码的情况下,实现对应用程序的监控和追踪。 基本原理 Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改,将监控代码注入到…...
编写一个程序,输入一个字符串并输出其长度(Java版)
编写一个程序,输入一个字符串并输出其长度 以下是Java实现代码: import java.util.Scanner;public class StringLengthCalculator {public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out.print("请输入一…...
C++ day4 练习
一、练习1 找到第一天mystring练习,实现以下功能: mystring str "hello"; mystring ptr "world"; str str ptr; str ptr; str[0] H; 【代码】: #include <iostream> #include <cstring> #include &l…...
深入理解指针2
深入理解指针2 数组名的理解 数组名就是首元素的地址 int arr[]{1,3,2}; printf("%p\n",arr); printf("%p\n",&arr[0]);但是有两种情况除外, 1.sizeof(数组名),sizeof操作符统计的是整个数组的大小,并不是第一个元素…...

【STL专题】优先级队列priority_queue的使用和模拟实现,巧妙利用仿函数解决优先级
欢迎来到 CILMY23的博客 🏆本篇主题为:优先级队列priority_queue的使用和模拟实现,巧妙利用仿函数解决优先级 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏: C | C语言 | 数据结构与算法 | Linux…...
CPU、SOC、MPU、MCU--详细分析四者的区别
一、CPU 与SOC的区别 1.CPU 对于电脑,我们经常提到,处理器,内存,显卡,硬盘四大部分可以组成一个基本的电脑。其中的处理器——Central Processing Unit(中央处理器)。CPU是一台计算机的运算核…...
Node.js 内置模块简介(带示例)
目录 1. fs(文件系统)模块 2. http 模块 3. path 模块 4. os 模块 5. events 模块 6. crypto 模块 1. fs(文件系统)模块 fs 模块提供了与文件系统进行交互的功能,包括文件的读写、删除、重命名等操作。它有同步…...
常见的“锁”有哪些?
悲观锁 悲观锁认为在并发环境中,数据随时可能被其他线程修改,因此在访问数据之前会先加锁,以防止其他线程对数据进行修改。常见的悲观锁实现有: 1.互斥锁 原理:互斥锁是一种最基本的锁类型,同一时间只允…...
二级公共基础之数据库设计基础(一) 数据库系统的基本概念
目录 前言 一、数据库、数据管理系统和数据库系统 1.数据 2.数据库 3.数据库管理系统 1.数据库管理系统的定义 2.数据库管理系统的功能 1.数据定义功能 2.数据操作功能 3.数据存取控制 4.数据完整性管理 5.数据备份和恢复 6.并发控制 4.数…...

ollama无法通过IP:11434访问
目录 1.介绍 2.直接在ollama的当前命令窗口中修改(法1) 3.更改ollama配置文件(法2) 3.1更新配置 3.2重启服务 1.介绍 ollama下载后默认情况下都是直接在本地的11434端口中运行,绑定到127.0.0.1(localhost)&#x…...
简单易懂,解析Go语言中的struct结构体
目录 4. struct 结构体4.1 初始化4.2 内嵌字段4.3 可见性4.4 方法与函数4.4.1 区别4.4.2 闭包 4.5 Tag 字段标签4.5.1定义4.5.2 Tag规范4.5.3 Tag意义 4. struct 结构体 go的结构体类似于其他语言中的class,主要区别就是go的结构体没有继承这一概念,但可…...

java给钉钉邮箱发送邮件
1.开通POP和IMAP 2.引入pom <dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version> </dependency>3.逻辑 String host "smtp.qiye.aliyun.com"; String port "…...

C++和OpenGL实现3D游戏编程【连载23】——几何着色器和法线可视化
欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 1、本节实现的内容 上一节课,我们在Blend软件中导出经纬球模型时,遇到了经纬球法线导致我们在游戏中模型光照显示问题,我们在Blender软件中可以通过…...

大连本地知识库的搭建--数据收集与预处理_01
1.马蜂窝爬虫 编程语言:Python爬虫框架:Selenium(用于浏览器自动化)解析库:BeautifulSoup(用于解析HTML) 2.爬虫策略 目标网站:马蜂窝(https://www.mafengwo.cn/&…...
github 推送的常见问题以及解决
文章目录 git add 的时候问题1为什么会发生这种情况?Git 的警告含义如何解决?1. **保持 Git 的默认行为(推荐)**2. **禁用自动转换**3. **仅在工作目录中禁用转换**4. **统一使用 LF(跨平台开发推荐)** git…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...