一、什么是Nginx
Nginx是一个高性能的http和反向代理web服务器,特点是占有内存少,并发能力强。
二、Nginx应用场景
①反向代理:
在介绍反向代理之前,先介绍一下什么是代理、什么是正向代理?
代理:
代理可以理解为中介,客户端和服务器之间本来可以直接通信,中间插入一个中介,这个中介就是代理。
正向代理:
正向代理是客户端代理,代理客户端,服务端并不知道具体发起请求的客户端。作用是帮助客户端访问其无法直接访问的服务器资源。
反向代理:
反向代理是服务端代理,代理服务端,客户端不知道具体处理请求的服务端。
Nginx反向代理简单实现:
在nginx配置文件中配置80端口的监听策略,添加location配置,描述proxy_pass指向服务应用,就能实现某应用端口的反向代理。
②负载均衡:
当多个客户端访问同一个网站,Nginx将客户端请求分派到服务端的多个应用实例上去处理业务,实现多请求压力的分摊和平衡。
负载均衡有以下几种常见的实现类型:
(1)轮询:这是默认的nginx负载均衡算法,将请求依次分发给多台服务器,也即权重都为1,服务器处理请求的顺序是ABCABCABC。
http {
upstream testServer {
server 127.7.77.234:8090;
server 127.7.77.235:8090;
server 127.7.77.236:8090;
}
server {
listen 80;
location / {
proxy_pass http://testServer;
}
}
}
(2)加权轮询:根据服务器的具体情况,比如性能或容量,为每个服务器分配不同的权重,性能好的服务器可以被分派更多的请求。
如下修改nginx.conf文件的加权轮询配置,指定轮询几率,weight和访问比率成正比。服务器处理请求的顺序是ABBCCCABBCCCABBCCC。
http {
upstream testServer {
server 127.7.77.234:8090 weight=1;
server 127.7.77.235:8090 weight=2;
server 127.7.77.236:8090 weight=3;
}
server {
listen 80;
location / {
proxy_pass http://testServer;
}
}
}
(3)IP哈希:同一IP地址的客户端的请求会被转发到某台固定的后端服务器,因为用户的多次请求不会被转发到不同的服务器上,所以保证了session会话连续性。
upstream test {
ip_hash;
server 127.7.77.234:8090;
server 127.7.77.235:8090;
}
③流量控制:
在Nginx中,实现流量控制,主要通过以下配置来调控:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location / {
limit_req zone=one burst=5 ;
}
$binary_remote_addr :其中binary是将remote_addr以二进制格式存储,remote_addr是Nginx的内置变量,代表客户端的IP地址,这个值由服务器根据客户端的IP指定。
zone=one:表示创建一个名为one,大小为10m的区域来存放访问的频次信息
rate=1r/s:表示每秒最多只能处理来自同一客户端的1个请求
server中的配置:
limit_req zone=one:设置使用上面定义的配置区域one来配置。
burst:是缓冲区,设置大小为5,这样如果在1s内请求超过1次后,超过的请求会存放在缓冲区中等待,但是支持等待的空间只有5个,同一IP的请求次数超过了burst+rate,就返回503错误。
三、Nginx测试策略:
从测试人员的角度,当被测服务接入Nginx服务,我们需要怎么测试?
①校验被测服务中Nginx负载均衡机制:
比如我们想要校验负载均衡机制设置是否符合预期,预期Nginx采用负载均衡机制设置为加权轮询——A服务器:B服务器=2:8,那我们可以通过在一定时间窗口内(比如5min)发送请求,查看Nginx日志(access_log(访问日志)和error_log(错误日志)),获取到客户端访问Nginx服务的信息和Nginx运行的异常情情况及错误信息等来校验是否符合预期
②校验被测服务中Nginx流量控制机制:
模拟多个请求,触发限流规则,验证限流规则是否生效(如果是短时间多个请求,一般可以通过python的多线程来实现)