一. 简介
1. 前言
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的,从2004年发布至今,凭借开源的力量,已经接近成熟与完善。相关地址如下:
官网:http://www.nginx.org/
源码:https://trac.nginx.org/nginx/browser
Nginx的常用功能包括:代理、反向代理、负载均衡、Web缓存等等,下面逐个分析。
2. 代理、反向代理
代理:局域网内通过代理服务器,连接外网,分发到不同的外网web服务器。
反向代理:是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部(或外部)网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。
3. 负载均衡
(1). Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略包括:轮询、加权轮询、Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他一一找出来做下实现。
(2). 作用
A. 转发功能:按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。
B. 故障移除:通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器期宕掉,自动将请求发送到其他应用服务器。
C. 恢复添加:如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。
PS: 除了要实现网站的高可用,也就是提供n多台服务器用于发布相同的服务,添加负载均衡服务器分发请求以保证在高并发下各台服务器能相对饱和的处理请求。同样,负载均衡服务器也需要高可用,以防如果负载均衡服务器挂掉了,后面的应用服务器也紊乱无法工作。实现高可用的方案:添加冗余。添加n台nginx服务器以避免发生上述单点故障。常见方案:keepalive+nginx实现负载均衡高可用
4. Web缓存
Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理。
二. 基本配置
首先通过地址: http://nginx.org/en/download.html 下载最新的nginx服务器包, 这里下载 windows版本的1.17.9,如下图:
1. 常用指令
可以通过DOS命令启动服务:也可以直接双击nginx.exe 启动服务;
启动服务:start nginx
退出服务:nginx -s quit
强制关闭服务:nginx -s stop
重载服务:nginx -s reload (重载服务配置文件,类似于重启,服务不会中止)
验证配置文件:nginx -t
使用配置文件:nginx -c "配置文件路径"
使用帮助:nginx –h
测试:找conf/nginx.conf文件,修改里面的监控节点为8999,默认是80,然后cmd 【start nginx】,访问 http://localhost:8999,出现下面界面,表示启动成功。
节点图:
启动图:
进程图:
2. 配置文件详解
(1). 常见几个参数:
A. listen:表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个Nginx的server,这个listen要配置不一样,不然就不能确定转到哪里去了。
B. server_name:表示监听到之后需要转到哪里去。
C. location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
A. root:里面配置了root时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对我们之后的静态文件很有用。
B. index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推。
C. proxy_pass:代理地址
(2). 实战测试
在IIS的9001端口部署了一个Api项目,其中Home/GetMsg方法,返回当前部署的端口号;现在想通过访问 Nginx代理的8999端口,通过转发访问到9001端口部署的项目,Nginx配置如下:
此时访问:http://localhost:8999/Home/GetMsg ,得到对应9001端口返回的内容,说明代理转发成功。
三. 轮询
事先准备:
在IIS的9001、9002、9003端口部署同一个项目,其中Home/GetMsg端口返回的内容为:获取成功,当前端口为:9001(9002、9003),后面的加权轮询和ip Hash均使用这三个端口的项目。
1. 含义
每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器down掉,自动剔除,剩下的继续轮询。
2. 详细配置
通过下面配置,便可以实现,监听8999端口,在被转发到8999.max.com这个网站时,由于配置了proxy_pass地址,所有请求都会先通过nginx反向代理服务器,在服务器将请求转发给目的主机时,读取upstream为 myApiTest的地址,读取分发策略,这里并没有配置weight权重,所以默认就是轮询,所有的请求进来一次被转发到9001、9002、9003端口。
四. 加权轮询
1. 含义
通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况。使用weight=x,来配置权重,如下图:
2. 详细配置
通过下面配置,便可以实现,监听8999端口,在被转发到8999.max.com这个网站时,由于配置了proxy_pass地址,所有请求都会先通过nginx反向代理服务器,在服务器将请求转发给目的主机时,读取upstream为 myApiTest的地址,读取分发策略,这里将9001的权重配置为9,所以当请求进来时,大部分请求都会被转发给9001端口,少量请求被转发给9002和9003端口。
PS:每次修改完后配置,要【nginx -s reload】重载一下Nginx服务器,如果还不生效,需要关掉nginx服务,重新打开一遍。
3. Nginx其它配置
(1). down: 表示当前的server暂时不参与负载。
(2). weight: 默认为1.weight越大,负载的权重就越大。
(3). max_fails: 允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
(4). fail_timeout: max_fails 次失败后,暂停的时间。
(5). backup: 其它所有的非backup机器down或者忙的时候,请求backup机器,所以这台机器压力会最轻。
使用方式如下:
五. IP-Hash算法
1. 含义
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个应用服务器,可以解决session共享的问题。
2. 详细配置
六. 解决微服务架构的负载问题
前面的微服务架构中,Ocelot网关直接对外,各个客户端直接访问网关,由网关进行请求的转发,转发到各个业务服务器上,这样有一个很明显的弊端,就是所有的请求压力都集中在Ocelot网关这一点上,这里引进Nginx,进行负载均衡,即通过Nginx把请求转发到不同网关上,然后网关再转发到业务服务器上, 这就很大程度上解决了高并发的问题,因为Nginx节点处理请求数量要远大于 网关节点,如果你还不满足,那么Nginx也可以进行集群部署。
架构图分享: