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

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 模块支持。

这里需要重新编译 nginx,需要查看当前 nginx 的版本和编译选项,然后去官网下载同版本的 nginx 源码进行重新编译:
/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
打补丁,对 nginx 源码修改,这一步很重要,不然后面的 make 过不去:
patch -d /root/nginx-1.15.12/ -p 1 <
/root/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite
在原有配置后追加模块make 后注意不要 install:
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反向代理实战

现在许多大型web网站都用到反向代理。除了可以防止外网对内网服务器的恶性攻击、缓存以减少服务器的压力和访问安全控制之外,还可以进行负载均衡,将用户请求分配给多个服务器。
环境准备:
HOSTNAMEIP说明
lb01192.168.150.11ngginx主负载均衡器
lb02192.168.150.12nginx副负载均衡器
web01192.168.150.13web01服务器
web02192.168.150.14web02服务器

(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使用;类似与注释。

模块调度算法:

调度算法一般分为两类:
第一类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情况,例如:rr,wrr,ip_hash等都属于静态调度算法。

第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的优先获得请求,响应时间短的优先获得请求。例如:least_conn,fair等都属于动态调度算法。

常用调动算法:

1.定义轮询调度算法-rr-默认调度算法

2.定义权重调度算法-wrr
3.定义静态调度算法-ip_hash(该调度算法可以解决动态网页的session共享问题)

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、反向代理多虚拟主机节点服务器企业案例

proxy_set_header host $host;
在代理向后端服务器发送的http请求头中加入host字段信息后,若后端服务器配置有多个虚拟主机,它就可以识别代理的是哪个虚拟主机。
[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、根据扩展名转发的应用场景

可根据扩展名实现资源的动静分离访问,如图片,视频等请求静态服务器池,PHP,JSP等请求动态服务器池。
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、什么是代理服务器&#xff1f; 代理服务器&#xff0c;客户机在发送请求时&#xff0c;不会直接发送给目的主机&#xff0c;而是先发送给代理服务器&#xff0c;代理服务接受客户机请求之后&#xff0c;再向主机发出&#xff0c;并接收目的主机返回的数据…...

LabVIEW形状误差测量系统

在机械制造领域&#xff0c;形状与位置公差&#xff08;GD&T&#xff09;直接影响装配精度与产品寿命。国内中小型机加工企业因形状误差导致的返工率高达12%-18%。传统测量方式存在以下三大痛点&#xff1a; ​ 设备局限&#xff1a;机械式千分表需人工读数&#xff0c;精度…...

将VsCode变得顺手好用(1

目录 设置中文 配置调试功能 提效和增强相关插件 主题和图标相关插件 创建js文件 设置中文 打开【拓展】 输入【Chinese】 下载完成后重启Vs即可变为中文 配置调试功能 在随便一个位置新建一个文件夹&#xff0c;用于放置调试文件以及你未来写的代码&#xff0c;随便命名但…...

排序模板——C++

0.排序模板题目 题目描述 将读入的 N 个数从小到大排序后输出。 输入格式 第一行为一个正整数 N。 第二行包含 N 个空格隔开的正整数 ai​&#xff0c;为你需要进行排序的数。 输出格式 将给定的 N 个数从小到大输出&#xff0c;数之间空格隔开&#xff0c;行末换行且无空格。 …...

HTTP/HTTPS 服务端口监测的简易实现

一 HTTP/HTTPS 服务端口监测的简易实现方法 在当今快节奏的工作环境中&#xff0c;工作忙碌成为了许多职场人的常态。就拿我们团队最近经历的事情来说&#xff0c;工作任务一个接一个&#xff0c;大家都在各自的岗位上争分夺秒地忙碌着。然而&#xff0c;就在这样高强度的工作…...

快速入门——状态管理VueX

Vuex介绍 状态管理 每一个Vuex应用的核心都是一个store&#xff0c;与普通的全局对象不同的是&#xff0c;基于Vue数据与视图绑定的特点&#xff0c;当store中的状态发生变化时&#xff0c;与之绑定的视图也会被重新渲染。 store中的状态不允许被直接修改&#xff0c;改变sto…...

C# 根据Ollama+DeepSeekR1开发本地AI辅助办公助手

在上一篇《访问DeepSeekR1本地部署API服务搭建自己的AI办公助手》中&#xff0c;我们通过通过Ollama提供的本地API接口用Python实现了一个简易的AI办公助手&#xff0c;但是需要运行Py脚本&#xff0c;还比较麻烦&#xff0c;下面我们用C#依据Ollama提供的API接口开发一个本地A…...

Flutter - 基础Widget

Flutter 中万物皆 Widget&#xff0c;基础Widget 同步对应 Android View. 普通文本 Text /*** 控制文本样式统一使用 style:TextStyle, 例&#xff1a;fontSize(字体大小),color(颜色),shadows(阴影)等等* 控制文本布局需单独设置&#xff1a;* textAlign(文不对齐方式)* te…...

Tips :仿真竞争条件 指的是什么?

文章目录 **为什么会出现仿真竞争条件?****典型场景举例****System Verilog 如何解决竞争条件?****1. 使用 `program` 块隔离测试平台****2. 使用 `clocking` 块明确时序关系****3. 非阻塞赋值(`<=`)的合理使用****竞争条件的根本原因****总结****代码结构****1. 设计模…...

【Elasticsearch】script_fields 和 runtime_fields的区别

script_fields和runtime_fields都是 Elasticsearch 中用于动态计算字段值的功能&#xff0c;但它们在实现方式、应用场景和性能表现上存在显著区别。以下是两者的详细对比&#xff1a; 1.定义和应用场景 • script_fields&#xff1a; • 定义&#xff1a;通过 Painless 脚本…...

达梦DTS数据迁移工具生产篇(MySQL->DM8)

本文章使用的DTS工具为 2024年9月18日的版本&#xff0c;使用的目的端DM8数据库版本为2023年12月的版本&#xff0c;注意数据库版本和DTS版本之间跨度不要太大&#xff0c;以免出现各种兼容性的报错。若发现版本差距过大时&#xff0c;请联系达梦技术服务工程师处理。 1. 迁移…...

【安卓逆向】逆向APP界面UI修改再安装

1.背景 有一客户找到我&#xff0c;说能不能把APP首页的底部多余界面去掉。 逆向实战 想要去除安卓应用软件中的内容&#xff0c;需要对APP逆向进行修改再打包。 通过工具 MIT管理器工具 提取APK包&#xff0c;点击apk文件&#xff0c;点击查看反编译apk。 搜索关键字。这里关键…...

企业级大模型应用的Java-Python异构融合架构实践

一、后端语言相关技术生态 Python语言 Python在AI计算领域拥有全面的生态支持&#xff1a; 底层工具库: Pandas、NumPy、SciPy、Matplotlib深度学习框架: PyTorch、TensorFlow领域专用框架: HuggingFace Transformers&#xff08;社区生态为主&#xff09; 常见Python框架 …...

深度剖析数据中台架构图,铸造数字文明的基石

🔥🔥 AllData大数据产品是可定义数据中台,以数据平台为底座,以数据中台为桥梁,以机器学习平台为中层框架,以大模型应用为上游产品,提供全链路数字化解决方案。 ✨奥零数据科技官网:http://www.aolingdata.com ✨AllData开源项目:https://github.com/alldatacenter/a…...

python实现基于文心一言大模型的sql小工具

一、准备工作 注册与登录&#xff1a; 登录百度智能云千帆控制台&#xff0c;注册并登录您的账号。 创建千帆应用&#xff1a; 根据实际需求创建千帆应用。创建成功后&#xff0c;获取AppID、API Key、Secret Key等信息。如果已有千帆应用&#xff0c;可以直接查看已有应用的AP…...

飞腾腾锐D2000 + OpenHarmony 4.1release部署deepseek大模型

简介 1.1 飞腾腾锐D2000 飞腾腾锐D2000是一款面向桌面应用的高性能通用处理&#xff0c;集成8个飞腾自主研发的高能效处理器核FTC663&#xff0c;兼 容64位ARMv8指令集并支持ARM64和ARM32两种执行模式&#xff0c;支持单精度、双精度浮点运算指令和ASIMD处理 指令&#xff0c;主…...

进程概念、PCB及进程查看

文章目录 一.进程的概念进程控制块&#xff08;PCB&#xff09; 二.进程查看通过指令查看进程通过proc目录查看进程的cwd和exe获取进程pid和ppid通过fork()创建子进程 一.进程的概念 进程是一个运行起来的程序&#xff0c;而程序是存放在磁盘的&#xff0c;cpu要想执行程序的指…...

Oracle 数据库基础入门(一):搭建数据管理基石

在当今数字化时代&#xff0c;数据库作为数据管理的核心工具&#xff0c;对于各类应用系统的开发至关重要。尤其是在 Java 全栈开发领域&#xff0c;掌握一款强大的数据库技术是必备技能。Oracle 数据库以其卓越的性能、高度的可靠性和丰富的功能&#xff0c;在企业级应用中广泛…...

selenium如何实现,开启浏览器的开发者工具模式,并且开启 toggle移动设备模拟模式

核心实现代码 pythonCopy Code from selenium import webdriver from selenium.webdriver.chrome.options import Options def enable_devtools_with_toggle(): options Options() # 强制开启开发者工具 options.add_argument("--auto-open-devtools-for-tabs&quo…...

分布式锁实现(数据库+Redis+Zookeeper)

1. 数据库分布式锁 实现原理 基于唯一索引&#xff1a; 创建一张锁表&#xff0c;通过唯一索引&#xff08;如锁名称&#xff09;保证互斥性。 加锁&#xff1a;插入一条记录&#xff0c;成功则获取锁&#xff0c;失败则重试。 解锁&#xff1a;删除对应记录。 乐观锁&…...

七、Spring Boot:初识与项目搭建

深入解析 Spring Boot&#xff1a;初识与项目搭建 Spring Boot 是基于 Spring Framework 的开源 Java 基础框架&#xff0c;旨在简化 Spring 应用的开发过程。它通过“约定优于配置”的理念&#xff0c;极大地减少了开发中的配置工作&#xff0c;同时提供了“开箱即用”的功能…...

记录一下用docker克隆某授权制定ip的环境恢复

#首先还是要看日志根据问题去进行调整 java web的老项目配置文件一般是 bin启动里边的脚本 还有conf中的 xml配置文件 再或者就是classes中的配置文件,再或者就是lib中的jar包中的配置文件 1.安装docker 2.创建docker网络 docker network create --driver bridge --subnet…...

【含文档+PPT+源码】基于微信小程序的健康饮食食谱推荐平台的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的健康饮食食谱推荐平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…...

主流虚拟化技术讲解

目录 VMware vSphere Microsoft Hyper-V KVM&#xff08;Kernel-based Virtual Machine&#xff09; OpenStack VMware vSphere 架构与组件&#xff1a;VMware vSphere 是基于裸金属虚拟化技术的平台&#xff0c;核心组件包括 ESXi 主机和 vCenter Server。ESXi 是虚拟化层…...

java开发——为什么要使用动态代理?

举个例子&#xff1a;假如有一个杀手专杀男的&#xff0c;不杀女的。代码如下&#xff1a; public interface Killer {void kill(String name, String sex);void watch(String name); }public class ManKiller implements Killer {Overridepublic void kill(String name, Stri…...

kotlin 知识点一 变量和函数

在Kotlin中定义变量的方式和Java 区别很大&#xff0c;在Java 中如果想要定义一个变 量&#xff0c;需要在变量前面声明这个变量的类型&#xff0c;比如说int a表示a是一个整型变量&#xff0c;String b表 示b是一个字符串变量。而Kotlin中定义一个变量&#xff0c;只允许在变量…...

将CUBE或3DL LUT转换为PNG图像

概述 在大部分情况下&#xff0c;LUT 文件通常为 CUBE 或 3DL 格式。但是我们在 OpenGL Shader 中使用的LUT&#xff0c;通常是图像格式的 LUT 文件。下面&#xff0c;我将教大家如何将这些文件转换为 PNG 图像格式。 条形LUT在线转换&#xff08;不是8x8网络&#xff09;&am…...

侯捷 C++ 课程学习笔记:类的声明与构造函数

目录 一、类的声明 二、内联函数 三、访问级别 四、构造函数 五、构造函数重载 六、实际应用案例 七、学习心得 一、类的声明 类的声明是定义类的基本结构&#xff0c;包括类的成员变量和成员函数。类的声明分为类头和类体两部分。 类头&#xff08;class head&#xf…...

BGP状态和机制

BGP邻居优化 为了增加稳定性,通常建议实验回环口来建立邻居。更新源:建立邻居和邻居所学习到的路由的下一跳。多跳:EBGP邻居建立默认选哟直连,因为TTL=1,如果非直连,必须修改TTL。命令备注peer 2.2.2.2 connect-interface lo1配置更新源peer 2.2.2.2 ebgp-max-hop 2配置T…...

MongoDB 数据库简介

MongoDB 数据库简介 引言 随着互联网技术的飞速发展,数据已经成为企业的重要资产。为了高效地管理和处理这些数据,数据库技术应运而生。MongoDB作为一种流行的NoSQL数据库,因其灵活的数据模型和高效的数据处理能力,受到了广泛的关注。本文将为您详细介绍MongoDB的基本概念…...

浏览器下载vue.js.devtools,谷歌浏览器和edg浏览器

1、谷歌浏览器下载&#xff1a; 情况一&#xff1a;如果谷歌应用商店可以打开&#xff0c;那么就直接到谷歌应用商店下载&#xff0c;直接搜索vue.js.devtools添加扩展即可。 情况二&#xff1a;谷歌浏览器的谷歌应用商城打不开&#xff0c;那么就百度搜索极简插件找到vue.js.…...

Android AOSP系统裁记录

Android 系统裁剪是指根据需求移除不必要的组件和功能&#xff0c;以优化系统性能、减少存储占用或满足特定设备需求。以下是 Android 系统裁剪的基本步骤&#xff1a; 1. 准备环境 操作系统&#xff1a;推荐使用 Ubuntu 或 macOS。 工具&#xff1a; Android SDK Android N…...

Could not download npm for node v14.21.3(nvm无法下载节点v14.21.3的npm)

场景描述&#xff1a;之前的项目用的是node以前的版本&#xff0c;使用nvm没下载下来&#xff0c;npm命令执行不了 错误如下图&#xff0c;15版本的node同理&#xff0c;下载的都是.exe可执行文件的扩展名&#xff0c;使用npm命令终端无法识别 解决思路&#xff1a;去node官网…...

React进阶之React核心源码解析(三)

React核心源码解析 diff多节点比较diff两轮遍历比较第一轮比较第二轮比较Update 状态更新Concurrent Modediff 多节点比较diff isArray方法比较 节点更新// 更新前 <ul><li key="0" className="before">0<li><li key=...

2025吐槽季第一弹---腾讯云EO边缘安全加速平台服务

前言&#xff1a; 关于EO边缘安全加速平台服务 参照&#xff1a;产品概述,具体如下&#xff1a; 边缘安全加速平台 EO&#xff08;Tencent Cloud EdgeOne&#xff0c;下文简称为 EdgeOne&#xff09;是国内首款基于全新架构的真正一体化的边缘安全加速平台。提供全面的安全防…...

Dify自定义工作流集成指南:对接阿里云百炼文生图API的实现方案

dify工作流的应用基本解释 dify应用发布相关地址&#xff1a;应用发布 | Dify 根据官方教程&#xff0c;我们可以看到dify自定义的工作流可以发布为----工具 这个教程将介绍如何通过工作流建立一个使用阿里云百炼文生图模型。 工具则可以给其他功能使用&#xff0c;如agent…...

WebSocket简单介绍 并接入deepseek

目录 什么是 WebSocket&#xff1f;工作原理&#xff1a; 为什么需要 WebSocket&#xff1f;WebSocket 的优势HTTP 和 WebSocket 的区别WebSocket 的劣势WebSocket 的应用场景WebSocket 握手过程1. 客户端发起握手请求2. 服务器响应握手请求3. 建立连接 WebSocket 事件处理WebS…...

android 新增native binder service 方式(三)

书接上回&#xff0c;继续第三种方式&#xff0c;是手动生成 service binder 的方法,项目结构 1&#xff0c;编译aidl aidl 文件保持不变&#xff0c;如何生成Bn和Bp 文件呢。 aidl -I ./libserviceaidl/aidl -h ./ -o ./ --langcpp libserviceaidl/aidl/com/test/IService.a…...

linux--多进程开发(5)--进程

进程间通讯概念 每两个进程之间都是独立的资源分配单元&#xff0c;不同进程之间不能直接访问另一个进程的资源。 但不同的进程需要进行信息的交互和状态的传递等&#xff0c;因此需要进程间通信&#xff08;IPC,inter processes cimmunication) 进程通信的目的&#xff1a; …...

分享httprunner 结合django实现平台接口自动化方案

说明&#xff0c;可以直接在某个视图集定义自定义接口来验证。 调试1&#xff1a;前端界面直接编写yaml文件. 新增要实现存数据到mysql&#xff0c;同时存文件到testcase下, 如test.yaml 更新yaml数据&#xff0c;同时做到更新 testcase下的文件&#xff0c;如test.yaml acti…...

前端面试题之HTML篇

1.src和href的区别 src用于替换当前元素&#xff0c;href用于在当前文档和引用资源之间确立联系。 src可用于img、input、style、script、iframe---同步加载执行 href可用于link、a---异步 1.用途不同 src 用于引入外部资源&#xff0c;通常是图像、视频、JavaScript 文件等&am…...

Selenium 调用模型接口实现功能测试

要使用 Selenium 调用模型接口实现功能测试,可按以下步骤进行: 1. 环境准备 安装 Selenium:使用 pip install selenium 安装 Selenium 库。安装浏览器驱动:根据使用的浏览器(如 Chrome、Firefox 等)下载对应的驱动,并将其添加到系统的环境变量中。例如,Chrome 浏览器需…...

java后端开发day18--学生管理系统

&#xff08;以下内容全部来自上述课程&#xff09; 1.业务分析并搭建主菜单 1.需求 采取控制台的方式去书写学生管理系统 2.分析 1.初始菜单 2.学生类 属性&#xff1a;id&#xff0c;姓名&#xff0c;年龄&#xff0c;家庭住址 3.添加功能 键盘录入每一个学生信息并…...

计算机毕业设计SpringBoot+Vue.jst0图书馆管理系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

【DeepSeek】【GPT-Academic】:DeepSeek集成到GPT-Academic(官方+第三方)

目录 1 官方deepseek 1.1 拉取学术GPT项目 1.2 安装依赖 1.3 修改配置文件中的DEEPSEEK_API_KEY 2 第三方API 2.1 修改DEEPSEEK_API_KEY 2.2 修改CUSTOM_API_KEY_PATTERM 2.3 地址重定向 2.4 修改模型参数 2.5 成功调用 2.6 尝试添加一个deepseek-r1参数 3 使用千帆…...

生成对抗网络(GAN):让机器学习“创造”新世界

目录 引言 什么是生成对抗网络&#xff08;GAN&#xff09;&#xff1f; GAN的核心原理 GAN的损失函数 GAN的变种 1. 条件生成对抗网络&#xff08;Conditional GAN, cGAN&#xff09; 2. 深度卷积生成对抗网络&#xff08;DCGAN&#xff09; 3. 生成对抗网络的 Wassers…...

JavaScript系列(87)--Webpack 高级配置详解

Webpack 高级配置详解 &#x1f6e0;️ Webpack 是前端工程化中最流行的构建工具之一&#xff0c;掌握其高级配置可以帮助我们构建更高效、更优化的应用。本文将深入探讨Webpack的高级配置技巧和最佳实践。 Webpack 核心概念回顾 &#x1f31f; &#x1f4a1; 小知识&#xf…...

48.日常算法

1.面试题 03.06. 动物收容所 题目来源 动物收容所。有家动物收容所只收容狗与猫&#xff0c;且严格遵守“先进先出”的原则。在收养该收容所的动物时&#xff0c;收养人只能收养所有动物中“最老”&#xff08;由其进入收容所的时间长短而定&#xff09;的动物&#xff0c;或…...

MySql数据库运维学习笔记

数据库运维常识 DQL、DML、DCL 和 DDL 是 SQL&#xff08;结构化查询语言&#xff09;中的四个重要类别&#xff0c;它们分别用于不同类型的数据库操作&#xff0c;下面为你简单明了地解释这四类语句&#xff1a; 1. DQL&#xff08;数据查询语言&#xff0c;Data Query Langu…...

Starlink卫星动力学系统仿真建模第十讲-基于SMC和四元数的卫星姿态控制示例及Python实现

基于四元数与滑模控制的卫星姿态控制 一、基本原理 1. 四元数姿态表示 四元数运动学方程&#xff1a; 3. 滑模控制设计 二、代码实现&#xff08;Python&#xff09; 1. 四元数运算工具 import numpy as npdef quat_mult(q1, q2):"""四元数乘法""…...