1 nginx介绍
nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定,所以现在很多知名的公司都在使用nginx。
2 nginx的应用场景
1、http服务器:Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
2、虚拟主机:以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
3、反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
反向代理:反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。
负载均衡:就是将请求分摊到多个tomcat上进行处理,增加了请求并发量和吞吐量。
3 nginx安装(linux)
1.官网下载nginx linux 版本的安装包放到指定目录下 (cd /data/soft )。
2.解压命令 tar zxvf nginx-1.20.0.tar.gz(记住:解压后的文件夹名称不要改成nginx,不然安装的时候会报错,因为安装的时候会创建一个nginx文件夹)。
3.创建临时文件夹,不然有可能会报错 mkdir /var/temp/nginx -p。
4.进入解压后的目录 cd nginx-1.20.0 输入如下命令,目的是配置nginx。
./configure --prefix=/data/soft/nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module。
下面是配置参数的含义:
5. make 编译。
6.make install 安装。
7. cd /data/soft/nginx/sbin 下
./nginx 启动nginx
./nginx -s stop 停止nginx:
./nginx -s reoad 重新加载
./nginx -t 检查配置文件是否正确
./nginx -s quit 停止nginx(等处理的请求结束/生产环境停止用这个命令)
注意:在云服务器安装 记得开放nginx默认的80端口。
4 nginx的进程模型
nginx模型有两种进程,master进程和worker进程。master进程主要用来管理worker进程,管理包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。
如下图我们启动ngin后可以看一下他的进程。用命令 ps-ef | grep nginx。里面默认有两个一个msater一个worker。
我们 vi /data/soft/nginx/conf/nginx.conf 将worker_processes 改成 2 看看。(改完记得重新加载nginx ./nginx -s reload)
接下来查看nginx进程发现有两个worker进程了。
5 nginx如何处理实现高并发
为什么nginx可以处理这么高并发的请求呢?
先总结:得益于nginx的worker抢占机制(进程模型)和异步非阻塞式的处理方式。
平时设置worker的数量应该与cpu的核数设置一致。
5.1 同步与异步的理解:
同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。
同步:当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行。
异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。
异步调用,要想获得结果,一般有两种方式:
1、主动轮询异步调用的结果;
2、被调用方通过callback来通知调用方调用结果。
生活实例:
同步取快递:小明收到快递将送达的短信,在楼下一直等到快递送达。
异步取快递:小明收到快递将送达的短信,快递到楼下后,小明再下楼去取。
异步取快递,小明知道快递到达楼下有两种方式:1、不停的电话问快递小哥到了没有,即主动轮询;2、快递小哥到楼下后,打电话通知小明,然后小明下楼取快递,即回调通知。
5.2 阻塞与非阻塞的理解
阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态。
阻塞:阻塞调用在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活
非阻塞:非阻塞调用在发出去后,不会阻塞当前进/线程,而会立即返回。
生活实例:
阻塞取快递:小明收到快递即将送达的信息后,什么事都不做,一直专门等快递。
非阻塞取快递:小明收到快递即将送达的信息后,等快递的时候,还一边敲代码、一边刷微信。
同步与异步,重点在于消息通知的方式;阻塞与非阻塞,重点在于等消息时候的行为。
所以,就有了下面4种组合方式:
1. 同步阻塞:小明收到信息后,啥都不干,等快递;
2. 同步非阻塞:小明收到信息后,边刷微博,边等着取快递;
3. 异步阻塞:小明收到信息后,啥都不干,一直等着快递员通知他取快递;
4. 异步非阻塞:小明收到信息后,边刷着微博,边等快递员通知他取快递。
5.3 work抢占机制
在master里面,先建立需要lfd,然后fork出多个worker进程,当用户进入nginx服务的时候,每个worker的lfd变的可读,并且这些worker会抢占一个accept_mutex的锁,一个worker得到accept_mutex这个互斥量,其他的worker就不能占有。抢到这个accept_mutex的worker就开始读取请求-解析请求-处理请求,数据彻底返回客户端之后,这个事件就算结束。
5.4 nginx事件处理
一般服务器事件处理:同样的3个进程,如果采用一个进程负责一个request的方式,那么,同时进来3个request之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第4个request进来了。就无法及时反应了,因为4个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个request,就新开个进程来处理。
nginx事件处理:nginx每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。
6 nginx.config配置结构
1. user root ;
设置worker进程的用户,指linux中的用户,涉及到一些操作文件目录的权限,默认是nobody。
2. worker_processes;
worker进程工作数的设置,一般来说cpu有几个就设置几个。
3. error_log logs/error.log info;
nginx日志级别:debug/info/warn/error
4. pid logs/nginx.pid;
nginx的进程pid
5.设置工作模式
6. http指令块,针对http网络传输的一些指令配置
7.include yc.config
引入外部配置文件,避免配置文件过大 可读性差
8. 设定日志格式,main为定义的格式名称,如此access_log就可以直接使用这个变量了。
9. sendfile使用高校文件传输,提升传输性能,启用后才能够使用tcp_nopush,指当前数据表积累一定大小后才能发送,提升了传输效率。
sendfile on;
tcp_nopush on;
10.keepalive_timeout 65;
设置客户端与服务器请求的超时时间,保证客户端请求的时候不会重复建立新的连接,节约资源损耗。
11. gzip on;
启用压缩,html/css压缩后传输更快。
12.server 指令块可以在http指令中设置多个模拟主机
listen:监听端口;
server_name localhost/ip/域名
location:请求路由映射,匹配拦截
root:请求位置
index:首页设置
7 nginx配置前端静态文件访问
假如我的前端项目放置在 /data/html目录下 我们可以如下图配置静态资源访问
8 nginx 跨域防盗链
9 nginx 集群
9.1 搭建tomcat集群
如下图:我们搭建了反向代理,两台tomcat集群。
9.2 nginx负载均衡
1.负载均衡之——轮询
搭建完集群后请求会被依次分摊到三台tomcat服务器上,按顺序依次访问。
2.负载均衡之——加权轮询
如果集群的两台tomcat服务器配置不一样,我们可以为配置高的server增加权重,使其改变访问的流量,数值越小被分配到的流量就越少。
9.3 nginx upstream参数详解
max_conns:可以根据服务的好坏来设置最大连接数,防止挂掉,比如1000,我们可以设置800
max_fails、 fail_timeout:
max_fails:失败多少次 认为主机已挂掉则,踢出,公司资源少的话一般设置2~3次,多的话设置1次
max_fails=3 fail_timeout=30s代表在30秒内请求某一应用失败3次,认为该应用宕机,后等待30秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待30秒...以此循环,直到恢复。
9.4 负载均衡算法
1.weight+轮询: 默认的算法,根据设置的权重去轮询。
2.ip_hash: 根据用户ip的hash来决定用户访问的是哪一台tomcat
场景:保持session 一致。(因为同一个ip他的hash一样,通过节点取余,保证他的每个请求都访问到同一台tomcat避免缓存失效)。另外注意:要是停用机器,不能直接去掉server,应该用down参数,保证节点数不变,那么ip_hash还是不变,要是节点数变了,整个hash ip 访问的机器都会变。
3.url_hash:原理跟 ip_hash差不多,但是不同的是将请求的url放到hash函数中得到值然后再去跟节点数取余。
4.least_conn : 最少链接。就是去找我们每台服务器当前链接最少的,当新的请求进来以后就会去访问链接最少的这一台。
10 Nginx + Keepalived高可用
10.1 什么是Keepalived
Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。
10.2 Keepalived双机主备原理
首先Keepalived可以在主机上产生一个虚拟的ip, 这里叫做vip(v是virtual的意思) 。当用户访问主机时, 虚拟ip会跟这个主机ip绑定,他有心跳机制去检测主机是否宕机,若主机宕机以后虚拟ip会跟备用机绑定,然后就会通过备用机器访问。
10.3 Keepalived 安装(linux)
keepalived和nginx安装方式差不多,我选用安装包方式安装。
1. 上传压缩包到指定目录下。我的是(/data/soft)使用 tar -zxvf keepalived-2.0.18.tar.gz 解压压缩包。
2 . cd keepalived-2.0.18 进入解压好的文件目录下
./configure --prefix=/data/soft/keepalived --sysconf=/etc 配置一下安装路径为/data/soft ,配置文件的路径是/etc下
执行后出现报错:*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
然后 yum -y install libnl libnl-devel 安装一下。
之后再重新运行 ./configure --prefix=/data/soft/keepalived --sysconf=/etc 就ok 了。
执行完以后 跟nginx一样 会出现Makefile
3. make && make install 编译和安装 里面会有警告信息,不用管就可以了。
4.将keeplived 加入操作系统
cp /data/soft/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/
cp /data/soft/keepalived-2.0.18/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived/
10.4 keepalived.conf配置文件说明
配置文件的位置: /etc/keepalived/keepalived.conf
10.5 Keepalived 基本命令
加为系统服务:
cp /data/soft/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/
cp /data/soft/keepalived-2.0.18/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived/ -
启动:systemctl start keeplived.service
停止:systemctl stop keeplived.service
重启:systemctl restart keeplived.service
10.6 keepalived 演示双主备
第一步:创建两台nginx,分别安装nginx和keeplived,其ip配置如下:
虚拟ip:192.168.159.161
nginx01 ip:192.168.167.100 作为master
nginx02 ip:192.168.167.111
nginx01 master主机 安装好nginx和keeplived。并且keeplived的配置修改如下图:
nginx02 backup从机 安装好nginx和keeplived。并且keeplived的配置修改如下图:
配置好以后分别启动nginx和keeplived
第二步:打开浏览器访问虚拟ip看看当前是哪台nginx在工作。为了方便查看我修改了nginx的index.html加上了本机ip地址。
如下图:我们发现虚拟ip访问的是主机。
然后我们在主机上执行 :systemctl stop keeplived.service 停止主机的keeplived。然后访问看看:
之后刷新浏览器发现现在访问到的是备用机的nginx
10.7 keeplived 实现nginx自动重启
首先我们将两台服务器的keeplived都起来,只启动从机的nginx,master主机的nginx我们停掉看看访问浏览器会使什么结果,因为在生产环境中主机的nginx也有可能宕机,那么我们就需要能访问到备用机的nginx。
如图:我们访问虚拟ip发现,无法访问了,说明虚拟ip在主机nginx挂掉后绑定的还是主机,无法访问到从机。
我们查看一下主机的 ip addr 可以看到 主机上跟虚拟IP绑定着
再看一下从机的 ip addr : 没有出现虚拟ip
如果出现上述情况,那么我们就需要对master主机nginx增加心跳检测,如果它宕机了就要自动重启,若是它起不来的话应该把keeplived停止掉,然后使备用机被启用。下面我们用keeplived实现此功能
第一步:在keeplived 配置文件的地方 增加nginx重启shell脚本check_nginx.sh
chmod +x /etc/keepalived/check_nginx.sh 为脚本添加权限。
/data/soft/nginx/sbin/nginx -stop 先停止nginx,打开浏览器访问一下主机看nginx是否已经停止。
然后 ./chech_nginx.sh 运行脚本,打开浏览器访问主机nginx看看是否已经启动。
第二步:将nginx重启脚本添加到keeplived配置文件中实现定时运行
第三步:重启keepalived然后运行测试
systemctl restart keepalived --重启keepalived
/data/soft/nginx/sbin/nginx -s stop --停止nginx
当我们 停止nginx后 他会自动将nginx启动起来!
10 LVS实现负载均衡
参考原文链接:https://blog.csdn.net/weixin_40470303/article/details/80541639
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如下图所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
另外:LVS实现的是基于四层的负载均衡,基于ip和端口的请求转发。
10.1 NAT模式
NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以访问位于公司内部的私有IP主机。VS/NAT工作模式拓扑结构如下图所示,LVS负载调度器可以使用两块网卡配置不同的IP地址,eth0设置为私钥IP与内部网络通过交换设备相互连接,eth1设备为外网IP与外部网络联通。
第一步,用户通过互联网DNS服务器解析到公司负载均衡设备上面的外网地址,相对于真实服务器而言,LVS外网IP又称VIP(Virtual IP Address)虚拟IP,用户通过访问虚拟IP,即可连接后端的真实服务器(Real Server),而这一切对用户而言都是透明的,用户以为自己访问的就是真实服务器,但他并不知道自己访问的VIP仅仅是一个调度器,也不清楚后端的真实服务器到底在哪里、有多少真实服务器。
第二步,用户将请求发送至192.168.1.150,此时LVS将根据预设的算法选择后端的一台真实服务器(192.168.1.1~192.168.1.3),将数据请求包转发给真实服务器,并且在转发之前LVS会修改数据包中的目标地址以及目标端口,目标地址与目标端口将被修改为选出的真实服务器IP地址以及相应的端口。
第三步,真实的服务器将响应数据包返回给LVS调度器,调度器在得到响应的数据包后会将源地址和源端口修改为VIP及调度器相应的端口,修改完成后,由调度器将响应数据包发送回终端用户,另外,由于LVS调度器有一个连接Hash表,该表中会记录连接请求及转发信息,当同一个连接的下一个数据包发送给调度器时,从该Hash表中可以直接找到之前的连接记录,并根据记录信息选出相同的真实服务器及端口信息。
10.2 TNU模式
在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。VS/TUN工作模式拓扑结构如下图所示。其中,IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。
10.3 基于DR模式的LVS负载均衡
在LVS(TUN)模式下,由于需要在LVS调度器与真实服务器之间创建隧道连接,这同样会增加服务器的负担。与LVS(TUN)类似,DR模式也叫直接路由模式,其体系结构如图4所示,该模式中LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端。与隧道模式不同的是,直接路由模式(DR模式)要求调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址(192.168.1.150),目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的。由于多台计算机都设置了同样一个VIP地址,所以在直接路由模式中要求调度器的VIP地址是对外可见的,客户端需要将请求数据包发送到调度器主机,而所有的真实服务器的VIP地址必须配置在Non-ARP的网络设备上,也就是该网络设备并不会向外广播自己的MAC及对应的IP地址,真实服务器的VIP对外界是不可见的,但真实服务器却可以接受目标地址VIP的网络请求,并在回应数据包时将源地址设置为该VIP地址。调度器根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器。整个过程中,真实服务器的VIP不需要对外界可见。
下面我们实现LVS DR模式的负载均衡:我们搭建三台服务器,配置约定如下。dip是真实的ip,vip是虚拟ip。
第一步:配置三台机器
三台机器上运行命令: systemctl stop NetworkManager systemctl disable NetworkManager
第二步:配置LVS服务器虚拟ip
进入网卡的配置文件夹下 cd /etc/sysconfig/network-scripts/
编辑 网卡配置文件 ifcfg-ens33 添加ADDRESS2=192.168.159.150
然后重启网卡配置:service network restart
查看网卡配置:ip addr
如图 ens33 多了虚拟ip的配置
第三步:LVS服务器安装ipvsdam
yum install ipvsadm
安装好以后,查看版本号 ipvsadm -Ln
第四步:分别配置两台 nginx 服务器虚拟ip(步骤一样)
1.进入网卡配置文件夹 cd /etc/sysconfig/network-scripts/
2.拷贝配置文件重命名 cp ifcfg-lo ifcfg-lo:1
3.编辑文件 vi ifcfg-lo:1
4.重启网卡 service network restart
5.ip addr 查看配置,出现虚拟ip信息
第四步:为两台nginx服务器配置arp。
1. vi /etc/sysctl.conf 加上如图配置
2. sysctl -p 使配置文件生效。
3. 配置网络配置 route add -host 192.168.159.150 dev lo:1
route -n 查看 多了 192.168.159.150 的配置
将 route add -host 192.168.159.150 dev lo:1 添加到 /etc/rc.local 文件末尾 开机自动执行
第五步:LVS服务器使用ipvsadm配置集群规则
1.创建LVS节点,用户访问的集群调度者
ipvsadm -A -t 192.168.159.150:80 -s rr
-A:添加集群
-t : tcp协议
ip地址︰设定集群的访问ip,也就是LVS的虚拟ip.-s∶设置负载均衡的算法,rr表示轮询
p∶设置连接持久化的时间
2.创建两台RS真实服务器
ipvsadm -a -t 192.168.159.150:80 -r 192.168.159.111:80 -g
ipvsadm -a -t 192.168.159.150:80 -r 192.168.159.100:80 -g
-a∶添加真实服务器
-t : tcp协议
-r︰真实服务器的ip地址
-g∶设定DR模式
接下来我们访问 虚拟ip 192.168.159.150
如下图,已经访问到 100 nginx服务器了。我们把100nginx停掉后,访问150会访问到111。说明集群配置成功了。
11 LVS+keepalived
上面我们已经学习配置keepalived 和 LVS集群。那么我们可以配置两个LVS,一个主一个备。当主keepalived LVS 宕机后就启用备用的keepalived LVS。
第一步:创建两台LVS 服务器(99(主) 和98 )
两台服务器分别 都安装keepalived
第二步:配置主LVS keepalived配置文件
如下图:虚拟ip是192.168.159.150 添加LVS的配置如下图。
然后重启 keepalived 访问虚拟ip 看是否能访问到。
第三步:配置从LVS keepalived.config
将主节点的keepalived的配置复制到从节点然后改一下 id 和 backup 还有权重就可以了
然后重启 keepalived
为了测试 备用机是否好使,我们将主keepalived 停止掉以后,我们访问虚拟ip看能访问到nginx。