1.http 协议的各个版本和区别
1.多路复用
HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。
当然HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。
TCP连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,则慢慢加大传输速度。因此对应瞬时并发的连接,服务器的响应就会变慢。所以最好能使用一个建立好的连接,并且这个连接可以支持瞬时并发的请求。
2.数据压缩
HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
3.服务器推送
当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。
服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。
2.比较nginx 和 apache 的特性
Nginx 适合做静态处理,简单,效率高
Apache 适合做动态处理,稳定,功能强
并发较高的情况下优先选择Nginx,并发要求不高的情况下两者都可以,规模稍大的
可以使用Nginx作为反向代理,然后将动态请求负载均衡到后端Apache上。
Nginx的优缺点
优点:
• 轻量级服务,比Apache占用更少的内存及资源
• 并发能力强,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并
发下nginx 能保持低资源低消耗高性能
• 高度模块化的设计,编写模块相对简单
• 社区活跃,各种高性能模块产出迅速
缺点:
• 动态处理上需要使用fastcgi连接PHP的FPM服务,相比Apache不占优势
Apache的优缺点
优点:
• Apache的rewrite功能比nginx的要强大
• 模块非常多,基本想要的功能都能找到模块
• 存在时间较长,文献较全,bug也相对较少
• 动静态解析都超稳定
缺点:
• 由于工作模式是同步阻塞型,导致资源消耗较高,并发能力较差
3.nginx 的功能
Nginx主要功能:(1)、反向代理
(2)、负载均衡
(3)、HTTP服务器(包含动静分离)
(4)、正向代理
4.常见的nginx 性能优化方法
(1).Nginx运行工作进程数量(cup设置)
worker_process auto;
nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。
(2).Nginx运行CPU亲和力
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
(3).Nginx最大打开文件数
worker_rlimit_nofile 65535;
(4).Nginx事件处理模型
nginx采用epoll事件模型,处理效率高。
(5).连接超时时间
主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的。
(6).fastcgi 调优
(7).gzip 调优
Nginx gzip 压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到客户端之前,Nginx 服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。
需要压缩的对象有 html 、js 、css 、xml 、shtml ,图片和视频尽量不要压缩,因为这些文件大多都是已经压缩过的,如果再压缩可能反而变大。
(8).防盗链
(9).内核参数优化
5.location的优先级
第一优先级:等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
第二优先级:^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
第三优先级:正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
第四优先级:常规字符串匹配类型。按前缀匹配。
6.rewrite 中 redirect,permanent, break和last区别
reak与last都停止处理后续重写规则,只不过last会重新发起新的请求并使用新的请求路由匹配location,但break不会。所以当请求break时,如匹配成功,则请求成功,返回200;如果匹配失败,则返回404。
服务器配置好redirect和permanent之后,打开浏览器分别访问这两个请求地址,然后停止Nginx服务。这时再访问redirect请求会直接报出无法连接的错误。但是permanent请求是永久重定向,浏览器会忽略原始地址直接访问永久重定向之后的地址,所以请求仍然成功。(这个验证不能禁用浏览器的缓存,否则即使是permanent重定向,浏览器仍然会向原始地址发出请求验证之前的永久重定向是否有效)
对于搜索引擎来说,搜索引擎在抓取到301永久重定向请求响应内容的同时也会将原始的网址替换为重定向之后的网址,而对于302临时重定向请求则仍然会使用原始的网址并且可能会被搜索引擎认为有作弊的嫌疑。所以对于线上正式环境来讲,尽量避免使用302跳转
如果replacement以”http://”或”https://”或“$scheme”开始,处理过程将终止,并将这个重定向直接返回给客户端。
7.nginx的常见模块
http_ssl_module:实现服务器加密传输的模块,部署完成后可使用https://协议进行数据传输,保证数
据传输过程的安全
http_rewrite_module:Nginx的地址重写模块,功能同Apache的一样,可以实现通过正则匹配来完成条件判
断,然后进行域名或url的重写。例如:多域名、http -> https
http_proxy_module:Nginx 的反向代理功能,由于Nginx的高并发特性,很多时候我们都选择使用Nginx作为网站的前置服务器,一般会和upstream模块一起使用,完成压力分摊工作。
http_upstream_module:负载均衡模块
9.nginx的反向代理的调度算法
(1).rr轮询(默认)
(2).weight(权重)
在轮询算法的基础上加上权重(默认是rr+weight)
(3).ip_hash
该调度算法可以解决动态网页session共享的问题
(4).fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
(5).url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
10.比较nginx,haprorxy和LVS的区别
LVS负载均衡的特点
1) 抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
2) 工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
3) 稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
4) 应用范围比较广,可以对所有应用做负载均衡;
5) 不支持正则处理,不能做动静分离。
6) 支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
7) 配置 复杂,对网络依赖比较大,稳定性很高。
Ngnix负载均衡的特点
1) 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;
2) Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
3) Nginx安装和配置比较简单,测试起来比较方便;
4) 也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;
5) 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
6) Nginx对请求的异步处理可以帮助节点服务器减轻负载;
7) Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
8) 不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好,
9) 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)
10) Nginx还能做Web服务器即Cache功能。
HAProxy负载均衡的特点
1) 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
2) 能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
3) 支持url检测后端的服务器出问题的检测会有很好的帮助。
4) 更多负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
5) 单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
6) HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
9) 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
10) 不能做Web服务器即Cache。
11.常见的状态码
400 Bad Request 客户端请求的语法错误,服务器无法理解
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
500 Internal ServerError 服务器内部错误,无法完成请求
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理
12.访问web页面时出现502和504错误,请简述—下排查思路
502:彻底连不上,有回应
504:感觉能够连上,但是连不上,没有回应
关闭服务响应码为 502
设置防火墙策略reject 响应码为 502
设置防火墙策略drop 响应码为 504
关机响应码为 504或502 #清arp缓存之后为502
13.有同事反应,网站访问速度很慢,有时候会出现打不开网站的情况,刷新等待好长时间后又正常打开,请分析并说一说故障排查思路?
1、首先要确定是用户端还是服务端的问题。当接到用户反馈访问慢,那边自己立即访问网站看看,如果自己这边访问快,基本断定是用户端问题,就需要耐心跟客户解释,协助客户解决问题。
不要上来就看服务端的问题。一定要从源头开始,逐步逐步往下。
2、如果访问也慢,那么可以利用浏览器的调试功能,看看加载那一项数据消耗时间过多,是图片加载慢,还是某些数据加载慢。
3、针对服务器负载情况。查看服务器硬件(网络、CPU、内存)的消耗情况。如果是购买的云主机,比如阿里云,可以登录阿里云平台提供各方面的监控,比如 CPU、内存、带宽的使用情况。
4、如果发现硬件资源消耗都不高,那么就需要通过查日志,比如看看 MySQL慢查询的日志,看看是不是某条 SQL 语句查询慢,导致网站访问慢。
怎么去解决?
1、如果是出口带宽问题,那么久申请加大出口带宽。
2、如果慢查询比较多,那么就要开发人员或 DBA 协助进行 SQL 语句的优化。
3、如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等等。然后也可以搭建MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。
4、申请购买 CDN 服务,加载用户的访问。
5、如果访问还比较慢,那就需要从整体架构上进行优化咯。做到专角色专用,多台服务器提供同一个服务
14.请解释Nginx是如何连接PHP进行页面解析的
Nginx fastcgi PHP-FPM PHP
Nginx支持PHP
(1). Nginx支持fastCGI功能(默认支持)
(2). PHP编译时开启FPM服务(编译时指定)
(3). 在Nginx配置文件中添加匹配规则(匹配后缀是.php)
15.上家公司的服务各做了哪些优化,NGINX做了哪些优化
(1).Nginx运行工作进程数量(cup设置)
worker_process auto;
nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。
(2).Nginx运行CPU亲和力
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
(3).Nginx最大打开文件数
worker_rlimit_nofile 65535;
(4).Nginx事件处理模型
nginx采用epoll事件模型,处理效率高。
(5).连接超时时间
主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的。
(6).fastcgi 调优
(7).gzip 调优
Nginx gzip 压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到客户端之前,Nginx 服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。
需要压缩的对象有 html 、js 、css 、xml 、shtml ,图片和视频尽量不要压缩,因为这些文件大多都是已经压缩过的,如果再压缩可能反而变大。
(8).防盗链
(9).内核参数优化
16.请描述Nginx和Tomcat之间的数据传输过程
Nginx收到静态资源请求,会自行处理,并返回结果;
在收到动态资源请求时,则会根据预先配置好的反向代理策略,
对请求进行转发,参照负载均衡策略,
转发至tomcat集群,对动态资源进行处理,并返回结果。
16.为什么Nginx的并发能力强,资源消耗低?
Nginx以异步非阻塞方式工作
◆ 客户端发送request,服务器分配work进程来处理
◆ 能立即处理完的,处理后work进程释放资源,进行下一个request的处理
◆ 不能立即处理完的work进程注册返回事件,然后接着去处理其他request
◆ 当之前的request结果返回后,触发返回事件,由空闲work进程接着处理通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的
17.为什么nginx性能好?
(1).非阻塞、高并发连接
(2).高并发量:根据官方给出的数据,能够支持高达 50,000 个并发连接数的响应。
(3).内存消耗少:处理静态文件,同样起 web 服务,比 apache 占用更少的内存及资源,所以它是轻量级的。
(4).简单稳定:配置简单,基本在一个 conf 文件中配置,性能比较稳定,可以 7*24 小时长时间不间断运行。
18.epoll和select的区别
(1)、epoll只是一组API,比起select这种扫描全部的文件描述符,epoll只读取就绪的文件描述符
(2)、epoll比select等多路复用方式来说,减少了遍历循环及内存拷贝的工作量,因为活跃连接只占总并发连
接的很小一部分。
(3)、epoll基于事件的就绪通知机制,使用回调机制,所以性能比较好
(4)、基于epoll的IO多路复用减少了进程间切换的次数,使得操作系统少做了相对于用户任务来说的无用
19.LVS和Nginx七层代理的区别
工作层:LVS四曾,nginx七层
监听端口:LVS不监听,Nginx监听
后端服务器看到客户端地址:LVS可以,Nginx不可以
连接(三次握手):LVS不参与连接,只负责转发,nginx代替后端服务和客户建立连接
20.什么是keep-alive
TCP的KeepAlive机制意图在于保活、心跳,检测连接错误。
当一个TCP连接两端长时间没有数据传输时(通常默认配置是2小时),
发送keepalive探针,探测链接是否存活。