基础配置
部署history路由
部署hash路由
面试题
1、nginx如何进行流量按比例转发?
在 Nginx 中,可以通过 加权轮询(Weighted Round Robin) 或 split_clients 模块来实现 流量按比例转发。以下是两种常见的实现方式:
1. 加权轮询(Weighted Round Robin)
加权轮询是 Nginx 默认支持的负载均衡策略之一。通过为不同的后端服务器分配不同的权重,可以实现流量按比例转发。
(1) 配置示例
ini 体验AI代码助手 代码解读复制代码http {
upstream backend {
server backend1.example.com weight=3; # 权重为 3
server backend2.example.com weight=2; # 权重为 2
server backend3.example.com weight=1; # 权重为 1
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
(2) 说明
weight参数表示权重,权重越高,分配的流量越多。- 上述配置中,
backend1会接收 50% 的流量(3/(3+2+1)),backend2会接收 33.3% 的流量,backend3会接收 16.7% 的流量。
(3) 适用场景
- 适用于简单的流量按比例转发需求。
- 权重是静态的,无法根据请求内容动态调整。
2. 使用 split_clients 模块
split_clients 是 Nginx 的一个模块,可以根据变量的值将流量按比例分配到不同的后端服务器。
(1) 配置示例
perl 体验AI代码助手 代码解读复制代码http {
# 定义流量分配比例
split_clients "${remote_addr}${http_user_agent}" $backend {
50% backend1; # 50% 的流量转发到 backend1
30% backend2; # 30% 的流量转发到 backend2
* backend3; # 剩余的 20% 流量转发到 backend3
}
upstream backend1 {
server backend1.example.com;
}
upstream backend2 {
server backend2.example.com;
}
upstream backend3 {
server backend3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://$backend;
}
}
}
(2) 说明
split_clients根据${remote_addr}${http_user_agent}的值生成一个哈希值,并根据比例分配流量。- 上述配置中:
- 50% 的流量会转发到
backend1。 - 30% 的流量会转发到
backend2。 - 剩余的 20% 流量会转发到
backend3。
- 50% 的流量会转发到
(3) 适用场景
- 适用于需要根据请求内容动态分配流量的场景。
- 可以根据客户端 IP、User-Agent 等变量进行流量分配。
3. 使用 map 模块
map 模块也可以实现流量按比例转发,类似于 split_clients,但更加灵活。
(1) 配置示例
perl 体验AI代码助手 代码解读复制代码http {
# 定义流量分配比例
map $remote_addr $backend {
default backend3; # 默认转发到 backend3
~^1\.1\.1\.1 backend1; # 特定 IP 转发到 backend1
~^2\.2\.2\.2 backend2; # 特定 IP 转发到 backend2
}
upstream backend1 {
server backend1.example.com;
}
upstream backend2 {
server backend2.example.com;
}
upstream backend3 {
server backend3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://$backend;
}
}
}
(2) 说明
-
map模块根据${remote_addr}的值匹配规则,并将流量转发到对应的后端服务器。 -
上述配置中:
IP 为
1.1.1.1的请求会转发到backend1。IP 为
2.2.2.2的请求会转发到backend2。其他请求会转发到
backend3。
(3) 适用场景
- 适用于需要根据特定条件(如 IP、Header 等)动态分配流量的场景。
4. 总结
方法
特点
适用场景
加权轮询
简单易用,静态权重分配
简单的流量按比例转发需求
split_clients
根据变量值动态分配流量
需要动态分配流量的场景
map
根据条件(如 IP、Header)动态分配流量
需要复杂条件匹配的场景
根据具体需求选择合适的流量分配方式,可以灵活地实现流量按比例转发。
如果有大佬觉得我有讲的不对的地方大家可以帮我指正指正,可以在评论区跟我讲讲,虚心请教。
2、说一说正向代理和反向代理
正向代理
我们常说的代理也就是指正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求。
反向代理
这种代理模式下,它隐藏了真实的服务端,当我们向一个网站发起请求的时候,背后可能有成千上万台服务器为我们服务,具体是哪一台,我们不清楚,我们只需要知道反向代理服务器是谁就行,而且反向代理服务器会帮我们把请求转发到真实的服务器那里去,一般而言反向代理服务器一般用来实现负载平衡。
3、负载均衡的两种实现方式?
一种是使用反向代理的方式,用户的请求都发送到反向代理服务上,然后由反向代理服务器来转发请求到真实的服务器上,以此来实现集群的负载平衡。
另一种是 DNS 的方式,DNS 可以用于在冗余的服务器上实现负载平衡。因为现在一般的大型网站使用多台服务器提供服务,因此一个域名可能会对应多个服务器地址。当用户向网站域名请求的时候,DNS 服务器返回这个域名所对应的服务器 IP 地址的集合,但在每个回答中,会循环这些 IP 地址的顺序,用户一般会选择排在前面的地址发送请求。以此将用户的请求均衡的分配到各个不同的服务器上,这样来实现负载均衡。这种方式有一个缺点就是,由于 DNS 服务器中存在缓存,所以有可能一个服务器出现故障后,域名解析仍然返回的是那个 IP 地址,就会造成访问的问题。
参考:
Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...想要的这都有!
Docker + Jenkins + Nginx实现前端自动化部署