《2021最新Java面试题全集-2021年第二版》不断更新完善!

    

第十六章 Nginx

1:为什么要用Nginx

跨平台、配置简单、方向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,内存消耗小:开启10nginx才占150M内存 ,nginx处理静态文件好,耗费内存少,

 

而且Nginx内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。

 

使用Nginx的话还能:

节省宽带:支持GZIP压缩,可以添加浏览器本地缓存

稳定性高:宕机的概率非常小

接收用户请求是异步的

 

2:为什么Nginx性能这么高?

因为他的事件处理机制:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决

 

3:Nginx怎么处理请求的?

nginx接收一个请求后,首先由listenserver_name指令匹配server模块,再匹配server模块里的locationlocation就是实际地址

    server { # 第一个Server区块开始,表示一个独立的虚拟主机站点

        listen       80 # 提供服务的端口,默认80

        server_name  localhost # 提供服务的域名主机名

        location / {   # 第一个location区块开始

            root   html  # 站点的根目录,相当于Nginx的安装目录

            index  index.html index.htm# 默认的首页文件,多个用空格分开

        }                # 第一个location区块结果

 

4:什么是正向代理和反向代理?

正向代理就是一个人发送一个请求直接就到达了目标的服务器

反方代理就是请求统一被Nginx接收,nginx反向代理服务器接收到之后,按照一定的规 则分发给了后端的业务处理服务器进行处理了

使用“反向代理服务器的优点是什么?

反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务时。

 

5:Nginx的优缺点?

优点:

占内存小,可实现高并发连接,处理响应快

可实现http服务器、虚拟主机、方向代理、负载均衡

Nginx配置简单

可以不暴露正式的服务器IP地址

缺点:

动态处理差:nginx处理静态文件好,耗费内存少,但是处理动态页面则很鸡肋,现在一般前端用nginx作为反向代理抗住压力

 

6:Nginx应用场景?

1Http服务器:Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。

2)虚拟主机:可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。

3)反向代理,负载均衡:当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。

4nginx 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

 

7:Nginx静态资源?

静态资源访问,就是存放在nginxhtml页面,我们可以自己编写

 

8:如何用Nginx解决前端跨域问题?

使用Nginx转发请求。把跨域的接口写成调本域的接口,然后将这些接口转发到真正的请求地址

 

9:Nginx虚拟主机怎么配置?

1)基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站

2)基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台

3)基于ip的虚拟主机。

 

10:location的作用是什么?

location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

 

11:限流怎么做的?

Nginx限流就是限制用户请求速度,防止服务器受不了

限流有3种:

正常限制访问频率(正常流量)

突发限制访问频率(突发流量)

限制并发连接数

 

Nginx的限流都是基于漏桶算法

 

12:如何限制访问频率(正常流量)?

限制Nginx多久接收一个来自同一个用户发送的请求。

Nginx中使用ngx_http_limit_req_module模块来限制的访问频率,限制的原理实质是基于漏桶算法原理来实现的。在nginx.conf配置文件中可以使用limit_req_zone命令及limit_req命令限制单个IP的请求处理频率。

 

    #定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉

    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;

 

    #绑定限流维度

    server{

       location/seckill.html{

           limit_req zone=zone;

           proxy_pass http://lj_seckill;

       }

    }

 

1r/s代表1秒一个请求,1r/m一分钟接收一个请求, 如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求

13:如何限制突发访问频率(突发流量)?

限制Nginx多久接收一个同一个用户发送的请求。

上面的配置一定程度可以限制访问频率,但是也存在着一个问题:如果突发流量超出请求被拒绝处理,无法处理活动时候的突发流量,这时候应该如何进一步处理呢?Nginx提供burst参数结合nodelay参数可以解决流量突发的问题,可以设置能处理的超过设置的请求数外能额外处理的请求数。我们可以将之前的例子添加burst参数以及nodelay参数:

 

    #定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉

    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;

 

    #绑定限流维度

    server{

       location/seckill.html{

           limit_req zone=zone burst=5 nodelay;

           proxy_pass http://lj_seckill;

       }

    }

 

为什么就多了一个 burst=5 nodelay; 呢,多了这个可以代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落,没有其他用户的请求我就处理你的,有其他的请求的话我Nginx就漏掉不接受你的请求

 

14:怎么控制并发连接数?

Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,可以使用limit_conn_zone指令以及limit_conn执行进行配置。接下来我们可以通过一个简单的例子来看下:

    http {

       limit_conn_zone $binary_remote_addr zone=myip:10m;

       limit_conn_zone $server_name zone=myServerName:10m;

    }

 

    server {

        location / {

            limit_conn myip 10;

            limit_conn myServerName 100;

            rewrite / http://www.lijie.net permanent;

        }

    }

 

上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。当然,只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。刚才有提到过Nginx是基于漏桶算法原理实现的,实际上限流一般都是基于漏桶算法和令牌桶算法实现的。

 

15:漏桶算法?

漏桶算法是网络世界中流量整形或速率限制时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。

漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。

 

漏桶算法提供的机制实际上就是刚才的案例:突发流量会进入到一个漏桶,漏桶会按照我们定义的速率依次处理请求,如果水流过大也就是突发流量过大就会直接溢出,则多余的请求会被拒绝。所以漏桶算法能控制数据的传输速率。

 

16:令牌桶算法?

令牌桶算法是网络流量整形和速率限制中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。

 

令牌桶算法的机制如下:存在一个大小固定的令牌桶,会以恒定的速率源源不断产生令牌。如果令牌消耗速率小于生产令牌的速度,令牌就会一直产生直至装满整个令牌桶。

 

 

17:为什么要做动静分离?

Nginx是当下最热的Web容器,网站优化的重要点在于静态化网站,网站静态化的关键点则是是动静分离,动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们则根据静态资源的特点将其做缓存操作。

 

让静态的资源只走静态资源服务器,动态的走动态的服务器

 

Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。

 

对于静态资源比如图片,jscss等文件,我们则在反向代理服务器nginx中进行缓存。这样浏览器在请求一个静态资源时,代理服务器nginx就可以直接处理,无需将请求转发给后端服务器tomcat

若用户请求的动态文件,比如servlet,jsp则转发给Tomcat服务器处理,从而实现动静分离。这也是反向代理服务器的一个重要的作用。

 

18:Nginx怎么做的动静分离?

只需要指定路径对应的目录。location/可以使用正则表达式匹配。并指定对应的硬盘中的目录

 

19:Nginx负载均衡的算法怎么实现的?策略有哪些?

为了避免服务器崩溃,会通过负载均衡的方式来分担服务器压力。将多台服务器组成一个集群,当用户访问时,先访问到一个转发服务器,再由转发服务器将访问分发到压力更小的服务器。

 

Nginx负载均衡实现的策略有以下五种:

 

1) 轮询(默认) round_robin

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。

upstream backserver {

 server 192.168.0.12;

 server 192.168.0.13;

}

 

2) 权重 weight

weight的值越大分配

 

到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。其次是为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

 

upstream backserver {

 server 192.168.0.12 weight=2;

 server 192.168.0.13 weight=8;

}

 

权重越高,在被访问的概率越大,如上例,分别是20%80%

3 ip_hash( IP绑定)

每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题

upstream backserver {

 ip_hash;

 server 192.168.0.12:88;

 server 192.168.0.13:80;

}

4)最少连接 least_conn

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

5 fair(第三方插件)

必须安装upstream_fair模块。

 

对比 weightip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。

 

upstream backserver {

 server server1;

 server server2;

 fair;

}

 

哪个服务器的响应速度快,就将请求分配到那个服务器上。

6url_hash(第三方插件)

必须安装Nginxhash软件包

 

按访问urlhash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。

 

upstream backserver {

 server squid1:3128;

 server squid2:3128;

 hash $request_uri;

 hash_method crc32;

}

 

20:Rewrite全局变量有哪些?

 

21:正向代理和反向代理的区别是什么?

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

 

比如说翻墙,我知道我要访问谷歌,于是我就告诉代理服务器让它帮我转发。

 

反向代理实际运行方式是代理服务器接受网络上的连接请求。它将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户端 。代理服务器和原始服务器处于同一个局域网内。

 

比如说我要访问taobao,对我来说不知道图片、jsoncss 是不是同一个服务器返回回来的,但是我不关心,是反向代理处理的,我不知道原始服务器。

 

22:Nginx如何处理HTTP请求的?

它结合多进程机制(单线程)和异步非阻塞方式。

1)多进程机制(单线程)

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

2)异步非阻塞机制

每个工作进程 使用 异步非阻塞方式 ,可以处理 多个客户端请求 。运用了epoll模型,提供了一个队列,排队解决。

 

当某个 工作进程 接收到客户端的请求以后,调用 IO 进行处理,如果不能立即得到结果,就去 处理其他请求 (即为 非阻塞 );而 客户端 在此期间也 无需等待响应 ,可以去处理其他事情(即为 异步 )。

 

IO 返回时,就会通知此 工作进程 ;该进程得到通知,暂时 挂起 当前处理的事务去 响应客户端请求 。

 

23:Nginxmasterworker是如何工作的?

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

为什么要用单线程?

采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换,所以才使得Nginx支持更高的并发。

 

简单过程:

主程序 Master process 启动后,通过一个 for 循环来 接收 和 处理外部信号 ;

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

 

详细过程:

1Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。

2master 接收来自外界的信号,先建立好需要 listen socketlistenfd) 之后,然后再 fork 出多个 worker 进程,然后向各worker进程发送信号,每个进程都有可能来处理这个连接。

3)所有 worker 进程的 listenfd 会在新连接到来时变得可读 ,为保证只有一个进程处理该连接,所有 worker 进程在注册 listenfd 读事件前抢占 accept_mutex ,抢到互斥锁的那个进程注册 listenfd 读事件 ,在读事件里调用 accept 接受该连接。

4)当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求,产生数据后,再返回给客户端 ,最后才断开连接。

 

 

24:Nginx500502503504 有什么区别?

500Internal Server Error 内部服务错误,比如脚本错误,编程语言语法错误。

502Bad Gateway错误,网关错误。比如服务器当前连接太多,响应太慢,页面素材太多、带宽慢。

503Service Temporarily Unavailable,服务不可用,web服务器不能处理HTTP请求,可能是临时超载或者是服务器进行停机维护。

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