文章目录

  • 1.什么是Nginx?
  • 2.为什么Nginx性能这么高?
  • 3.Nginx为什么不使用多线程?
  • 4.Nginx是如何处理一个请求的呢?
  • 5.正向代理,反向代理
  • 6.动静态分离
  • 7.为什么要做动、静分离?
  • 8.负载均衡
  • 9.fastcgi 与 cgi 的区别?
  • 10.Nginx 常用命令?
  • 11.使用“反向代理服务器”的优点是什么?
  • 12.请解释 Nginx 如何处理 HTTP 请求?
  • 13.Nginx 有哪些负载均衡策略?
  • 14.如何用Nginx解决前端跨域问题?
  • 15.限流怎么做的?
  • 16.实现三种限流算法

1.什么是Nginx?

Nginx是一个高性能的HTTP和反向代理服务器,常用于做负载均衡服务器

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

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

3.Nginx为什么不使用多线程?

  • Apache Tomcat: 创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会榨干服务器资源。

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

4.Nginx是如何处理一个请求的呢?

首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket,再进行listen

然后再fork出多个子进程出来, 子进程会竞争accept新的连接。

此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后

此时,某一个子进程会accept成功,然后创建nginx对连接的封装,即ngx_connection_t结构体

接着,根据事件调用相应的事件处理模块,如http模块与客户端进行数据的交换。

最后,nginx或客户端来主动关掉连接,到此,一个连接就寿终正寝了

5.正向代理,反向代理

  • 正向代理总结就一句话:代理端代理的是客户端
    比如,国内访问google会被墙挡住,但是可以通过访问其他国家的服务器,达到访问Google的结果
    如果是正向代理的话,就是其他国家的服务器解决了墙的问题,将你的访问直接转发到Google上面
    一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理

  • 反向代理总结就一句话:代理端代理的是服务端
    反向代理就是你压根就不知道你要访问的地址是哪里,但是一去访问一个服务器,但是这个服务器其实是去访问其他的服务器,得到数据后返回给你,你甚至不知道数据来源
    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求,发给内部网络上的服务器并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器

6.动静态分离

  • 动态资源、静态资源分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路
  • 动态资源、静态资源分离简单的概括是:动态文件与静态文件的分离

7.为什么要做动、静分离?

  • 在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件)

  • 这些不需要经过后台处理的文件称为静态文件,否则动态文件。因此我们后台处理忽略静态文件。这会有人又说那我后台忽略静态文件不就完了吗

  • 当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决动、静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问

  • 这里我们将静态资源放到nginx中,动态资源转发到tomcat服务器中,毕竟Tomcat的优势是处理动态请求

8.负载均衡

负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中
负载均衡主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力

9.fastcgi 与 cgi 的区别?

1)cgi

web 服务器会根据请求的内容,然后会 fork 一个新进程来运行外部 c 程序(或 perl 脚本…), 这个进程会把处理完的数据返回给 web 服务器,最后 web 服务器把内容发送给用户,刚才 fork 的进程也随之退出。

如果下次用户还请求改动态脚本,那么 web 服务器又再次 fork 一个新进程,周而复始的进行。

2)fastcgi

web 服务器收到一个请求时,他不会重新 fork 一个进程(因为这个进程在 web 服务器启动时就开启了,而且不会退出),web 服务器直接把内容传递给这个进程(进程间通信,但 fastcgi 使用了别的方式,tcp 方式通信),这个进程收到请求后进行处理,把结果返回给 web 服务器,最后自己接着等待下一个请求的到来,而不是退出。

10.Nginx 常用命令?

  • 启动 nginx 。
  • 停止 nginx -s stop 或 nginx -s quit 。
  • 重载配置 ./sbin/nginx -s reload(平滑重启) 或 service nginx reload 。
  • 重载指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf 。
  • 查看 nginx 版本 nginx -v 。
  • 检查配置文件是否正确 nginx -t 。
  • 显示帮助信息 nginx -h 。

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

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

12.请解释 Nginx 如何处理 HTTP 请求?

  • 首先,Nginx 在启动时,会解析配置文件,得到需要监听的端口与 IP 地址,然后在 Nginx 的 Master 进程里面先初始化好这个监控的Socket(创建 S ocket,设置 addr、reuse 等选项,绑定到指定的 ip 地址端口,再 listen 监听)。

  • 然后,再 fork(一个现有进程可以调用 fork 函数创建一个新进程。由 fork 创建的新进程被称为子进程 )出多个子进程出来。

  • 之后,子进程会竞争 accept 新的连接。此时,客户端就可以向 nginx 发起连接了。当客户端与nginx进行三次握手,与 nginx 建立好一个连接后。此时,某一个子进程会 accept 成功,得到这个建立好的连接的 Socket ,然后创建 nginx 对连接的封装,即 ngx_connection_t 结构体。

  • 接着,设置读写事件处理函数,并添加读写事件来与客户端进行数据的交换。

  • 最后,Nginx 或客户端来主动关掉连接,到此,一个连接就寿终正寝了。

13.Nginx 有哪些负载均衡策略?

负载均衡,即是代理服务器将接收的请求均衡的分发到各服务器中。

Nginx 默认提供了 3 种负载均衡策略:

  • 1、轮询(默认)round_robin
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

  • 2、IP 哈希 ip_hash
    每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 共享的问题。
    当然,实际场景下,一般不考虑使用 ip_hash 解决 session 共享。

  • 3、最少连接 least_conn
    下一个请求将被分派到活动连接数量最少的服务器。
    通过 Nginx 插件,我们还可以引入 fair、url_hash 等负载均衡策略。

14.如何用Nginx解决前端跨域问题?

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

15.限流怎么做的?

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

  • 限流有3种

    • 正常限制访问频率(正常流量)
    • 突发限制访问频率(突发流量)
    • 限制并发连接数
  • Nginx的限流都是基于漏桶流算法,底下会说道什么是桶铜流

16.实现三种限流算法

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

  • 限制一个用户发送的请求,我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就会拒绝处理该用户请求。

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

  • 限制一个用户发送的请求,我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就漏掉不接受你的请求

3、 限制并发连接数

  • 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是基于漏桶算法原理实现的,实际上限流一般都是基于漏桶算法和令牌桶算法实现的。接下来我们来看看两个算法的介绍:

漏桶流算法和令牌桶算法知道?

漏桶算法

  • 桶算法是网络世界中流量整形或速率限制时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。也就是我们刚才所讲的情况。漏桶算法提供的机制实际上就是刚才的案例:突发流量会进入到一个漏桶,漏桶会按照我们定义的速率依次处理请求,如果水流过大也就是突发流量过大就会直接溢出,则多余的请求会被拒绝。所以漏桶算法能控制数据的传输速率。

令牌桶算法

  • 令牌桶算法是网络流量整形和速率限制中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。令牌桶算法的机制如下:存在一个大小固定的令牌桶,会以恒定的速率源源不断产生令牌。如果令牌消耗速率小于生产令牌的速度,令牌就会一直产生直至装满整个令牌桶。

nginx负载均衡面试题相关推荐

  1. Nginx负载均衡的详细配置及使用案例

    Nginx负载均衡的详细配置及使用案例详解 感谢看过这一些列博文和评论的小伙伴, 我把自己所看到的学到的拿到这里来分享是想和大家一起学习进步, 想听听园友给出的意见, 也是对自己学习过程的一个总结.  ...

  2. Nginx负载均衡集群介绍

    第1章 集群介绍 1.1 集群简介 1.1.1 什么是集群 简单说,集群就是一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行 ...

  3. [ 总结 ] nginx 负载均衡 及 缓存

    操作系统:centos6.4 x64 前端使用nginx做反向代理,后端服务器为:apache + php + mysql 1. nginx负载均衡. nginx编译安装(编译安装前面的文章已经写过) ...

  4. docker初体验:docker部署nginx负载均衡集群

    Docker 是一个用于开发,交付和运行应用程序的开放平台.Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件.今天来为大家演示一下docker部署nginx负载均衡集群 环境 ce ...

  5. 【CentOS 7LNMP架构33】,nginx负载均衡#180109

    2019独角兽企业重金招聘Python工程师标准>>> hellopasswd nginx负载均衡 多台代理服务器 vi /usr/local/nginx/conf/vhost/lo ...

  6. Keepalived+LVS+Nginx负载均衡之高可用

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致 ...

  7. Nginx负载均衡+tomcat+session共享

    为什么80%的码农都做不了架构师?>>>    本文,是笔者工作之余写的,第一是把之前打系统框架的步骤记录下来.第二是将这个过程,谈不上经验,奉献给正在撘这种框架遇到各种bug,各种 ...

  8. Nginx负载均衡:分布式/热备Web Server的搭建

    Nginx是一款轻量级的Web server/反向代理server及电子邮件(IMAP/POP3)代理server.并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开 ...

  9. Nginx负载均衡与配置Nginx的ssl

    2019独角兽企业重金招聘Python工程师标准>>> Nginx负载均衡 什么是负载均衡? 负载均衡就是,把请求均衡地分发到后端的各个机器上面. 比如,A B C D 四台WEB服 ...

最新文章

  1. 容器管理大战:Kubernetes vs.Docker Swarm与Amazon ECS
  2. html图片显示和夫宽一样,功夫:HTML和CSS?
  3. java中读取文件的方法
  4. DayDayUp:《复仇者联盟4:终局之战》娱乐闲谈——当灭霸碰上一个处女座的程序猿
  5. 【NLP】人大团队研究:面向文本生成,预训练模型进展梳理
  6. [BUUCTF-pwn]——axb_2019_fmt32
  7. Gradle入门:我们的第一个Java项目
  8. 从SqlServer转手Oracle的一些坑
  9. php imagefill,PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
  10. 软件工程第三次作业(最大子段和)
  11. 金阳光测试算法专题——精选小算法汇总
  12. go generate 生成代码
  13. Pr 视频效果:过渡、透视、通道
  14. Java【递归及过滤器】
  15. 计算机信息系统集成高级工程师,软考信息系统项目管理师(高级资格/高级工程师)简介...
  16. pvs linux_Linux下用于C ++开发的PVS-Studio静态分析器入门
  17. 2015校园O2O商业模式解析——从水果切入
  18. 从头到尾理解假设检验
  19. vue.runtime.esm.js?2b0e:619 [Vue warn]: Property “XX“ must be accessed with “$data._tos“ because
  20. matlab脚本文件求梯度,转:用MATLAB求梯度的二个实例

热门文章

  1. 踔厉奋发,笃行不怠,我的第一篇CSDN文章
  2. 韩顺平java--Collection 集合专题
  3. 显示屏flicker闪烁 测试 计算软件
  4. 华兴资本年营收25亿:净利16亿 同比增56.5%
  5. Bypass WAF常规绕过思路
  6. 项目启动会发言稿(范文三)
  7. Java 如何学习?这份5000页Java学习手册值得拥有,适合零基础自学也适合查漏补缺!
  8. 从码农到工程师,只要做到这六点
  9. 软件测试(十五)—— Web专项测试
  10. soc 设计soc设计 uml实务手册_SoC技术的发展