写点什么

Nginx 面试三连问:如何工作?负载均衡策略有哪些

用户头像
极客good
关注
发布于: 刚刚

8、Nginx 和 Apache、Tomcat 之间的不同点

1、Nginx/Apache 是 Web Server,而 Apache Tomact 是一个 servlet container2、tomcat 可以对 jsp 进行解析,nginx 和 apache 只是 web 服务器,可以简单理解为只能提供 html 静态文件服务。


Nginx 和 Apache 区别:


1)Nginx 轻量级,同样起 web 服务,比 apache 占用更少的内存及资源 。


2)Nginx 抗并发,nginx 处理请求是异步非阻塞的,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能 。


3)Nginx 提供负载均衡,可以做做反向代理,前端服务器


4)Nginx 多进程单线程,异步非阻塞;Apache 多进程同步,阻塞。

9、Nginx 有哪些负载均衡策略

Nginx 默认提供的负载均衡策略:


  • 1、轮询(默认)round_robin


每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。


  • 2、IP 哈希 ip_hash


每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 共享的问题。

当然,实际场景下,一般不考虑使用 ip_hash 解决 session 共享。


  • 3、最少连接 least_conn


下一个请求将被分派到活动连接数量最少的服务器


  • 4、权重 weight


weight 的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下,达


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


到合理的资源利用率。


还可以通过插件支持其他策略。

10、Nginx 动静态资源分离做过吗,为什么要这样做?

动态资源、静态资源分离,是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来 路。


比如说 js、css、hrml 从 A 服务器返回。图片 从 B 服务器返回,其他请求从 Tomcat 服务器 C 返回。


后台应用分开部署,提高用户访问静态代码的速度。而且现在还有 CDN 服务,不需要限制于服务器的带宽。

11、ngx_http_upstream_module 模块了解吗?

ngx_http_upstream_module 模块用于将多个服务器定义成服务器组,可通过 fastcgi 传递、proxy 传递、uwsgi 传递、memcached 传递和 scgi 传递指令来引用的服务器组。


比如访问 www.a.com 缓存+调度:


http{proxy_cache_path?/var/cache/nginx/proxy_cache?levels=1:2:2?keys_zone=proxycache:20m?inactive=120s?max_si?#缓存 ze=1g;upstream?mysqlsrvs{ip_hash;?#源地址 hash 调度方法?写了 backup 就不可用 server?172.18.99.1:80?weight=2;?#weight 权重 server?172.18.99.2:80;??????????#标记 down,配合 ip_hash 使用,实现灰度发布 server?172.18.99.3:80?backup;???#backup 将服务器标记为“备用”,即所有服务器均不可用时才启用?}}server{server_name?www.a.com;proxy_cache?proxycache;proxy_cache_key?$request_uri;proxy_cache_valid?200?302?301?1h;proxy_cache_valid?any?1m;location?/?{proxy_pass?http://mysqlsrvs;}}

12、限流了解吗,怎么限流的?

Nginx 提供两种限流方式,一是控制速率,二是控制并发连接数。

1、控制速率

ngx_http_limit_req_module?模块提供了漏桶算法(leaky bucket),可以限制单个 IP 的请求处理频率。


如:


1.1 正常限流:


http?{limit_req_zone?192.168.1.1?zone=myLimit:10m?rate=5r/s;}


server?{location?/?{limit_req?zone=myLimit;rewrite?/?http://www.hac.cn?permanent;}}


参数解释:


key:?定义需要限流的对象。zone:?定义共享内存区来存储访问信息。rate:?用于设置最大访问速率。


表示基于客户端 192.168.1.1 进行限流,定义了一个大小为 10M,名称为 myLimit 的内存区,用于存储 IP 地址访问信息。


rate 设置 IP 访问频率,rate=5r/s 表示每秒只能处理每个 IP 地址的 5 个请求。


Nginx 限流是按照毫秒级为单位的,也就是说 1 秒处理 5 个请求会变成每 200ms 只处理一个请求。如果 200ms 内已经处理完 1 个请求,但是还是有有新的请求到达,这时候 Nginx 就会拒绝处理该请求。


1.2 突发流量限制访问频率


上面 rate 设置了?5r/s,如果有时候流量突然变大,超出的请求就被拒绝返回 503 了,突发的流量影响业务就不好了。


这时候可以加上 burst?参数,一般再结合?nodelay?一起使用。


server?{location?/?{limit_req?zone=myLimit?burst=20?nodelay;rewrite?/?http://www.hac.cn?permanent;}}


burst=20 nodelay?表示这 20 个请求立马处理,不能延迟,相当于特事特办。不过,即使这 20 个突发请求立马处理结束,后续来了请求也不会立马处理。


burst=20?相当于缓存队列中占了 20 个坑,即使请求被处理了,这 20 个位置也只能按 100ms 一个来释放。

2、控制并发连接数

ngx_http_limit_conn_module?提供了限制连接数功能。


limit_conn_zone?server_name?zone=perserver:10m;


server?{...limit_conn?perip?10;limit_conn?perserver?100;}


limit_conn perip 10?作用的 key 是?$binary_remote_addr,表示限制单个 IP 同时最多能持有 10 个连接。


limit_conn perserver 100?作用的 key 是?$server_name,表示虚拟主机(server) 同时能处理并发连接的总数。


注:limit_conn perserver 100?作用的 key 是?$server_name,表示虚拟主机(server) 同时能处理并发连接的总数。

拓展:

如果不想做限流,还可以设置白名单:


利用 Nginx?ngx_http_geo_module?和?ngx_http_map_module?两个工具模块提供的功能。


##定义白名单 ip 列表变量 geo?$limit?{default?1;10.0.0.0/8?0;192.168.0.0/10?0;81.56.0.35?0;}


map?limit_key?{0?"";1?binary_remote_addr;}#?正常限流设置limit_req_zone?limit_key?zone=myRateLimit:10m?rate=10r/s;


geo?对于白名单 将返回 0,不限流;其他 IP 将返回 1,进行限流。


具体参考:http://nginx.org/en/docs/http/ngx_http_geo_module.html


除此之外:

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Nginx面试三连问:如何工作?负载均衡策略有哪些