面试知识点梳理及相关面试题(十三)-- nginx
1. 什么是正向代理和反向代理?
1.1 正向代理
如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
用途:
- 访问原来无法访问的资源
- 可以做缓存,加速访问资源
1.2 反向代理
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址
作用:
- 保证内网的安全。隐藏后端服务器的信息,屏蔽黑名单中的 IP,限制每个客户端的连接数。
- 提高可扩展性和灵活性。客户端只能看到反向代理服务器的 IP,这使你可以增减服务器或者修改它们的配置。
- 缓存。直接返回命中的缓存结果
- 静态内容直接返回:HTML/CSS/JS、图片、视频等
- 负载均衡,通过反向代理服务器来优化网站的负载
1.3 区别
- 正向代理中,proxy(代理)和client(客户端)同属一个LAN,对server(服务端)透明(server不知道谁访问了你)
- 反向代理中,proxy和server同属一个LAN,对client透明(client不知道访问的具体是谁)
2. 负载均衡概念
单个服务器解决不了,我们增加服务器的数量,原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
3. 动静分离概念
为了加快网站的解析速度,可以把 动态页面 和 静态页面 由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力
4. 什么是nginx?
Nginx (“engine x”) 是一个轻量级、高性能的 HTTP 和 反向代理服务器,特点是占有内存少,并发能力强,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
5. 为什么要使用nginx?
- 跨平台、配置简单、反向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少
- 而且Nginx内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
- 使用Nginx的话还能:
- 节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
- 稳定性高:宕机的概率非常小
- 接收用户请求是异步的
5.1 缺点:
动态处理差:nginx处理静态文件好,耗费内存少,但是处理动态页面则很鸡肋,
现在一般前端用nginx作为反向代理抗住压力。
6. 为什么Nginx性能这么高?nginx如何实现高并发?
因为他的事件处理机制:单线程异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决
6.1 异步非阻塞事件机制如何运行?
如果一个 server 采用一个进程(或者线程)负责一个request的方式,那么进程数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多的应该是等待网络传输。
而 Nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题。
Nginx是如何利用的呢,简单来说:同样的 4 个进程,如果采用一个进程负责一个 request 的方式,那么,同时进来 4 个 request 之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第 5 个request进来了。就无法及时反应了,因为 4 个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个 request ,就新开个进程来处理。
Nginx 不这样,每进来一个 request ,会有一个 worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发 request ,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件:“如果 upstream 返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker 才会来接手,这个 request 才会接着往下走。
这就是为什么说,Nginx 基于事件模型。
由于 web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中,实际上花费在 server 机器上的时间片不多。这是几个进程就解决高并发的秘密所在。即:webserver 刚好属于网络 IO 密集型应用,不算是计算密集型。
异步,非阻塞,使用 epoll ,和大量细节处的优化。也正是 Nginx 之所以然的技术基石。
6.2 为什么不使用多线程?
采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换,所以才使得Nginx支持更高的并发。
6.3 nginx是如何实现高并发的?
简单来讲,就是: 异步,非阻塞,使用了epoll和大量的底层代码优化
nginx采用一个master进程,多个woker进程的模式。
- master进程主要负责收集、分发请求。当一个请求过来时,master拉起一个worker进程负责处理这个请求。
- master进程也要负责监控woker的状态,保证高可靠性
- woker进程一般设置为跟cpu核心数一致。nginx的woker进程跟apache不一样。apche的进程在同一时间只能处理一个请求,所以它会开很多个进程,几百甚至几千个。而nginx的woker进程在同一时间可以处理额请求数只受内存限制,因此可以处理多个请求。
7. nginx是如何处理请求的?
- DNS解析器解析域名得到具体的ip地址,访问到此台服务器的nginx
- nginx接收一个请求后,首先由listen和server_name指令匹配server模块
- 再匹配server模块里的location,location就是实际地址
- 可以是地址
- 也可以是服务
- 也可以是一个转发
http{server{# 第一个Server区块开始,表示一个独立的虚拟主机站点 listen80; # 提供服务的端口,默认80server_name localhost; # 提供服务的域名主机名 location/{# 第一个location区块开始 root html; # 站点的根目录,相当于Nginx的安装目录 index index.html index.htm; # 默认的首页文件,多个用空格分开}},......server{listen9001;server_name localhost;location~/eduservice/{proxy_pass http://localhost:8001;}location~/eduoss/{proxy_pass http://localhost:8002;}}}8. nginx的目录结构
[root@localhost~]# tree/usr/local/nginx/usr/local/nginx ├── client_body_temp ├── conf #Nginx所有配置文件的目录 │ ├── fastcgi.conf # fastcgi相关参数的配置文件 │ ├── fastcgi.conf.default# fastcgi.conf的原始备份文件 │ ├── fastcgi_params # fastcgi的参数文件 │ ├── fastcgi_params.default│ ├── koi-utf │ ├── koi-win │ ├── mime.types # 媒体类型 │ ├── mime.types.default│ ├── nginx.conf #Nginx主配置文件 │ ├── nginx.conf.default│ ├── scgi_params # scgi相关参数文件 │ ├── scgi_params.default│ ├── uwsgi_params # uwsgi相关参数文件 │ ├── uwsgi_params.default│ └── win-utf ├── fastcgi_temp # fastcgi临时数据目录 ├── html #Nginx默认站点目录 │ ├──50x.html # 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面 │ └── index.html # 默认的首页文件 ├── logs #Nginx日志目录 │ ├── access.log # 访问日志文件 │ ├── error.log # 错误日志文件 │ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件 ├── proxy_temp # 临时目录 ├── sbin #Nginx命令目录 │ └── nginx #Nginx的启动命令 ├── scgi_temp # 临时目录 └── uwsgi_temp # 临时目录9. nginx.conf有哪些属性模块
worker_processes1; # worker进程的数量 events{# 事件区块开始 worker_connections1024; # 每个worker进程支持的最大连接数}# 事件区块结束 http{#HTTP区块开始 include mime.types; #Nginx支持的媒体类型库文件 default_type application/octet-stream; # 默认的媒体类型 sendfile on; # 开启高效传输模式 keepalive_timeout65; # 连接超时 server{# 第一个Server区块开始,表示一个独立的虚拟主机站点 listen80; # 提供服务的端口,默认80server_name localhost; # 提供服务的域名主机名 location/{# 第一个location区块开始 root html; # 站点的根目录,相当于Nginx的安装目录 index index.html index.htm; # 默认的首页文件,多个用空格分开}# 第一个location区块结果 error_page500502503504/50x.html; # 出现对应的http状态码时,使用50x.html回应客户 location=/50x.html{# location区块开始,访问50x.html root html; # 指定对应的站点目录为html}}......10. Nginx虚拟主机怎么配置?
- 基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站
- 基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台
- 基于ip的虚拟主机。
10.1 基于虚拟主机配置域名
需要建立/data/www /data/bbs目录,windows本地hosts添加虚拟机ip地址对应的域名解析;对应域名网站目录下新增index.html文件;
#当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/www目录下文件 server{listen80;server_name www.lijie.com;location/{root data/www;index index.html index.htm;}}10.2 基于端口的虚拟主机
使用端口来区分,浏览器使用域名或ip地址:端口号访问
#当客户端访问www.lijie.com,监听端口号为8080,直接跳转到data/www目录下文件 server{listen8080;server_name www.lijie.com;location/{root data/www;index index.html index.htm;}}#当客户端访问www.lijie.com,监听端口号为80直接跳转到真实ip服务器地址127.0.0.1:8080server{listen80;server_name www.lijie.com;location/{proxy_pass http://127.0.0.1:8080;index index.html index.htm;}}11. location的作用是什么?
location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。
11.1 location语法:
| 匹配符 | 匹配规则 | 优先级 |
|---|---|---|
| = | 精确匹配 | 1 |
| ^~ | 以某个字符开头 | 2 |
| ~ | 区分大小写的正则匹配 | 3 |
| ~* | 不区分大小写的正则匹配 | 4 |
| !~ | 区分大小写不匹配的正则 | 5 |
| !~* | 不区分大小写不匹配的正则 | 6 |
| / | 通用匹配,任何请求都会匹配到 | 7 |
| 注意:~ 代表自己输入的英文字母 |
11.2 location正则案例:
#优先级1,精确匹配,根路径 location=/{return400;}#优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写 location^~/av{root/data/av/;}#优先级3,区分大小写的正则匹配,匹配/media*****路径 location~/media{alias/data/static/;}#优先级4,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里 location~*.*\.(jpg|gif|png|js|css)${root/data/av/;}#优先7,通用匹配 location/{return403;}12. 限流怎么做的?
- Nginx限流就是限制用户请求速度,防止服务器受不了
- 限流有3种
- 正常限制访问频率(正常流量)
- 突发限制访问频率(突发流量)
- 限制并发连接数
- Nginx的限流都是基于漏桶流算法,底下会说道什么是桶铜流
12.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就会拒绝处理该用户请求
12.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=5nodelay;proxy_pass http://lj_seckill;}}为什么就多了一个 burst=5 nodelay; 呢,多了这个可以代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落,没有其他用户的请求我就处理你的,有其他的请求的话我Nginx就漏掉不接受你的请求
12.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 myip10;limit_conn myServerName100;rewrite/http://www.lijie.net permanent;}}上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。当然,只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。刚才有提到过Nginx是基于漏桶算法原理实现的,实际上限流一般都是基于漏桶算法和令牌桶算法实现的。
13. 漏桶流算法和令牌桶算法知道?
13.1 漏桶算法
漏桶算法是网络世界中流量整形或速率限制时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。也就是我们刚才所讲的情况。漏桶算法提供的机制实际上就是刚才的案例:突发流量会进入到一个漏桶,漏桶会按照我们定义的速率依次处理请求,如果水流过大也就是突发流量过大就会直接溢出,则多余的请求会被拒绝。所以漏桶算法能控制数据的传输速率。
13.2 令牌桶算法
令牌桶算法是网络流量整形和速率限制中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。
令牌桶算法的机制如下:系统会维护一个令牌(token)桶,以一个恒定的速度往桶里放入令牌(token),这时如果有请求进来想要被处理,则需要先从桶里获取一个令牌(token),当桶里没有令牌(token)可取时,则该请求将被拒绝服务。令牌桶算法通过控制桶的容量、发放令牌的速率,来达到对请求的限制。。
14. 为什么要做动静分离?
- Nginx是当下最热的Web容器,网站优化的重要点在于静态化网站,网站静态化的关键点则是是动静分离,动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们则根据静态资源的特点将其做缓存操作。
- 让静态的资源只走静态资源服务器,动态的走动态的服务器
- Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。
- 对于静态资源比如图片,js,css等文件,我们则在反向代理服务器nginx中进行缓存。这样浏览器在请求一个静态资源时,代理服务器nginx就可以直接处理,无需将请求转发给后端服务器tomcat。
- 若用户请求的动态文件,比如servlet,jsp则转发给Tomcat服务器处理,从而实现动静分离。这也是反向代理服务器的一个重要的作用。
- 当然,因为现在七牛、阿里云等 CDN 服务已经很成熟,主流的做法,是把静态资源缓存到 CDN 服务中,从而提升访问速度。
14.1 Nginx怎么做的动静分离?
只需要指定路径对应的目录。location/可以使用正则表达式匹配。并指定对应的硬盘中的目录。如下:(操作都是在Linux上)
server{listen80;server_name ws.licaidie.top;location/image/{root/usr/local/static/;autoindex on;}}- 创建目录:
mkdir /usr/local/static/image - 进入目录:
cd /usr/local/static/image - 放一张照片上去:1.jpg
- 重启 nginx:
sudo nginx -s reload - 打开浏览器 输入
server_name/image/1.jpg就可以访问该静态图片了
14.2 什么叫 CDN 服务?
CDN ,即内容分发网络。
其目的是,通过在现有的 Internet中 增加一层新的网络架构,将网站的内容发布到最接近用户的网络边缘,使用户可就近取得所需的内容,提高用户访问网站的速度。
一般来说,因为现在 CDN 服务比较大众,所以基本所有公司都会使用 CDN 服务。
15. Nginx负载均衡的算法怎么实现的?策略有哪些?
为了避免服务器崩溃,大家会通过负载均衡的方式来分担服务器压力。将对台服务器组成一个集群,当用户访问时,先访问到一个转发服务器,再由转发服务器将访问分发到压力更小的服务器。
Nginx负载均衡实现的策略有以下五种:
15.1 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。
upstream backserver{server192.168.0.12;server192.168.0.13;}15.2 权重 weight
weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。其次是为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
#权重越高,在被访问的概率越大,如上例,分别是20%,80%upstream backserver{server192.168.0.12weight=2;server192.168.0.13weight=8;}15.3 ip_hash( IP绑定)
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题
upstream backserver{ip_hash;server192.168.0.12:88;server192.168.0.13:80;}15.4 fair(第三方插件)
- 必须安装upstream_fair模块。
- 对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。
- 哪个服务器的响应速度快,就将请求分配到哪个服务器上。
upstream backserver{server server1;server server2;fair;}15.5 url_hash(第三方插件)
- 必须安装Nginx的hash软件包
- 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
upstream backserver{server squid1:3128;server squid2:3128;hash $request_uri;hash_method crc32;}16. Nginx配置高可用性怎么配置?
当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮询到下一台服务器,保证服务器的高可用
server{listen80;server_name www.lijie.com;location/{### 指定上游服务器负载均衡服务器 proxy_pass http://backServer;###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间 proxy_connect_timeout1s;###nginx发送给上游服务器(真实访问的服务器)超时时间 proxy_send_timeout1s;### nginx接受上游服务器(真实访问的服务器)超时时间 proxy_read_timeout1s;index index.html index.htm;}}17. Rewrite全局变量是什么?
$remote_addr//获取客户端ip$binary_remote_addr//客户端ip(二进制)$remote_port//客户端port,如:50472$remote_user//已经经过Auth Basic Module验证的用户名$host//请求主机头字段,否则为服务器名称,如:blog.sakmon.com$request//用户请求信息,如:GET ?a=1&b=2 HTTP/1.1$request_filename//当前请求的文件的路径名,由root或alias和URI request组合而成,如:/2013/81.html$status//请求的响应状态码,如:200$body_bytes_sent// 响应时送出的body字节数数量。即使连接中断,这个数据也是精确的,如:40$content_length// 等于请求行的“Content_Length”的值$content_type// 等于请求行的“Content_Type”的值$http_referer// 引用地址$http_user_agent// 客户端agent信息,如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36$args//与$query_string相同 等于当中URL的参数(GET),如a=1&b=2$document_uri//与$uri相同 这个变量指当前的请求URI,不包括任何参数(见$args) 如:/2013/81.html$document_root//针对当前请求的根路径设置值$hostname//如:centos53.localdomain$http_cookie//客户端cookie信息$cookie_COOKIE//cookie COOKIE变量的值$is_args//如果有$args参数,这个变量等于”?”,否则等于”",空值,如?$limit_rate//这个变量可以限制连接速率,0表示不限速$query_string// 与$args相同 等于当中URL的参数(GET),如a=1&b=2$request_body// 记录POST过来的数据信息$request_body_file//客户端请求主体信息的临时文件名$request_method//客户端请求的动作,通常为GET或POST,如:GET$request_uri//包含请求参数的原始URI,不包含主机名,如:/2013/81.html?a=1&b=2$scheme//HTTP方法(如http,https),如:http$uri//这个变量指当前的请求URI,不包括任何参数(见$args) 如:/2013/81.html$request_completion//如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty),如:OK$server_protocol//请求使用的协议,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1$server_addr//服务器IP地址,在完成一次系统调用后可以确定这个值$server_name//服务器名称,如:blog.sakmon.com$server_port//请求到达服务器的端口号,如:8018.Nginx如何限制访问?
18.1 限制ip
# 如果访问的ip地址为192.168.9.115,则返回403if($remote_addr=192.168.9.115){return403;}18.2 限制浏览器
## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500if($http_user_agent~Chrome){return500;}19. Nginx 常用命令有哪些?
启动 nginx 。 停止 nginx-s stop 或 nginx-s quit 。 重启 nginx-s reload 或 service nginx reload 。 重载指定配置文件.nginx-c/usr/local/nginx/conf/nginx.conf 。 查看 nginx 版本 nginx-v 。20. nginx报500、502、503、504 有什么区别?
- 500: Internal Server Error 内部服务错误,比如脚本错误,编程语言语法错误。
- 502: Bad Gateway错误,网关错误。比如服务器当前连接太多,响应太慢,页面素材太多、带宽慢。
- 503: Service Temporarily Unavailable,服务不可用,web服务器不能处理HTTP请求,ip超频访问导致限流,或者 临时超载或者是服务器进行停机维护。
- 504: Gateway timeout 网关超时,程序执行时间过长导致响应超时,例如程序需要执行20秒,而nginx最大响应等待时间为10秒,这样就会出现超时。
21. 什么是C10K问题?
所谓c10k问题,指的是:服务器如何支持10k个并发连接,也就是concurrent 10000 connection(这也是c10k这个名字的由来), C10K问题是指无法同时处理大量客户端(10,000)的网络套接字。
解决方案 :详细请看:C10k问题简述_爱思考的实践者的博客-CSDN博客_c10k问题
- 为每个连接分配一个独立的线程/进程。
- 同一个线程/进程同时处理多个连接(IO多路复用)。
21. nginx的七层负载均衡
21.1 四层负载均衡
所谓四层负载均衡是指OSI七层模型中的传输层, 那么传输层Nginx已经支持TCP/IP的控制, 所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载, 那么他的好处是性能非常快, 只需要底层进行应用处理,而不需要进行一些复杂的逻辑.
21.2 七层负载均衡
七层负载均衡是在应用层,那么他可以完成后很多应用方面的协议请求,
当然四层有四层的好处,七层七层的好处,四层就不支持协议的转发,(http,https,DNS等)只支持IP,但是它的速度快.
应用层虽然没有四层负载快,但是支持很多功能,比如说他支持http信息的改写、头部信息的改写、(意识是,七层代理着用户往后请求的时候把我们用户请求的头部信息加上,长连接协议也可以修改等)、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等一些规则,所以在应用层的服务里面,可以做的内容就更多了。Nginx是一个典型的七层负载均衡
21.3 四层和七层的区别
四层负载均衡数据在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发,由此可以看出,七层负载均衡效率没有四层负载均衡高。
但是七层负载均衡更贴近于服务,如HTTP协议就是七层协议,我们可以用Nginx可以作会话保持,URL路径规则匹配,head头改写等等,这些都是四层负载均衡无法实现的。
注意:四层负载均衡不识别域名,七层负载均衡识别域名
21.4 OSI七层模型
从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
- 应用层:网络服务与最终用户的一个接口,常见的协议有:HTTP FTP SMTP SNMP DNS.
- 表示层:数据的表示、安全、压缩。确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。
- 会话层:建立、管理、终止会话,对应主机进程,指本地主机与远程主机正在进行的会话.
- 传输层:定义传输数据的协议端口号,以及流控和差错校验,协议有TCP UDP.
- 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择,协议有ICMP IGMP IP等.
- 数据链路层:在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路。
- 物理层:建立、维护、断开物理连接。
22. Nginx 如何实现后端服务的健康检查?
- 方式一,利用 nginx 自带模块 ngx_http_proxy_module 和 ngx_http_upstream_module 对后端节点做健康检查。
- 方式二(推荐),利用 nginx_upstream_check_module 模块对后端节点做健康检查。
23. nginx 如何开启压缩?
开启nginx gzip压缩后,网页、css、js等静态资源的大小会大大的减少,从而可以节约大量的带宽,提高传输效率,给用户快的体验。虽然会消耗cpu资源,但是为了给用户更好的体验是值得的。
开启的配置如下:
将以上配置放到nginx.conf的http{ … }节点中。
http{# 开启gzip gzip on;# 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩 gzip_min_length1k;# gzip 压缩级别1-10gzip_comp_level2;# 进行压缩的文件类型。 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;# 是否在http header中添加Vary:Accept-Encoding,建议开启 gzip_vary on;}保存并重启nginx,刷新页面(为了避免缓存,请强制刷新)就能看到效果了。
gzip虽然好用,但是以下类型的资源不建议启用。
- 图片类型
原因:图片如jpg、png本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费资源。(Tips:可以试试将一张jpg图片压缩为zip,观察大小并没有多大的变化。虽然zip和gzip算法不一样,但是可以看出压缩图片的价值并不大) - 大文件
原因:会消耗大量的cpu资源,且不一定有明显的效果。
24. nginx常见的优化配置有哪些?
24.1 调整worker_processes
指Nginx要生成的worker数量,最佳实践是每个CPU运行1个工作进程。
了解系统中的CPU核心数,输入:$ grep processor / proc / cpuinfo | wc -l
24.2 最大化worker_connections
Nginx Web服务器可以同时提供服务的客户端数。与worker_processes结合使用时,获得每秒可以服务的最大客户端数
最大客户端数/秒=工作进程*工作者连接数
为了最大化Nginx的全部潜力,应将工作者连接设置为核心一次可以运行的允许的最大进程数1024。
24.3 启用Gzip压缩
压缩文件大小,减少了客户端http的传输带宽,因此提高了页面加载速度
建议的gzip配置示例如下:( 在http部分内)
gzip on;gzip_vary on;gzip_proxied any;gzip_comp_level1;gzip_buffers168k;gzip_http_version1.1;gzip_types text/plain text/css application/json application/javascript text/xml application/xml+rss text/javascript;24.4 为静态文件启用缓存
为静态文件启用缓存,以减少带宽并提高性能,可以添加下面的命令,限定计算机缓存网页的静态文件:
location~*.(jpg|jpeg|png|gif|ico|css|js)${expires365d;}24.5 Timeouts
keepalive连接减少了打开和关闭连接所需的CPU和网络开销,获得最佳性能需要调整的变量可参考:
client_body_timeout12;client_header_timeout12;keepalive_timeout15;send_timeout10;24.6 禁用access_logs
访问日志记录,它记录每个nginx请求,因此消耗了大量CPU资源,从而降低了nginx性能。
完全禁用访问日志记录
access_log off;如果必须具有访问日志记录,则启用访问日志缓冲
access_log/var/log/nginx/access.log buffer=4096k参考:
https://blog.csdn.net/qq_29974229/article/details/125718921
更多可查看:
https://blog.csdn.net/crazymakercircle/article/details/128684641