Nginx面试

70 阅读1分钟

基础配置

部署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
(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一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...想要的这都有!

Nginx 从入门到实践,万字详解!

前端必会的 Nginx入门视频教程(共11集)

Docker + Jenkins + Nginx实现前端自动化部署

一步步实现Nginx +Docker + Jenkins前端自动化部署

基于Docker+Nginx+Jenkins的前端自动化部署实践