文章目录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.3如何实现三种限流算法Nginx实现高并发性?
什么是Nginx?
Nginx是一种高性能的HTTP和反向代理服务器,经常用作负载平衡服务器
2 .为什么Nginx的性能这么高? 多亏了那个事件处理机制:
异步无阻塞事件处理机制:利用epoll模型提供队列并在队列中解决
3.Nginx为什么不使用多线程? Apache Tomcat:创建多个进程或线程,每个进程或线程为其分配cpu和内存,工作器支持大于perfork的并发,并在大会结束后榨取服务器资源。
Nginx:使用单线程异步处理请求。 管理员可以配置Nginx主进程的工作机数量。 (epoll )大大节省了资源,也大大减少了cpu上下文开关,而无需为每个请求分配cpu和内存资源。 因此,Nginx支持更高的并发。
4.Nginx是如何处理请求的? 首先,nginx在启动时解析配置文件,获取应监听的端口和ip地址,在nginx的master进程中初始化此监视的套接字后进行侦听
然后,fork发出多个子进程,子进程冲突accept的新连接。
此时,客户端可以开始连接到nginx。 在客户端与nginx握手三次并建立与nginx的连接后
此时,子进程成功接受,并封装nginx对连接,即创建ngx_connection_t结构
然后,根据事件,调用相应的事件处理模块(如http模块)与客户端交换数据。
最后,nginx或客户端主动关闭连接。 现在,一个连接在寿命结束
5 .正向代理、反向代理用一句话概括,代理方代理是客户端
例如,国内访问谷歌受到阻碍,但通过访问其他国家的服务器可以获得访问谷歌的结果
如果是正向代理,则是其他国家的服务器解决墙壁问题,并将您的访问直接传输到谷歌
位于客户端和原始服务器之间的服务器。 为了从原始服务器检索内容,客户端向代理发送请求并指定目标(原始服务器)。 然后,代理将请求传递给原始服务器,并将检索到的内容返回给客户端。 客户端可以使用正向代理
反向代理用一句话概括起来,代理是服务端
反向代理是指不知道你试图访问的地址在哪里。 但是,访问一个服务器后,该服务器实际上会访问其他服务器,得到数据后返回给你。 我甚至不知道数据的来源
反向代理方法是代理服务器接收internet上的连接请求,将该请求发送到内部网络上的服务器,然后将服务器的结果返回到请求internet上连接的客户端的方法,代理服务器对外使用反向代理服务器
6 .动态静态分离动态资源、静态资源分离是动态网站中的动态页面根据一定的规则区分不变的资源和经常变化的资源。 动态资源分割后,我们可以根据静态资源的特点进行缓存操作。 这就是网站静态化处理的核心思路动态资源,静态资源分离的简要概括是:动态文件与静态文件的分离7 .为什么要进行动态、静态分离? 在我们的软件开发中,有需要后台处理的请求,也有. jsp、 do等不需要后台处理的请求。 还有css、html、jpg、js等文件
这些不需要后台处理的文件称为静态文件,否则称为动态文件。 因此,静态文件在后台处理中被忽略。 有人还说,如果我在后台忽略静态文件,这不就完了吗
当然这个很好,但是这样后台的请求次数明显增加了。 如果需要对资源的响应速度,可以使用此动态隔离策略来解决静态隔离,将网站的静态资源(HTML、JavaScript、CSS、img等文件)与后台APP应用程序分离部署,并将其指向静态代码
其中,静态资源位于nginx上,动态资源传输到tomcat服务器。 换句话说,tomcat的优点是处理动态请求
8 .负载均衡负载均衡是指将代理服务器接收到的请求分散到各服务器中进行分发
负载均衡主要解决网络拥塞问题,提高服务器响应速度,就近提供服务,达到更好的访问质量,减轻后台服务器的较大并发压力
9.fastcgi和cgi有什么区别?1)cgi
web服务器根据请求的内容,fork新进程并运行外部c程序(或perl脚本…)。 此过程将已处理的数据返回到web服务器,最后web服务器将内容发送给用户。 刚才福克斯的过程
也随之退出。如果下次用户还请求改动态脚本,那么 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 等负载均衡策略。
使用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 是如何实现高并发的?