关于java:Nginx常见的面试题限流正向反向代理负载均衡策略

36次阅读

共计 5577 个字符,预计需要花费 14 分钟才能阅读完成。

1、什么是 Nginx,谈谈集体都了解,我的项目中是否用到,为什么要用,有什么长处?

Nginx,是一个 Web 服务器和反向代理服务器用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协定。

次要性能如下:

1、正向、反向代理
2、负载平衡、分流
3、虚拟主机(绑定 host)

长处:

跨平台、配置简略,非阻塞、高并发连贯、内存耗费小、老本低廉。

2、正向代理和反向代理的区别是什么?

正向代理 是一个位于客户端和原始服务器之间的服务器,为了从原始服务器获得内容,客户端向代理发送一个申请并指定原始服务器,而后代理向原始服务器转交申请并将取得的内容返回给客户端。代理服务器和客户端处于同一个局域网内。

比如说 fanqiang。我晓得我要拜访谷歌,于是我就通知代理服务器让它帮我转发。

反向代理 理论运行形式是代理服务器承受网络上的连贯申请。它将申请转发给外部网络上的服务器,并将从服务器上失去的后果返回给网络上申请连贯的客户端。代理服务器和原始服务器处于同一个局域网内。

比如说我要拜访 taobao,对我来说不晓得图片、json、css 是不是同一个服务器返回回来的,然而我不关怀,是反向代理 解决的,我不晓得原始服务器。

3、Nginx 如何解决 HTTP 申请的?

它联合多过程机制(单线程)和异步非阻塞形式。

1、多过程机制(单线程)

服务器每当收到一个客户端时,就有 服务器主过程(master process)生成一个 子过程(worker process)进去和客户端建设连贯进行交互,直到连贯断开,该子过程就完结了。

2、异步非阻塞机制

每个工作过程 应用 异步非阻塞形式,能够解决 多个客户端申请。使用了 epoll 模型,提供了一个队列,排队解决。

当某个 工作过程 接管到客户端的申请当前,调用 IO 进行解决,如果不能立刻失去后果,就去 解决其余申请(即为 非阻塞);而 客户端 在此期间也 无需期待响应,能够去解决其余事件(即为 异步)。

当 IO 返回时,就会告诉此 工作过程;该过程失去告诉,临时 挂起 以后解决的事务去 响应客户端申请。

为什么这么快?能够参考一下 Nginx 官网介绍:http://www.aosabook.org/en/ng…

4、Nginx 的 master 和 worker 是如何工作的?

这跟 Nginx 的多过程、单线程无关。(一个过程只有一个主线程)。

为什么要用单线程?

采纳单线程来异步非阻塞解决申请(管理员能够配置 Nginx 主过程的工作过程的数量),不会为每个申请调配 cpu 和内存资源,节俭了大量资源,同时也缩小了大量的 CPU 的上下文切换,所以才使得 Nginx 反对更高的并发。

简略过程:

主程序 Master process 启动后,通过一个 for 循环来 接管 和 解决内部信号;

主过程通过 fork() 函数产生 worker 子过程,每个子过程执行一个 for 循环来实现 Nginx 服务器对事件的接管和解决。

具体过程:

1、Nginx 在启动后,会有一个 master 过程和多个互相独立的 worker 过程。
2、master 接管来自外界的信号,先建设好须要 listen 的 socket(listenfd)之后,而后再 fork 出多个 worker 过程,而后向各 worker 过程发送信号,每个过程都有可能来解决这个连贯。
3、所有 worker 过程的 listenfd 会在新连贯到来时变得可读,为保障只有一个过程解决该连贯,所有 worker 过程在注册 listenfd 读事件前抢占 accept_mutex,抢到互斥锁的那个过程注册 listenfd 读事件,在读事件里调用 accept 承受该连贯。
4、当一个 worker 过程在 accept 这个连贯之后,就开始读取申请、解析申请、解决申请,产生数据后,再返回给客户端,最初才断开连接。

5、Nginx 常用命令有哪些?

  • 启动 nginx
  • 进行 nginx -s stopnginx -s quit
  • 重启 nginx -s reloadservice nginx reload
  • 重载指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf
  • 查看 nginx 版本 nginx -v

6、nginx 中 500、502、503、504 有什么区别?

500

Internal Server Error 外部服务谬误,比方脚本谬误,编程语言语法错误。

502

Bad Gateway 谬误,网关谬误。比方服务器以后连贯太多,响应太慢,页面素材太多、带宽慢。

503

Service Temporarily Unavailable,服务不可用,web 服务器不能解决 HTTP 申请,可能是长期超载或者是服务器进行停机保护。

504

Gateway timeout 网关超时,程序执行工夫过长导致响应超时,例如程序须要执行 20 秒,而 nginx 最大响应等待时间为 10 秒,这样就会呈现超时。

7、Nginx 压缩理解吗,如何开启压缩?

开启 nginx gzip 压缩后,图片、css、js 等动态资源的大小会减小,可节俭带宽,进步传输效率,然而会耗费 CPU 资源。

开启:

    # 开启 gzip
    gzip off;

    # 启用 gzip 压缩的最小文件,小于设置值的文件将不会压缩
    gzip_min_length 1k;

    # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用 CPU 工夫,前面会有具体阐明
    gzip_comp_level 1;

    # 进行压缩的文件类型。javascript 有多种形式。其中的值能够在 mime.types 文件中找到。gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;

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

1、Nginx/Apache 是 Web Server, 而 Apache Tomact 是一个 servlet container
2、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 的值越大调配到的拜访概率越高,次要用于后端每台服务器性能不平衡的状况下,达到正当的资源利用率。

还能够通过插件反对其余策略。

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 $binary_remote_addr zone=perip:10m;
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_modulengx_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 $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_core_module 还提供了限度数据传输速度的能力(即常说的下载速度)

location /flv/ {
    flv;
    limit_rate_after 500m;
    limit_rate       50k;
}

针对每个申请,示意客户端下载前 500m 的大小时不限速,下载超过了 500m 后就限速 50k/s。

正文完
 0