随着软件需求的发展,现在很多的系统都需要保证高可用、高并发,在此需求之下就需要部署的服务能够不间断的提供服务即避免单点故障问题因此系统需要做集群部署同时还能提升qps、tps等指标;集群部署后的服务就需要对用户的请求能够负载均衡,nginx是目前流行的高性能HTTP和反向代理web服务器,占有内存少,并发能力强,能够支持 50000 个并发连接数的响应;主要功能有反向代理、负载均衡、动静分离等。
PCRE(Perl Compatible Regular expressions)是一个轻量级的Perl函数库,包括 perl 兼容的正则表达式库。它比Boost之类的正则表达式库小得多。PCRE十分易用,同时功能也很强大,性能超过了POSIX正则表达式库和一些经典的正则表达式库。 a、下载pcre安装包 wget方式下载:
官网下载 地址 下载后上传到Linux目录中: b、解压pcre安装包
c、执行 configure 进行pcre初始化配置
这一步如果出现如下错误: configure: error: no acceptable C compiler found in $PATH 则需要安装gcc之后再次执行 https://blog.csdn.net/doubiy/article/details/configure
如果在执行 https://blog.csdn.net/doubiy/article/details/configure 之后最后提示如下错误: configure: error: Invalid C++ compiler or C++ compiler flags
则需要安装c++环境之后再次执行 https://blog.csdn.net/doubiy/article/details/configure
d、安装pcre
e、检测pcre是否安装成功,能够输出对应版本则安装成功
openssl 、zlib 、 c++(如果刚才安装pcre有报错configure: error: Invalid C++ compiler or C++ compiler flags解决该错误时已安装了c++环境,重复安装不会有问题)
a、下载nginx安装包 wget方式下载:
官网下载 地址 下载后上传到Linux目录中: b、解压nginx安装包
c、执行 configure 进行nginx初始化检查
d、安装nginx
安装成功后会在 /usr/local/ 目录下生成一个 nginx 目录 e、启动nginx服务
到此nginx安装完成。 访问启动 nginx 的Linux服务器地址,不需要端口,不写端口默认访问80端口。 如果不能成功访问,需要查看nginx是否成功启动,然后排查端口是否放开,比如阿里云服务器需要配置安全组打开对应端口;如果是直接操作防火墙,可以如下方式打开防火墙某个端口。
防火墙其他指令:
注意:因为这些命令都是基于 nginx 这个可执行文件进行执行的,而这个文件位于 /usr/local/nginx/sbin 目录下,所以上面的命令都需要在该目录下执行。
1、配置文件位置 /usr/local/nginx/conf/nginx.conf 2、配置文件主要内容,配置文件可以分为三部分 a、全局配置块:配置服务器整体运行的配置指令 从配置文件开始到 events 配置块之间的内容,主要设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。 如:worker_processes 1; 配置,表示 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,会受到硬件、软件等设备的制约。 b、events配置块:影响 Nginx 服务器与用户的网络连接 events配置块即events括号部分,events配置块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等;这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。 如:worker_connections 1024; 配置,表示每个 work process 支持的最大连接数为 1024。 c、http配置块 http配置块是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 http配置块包括 http 全局块、server 块两部分。 c1、http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。 c2、server 块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本,http 全局块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机,并且每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。 c21、全局 server 块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。 c22、location 块:一个 server 块可以配置多个 location 块,主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理;地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。 nginx配置文件具体配置说明可查看官网 主要配置说明(配置文件中被 # 标记的配置是被注释的,这些配置可能存在默认值,默认值就是被注释的值):
location规则:
nginx防盗链: 盗链:顾名思义盗用链接,比如服务器上的图片等静态资源,可以通过图片在服务器上的地址直接进行访问,那么三方网站就可以将这个图片的地址放在自己的前端页面中,这样访问这个三方网站时,不仅可以看到这个图片并且还没有消耗三方网站的资源。 nginx防盗链配置:因为http/https请求会在Request Headers中带上一个referer参数用来表示当前请求从哪个地址发起的(发起这个请求的网页地址),那么三方网站和我们自己的网站这个referer肯定是不一样的,因此就可以在nginx中配置referer验证,用来识别哪些地址发起的请求可以正常处理否则返回403或错误图片等信息;但是referer参数可以通过程序进行修改伪装,所以这种方式防盗链并非完全可靠,但可以杜绝大部分情况。 nginx配置:
说明: none:允许没有referer参数的请求访问,比如通过浏览器地址栏直接访问img的url,这时的请求就没有referer参数,所以允许这类请求访问那么就可以配置valid_referers包含none参数。 blocked:允许请求有referer参数,但referer的内容被’防火墙或者代理服务器’删除了,允许这类请求访问就可以在valid_referers中包含blocked参数。 xxx.com/172.11.xx.xx:具体的域名或ip地址,也就是允许请求访问的referer参数的域名和ip地址即请求来源的网站的域名和ip。 $invalid_referer:获取valid_referers匹配的结果,如果请求的地址不在valid_referers配置的参数中返回1,否则返回0。即 $invalid_referer值为1时表示请求的地址没有在valid_referers配置的允许路径中,那么就应当拒绝请求,否则允许访问,可以通过if( $invalid_referer = 0)判断当前请求的referer地址在valid_referers参数中,返回403,实现黑名单效果即valid_referers参数配置的地址不允许访问。 防盗链的配置可以配置在任何的location块中,比如根路径的location / {}也是可以配置的,相当于对目录进行防盗链配置。
nginx限流: 有时候为了防止某个客户端下载资源占用大量网络资源,导致其他客户端使用变慢,可以通过限制客户端的下载占用网络资源,实现多个客户端使用体验均衡。 limit_rate限流配置可以在http中、server中、location中配置,这里以location为例:
反向代理是对服务端的代理,客户端请求服务端时不需要知道服务端的具体地址,直接把反向代理服务器(如nginx)当作服务端请求即可获取服务端返回的结果,客户端不需要做任何的配置。 正向代理是对客户端的代理,比如客户端不能访问某个服务端通过vpn的方式去访问服务端,正向代理需要客户端做一定的配置。 1、绑定域名解析 如果是公网的域名需要在购买域名的平台绑定该域名解析的服务器ip地址信息,也就是绑定到启动nginx服务的服务器ip; 如果是本地测试,可以在windows的hosts文件中绑定域名和ip关系; hosts文件路径:C:WindowsSystem32driversetc 前面ip是要绑定的服务器ip,也就是windows上安装的虚拟机的ip,后面的域名自定义。 这一步目的是可以通过域名访问nginx服务,如果不配置直接使用nginx服务器的ip及监听端口也可以访问。 2、启动需要转发的目标服务 在 192.168.238.132 这台服务器上启动一个Java服务其中有个接口如下(第一步在hosts文件中配置了域名解析,所以这里可以用域名访问 192.168.238.132 这台服务器) 3、配置nginx配置文件,配置反向代理转发的信息,将请求转发到Java服务上 配置server块中location的规则,匹配某个路径转发到对应服务上
4、重启nginx服务或重新加载nginx配置文件后测试
为了防止单节点故障,一般可以对一个服务做集群部署,那么就需要部署的多个服务节点都可以处理客户端的请求,就需要将客户端的请求分发给每个服务节点。 1、在http全局块中定义服务节点配置信息即定义需要负载的服务节点信息
2、location定义需要负载的upstream
3、重启nginx或重新加载nginx配置文件测试 负载均衡规则: a、轮询:默认规则,依次循环将请求转发给每个服务端,如果服务端挂掉,会自动剔除。 b、weight:权重轮询,默认1(数值越大权重越大),将客户端请求按权重比例转发给服务端(按照轮询+权重转发)。 配置方式:
c、ip_hash:按照客户端请求ip地址进行hash计算,确定某个服务节点处理请求,只要是同一个客户端ip则都会由该服务节点处理(因为ip地址一样计算出来的处理请求服务节点一样),可以解决session共享问题(因为session保存在服务器中,如果下次请求给了其他服务器处理,就会有session问题)。 配置方式:
d、fair:按照服务端处理请求时间进行分配客户端请求处理的服务节点,时间越短优先分配该服务节点处理请求(可能部署同一个服务的服务器配置不同这就会导致每个服务器在处理请求时时间有差距,服务器配置越好处理请求时间越短,那么fair这种负载均衡方式就可以比较均衡的利用服务器资源)。
直接修改配置文件中负载均衡方式为fair会报错,这是第三方提供的功能,需要另外安装nginx-upstream-fair包。
将动态请求和静态请求分开处理,比如html、css、image这些信息就是静态信息,直接交给nginx处理,而需要后端服务处理的请求比如查询数据库数据则交由服务端处理,这样就避免了不需要服务端处理的请求也占用服务端资源的情况,提升处理效率。 通过配置location规则匹配请求是动态还是静态请求做相应转发处理,实现动静分离。 比如所有jpg或png的请求都在某个目录下查找对应资源,而不是请求服务端,配置如下:
通过nginx实现反向代理、负载均衡、动静分离这些功能后,因为流量的入口在nginx服务,如果nginx服务出现单点故障的问题,那就会导致整个服务端功能都不可使用,因此就需要nginx服务做集群部署,以便保证nginx某些服务出现故障时,也有部分正常的nginx服务可以提供相关功能;新的组件能够感应到集群中的每个nginx服务节点并判断节点的状态是否正常,如果故障则不能将请求转发给对应nginx服务节点,如果正常则可以转发。 这里选用keepalived来构建nginx服务集群,做nginx的高可用设置,注意:keepalived的原理是通过将虚拟ip添加在某个节点的网卡上,那么就可以通过这个虚拟ip访问到对应的节点,从而访问到这个节点对应的nginx服务(那么这个节点的nginx服务就可以根据请求的url和nginx配置文件的server、location进行匹配做出相应的响应);所以keepalived的作用是通过监听每个节点上nginx服务的状态判断当前节点的nginx是否正常如果不正常则将对应节点的keepalived服务也进行关闭,如果关闭的keepalived节点是master节点,那么keepalived会自动根据剩余正常节点上的keepalived服务的优先级选定新的master节点,并将keepalived中定义的虚拟ip添加到新的master节点的网卡中,那么客户端通过这个虚拟ip访问时就会访问到新的可用nginx节点上,因此不需要运维人员做手动切换就可以持续对外提供服务。也就是说keepalived只是对真实服务(这里是nginx)做一个热备操作,并没有负载均衡的功能,即使有多个nginx备份服务也只会由keepalived为master节点的nginx服务对外提供服务,其他备份nginx服务只是在master节点的nginx不可用时通过keepalived自动选举新的master节点继续对外提供服务并且新的master能够成功选举的前提是旧的master已经关闭(这部分可以通过在keepalived配置文件中定义健康检查nginx服务的脚本,一旦当前节点的nginx服务异常,那么就关闭当前节点的keepalived服务),后端服务的反向代理、负载均衡、动静分离由nginx实现。 检测后端真实服务是否正常可以通过配置keepalived配置文件或配置健康检查脚本实现,而keepalived集群中只有MASTER节点会向BACKUP节点发送心跳包,如果BACKUP节点没有接收到MASTER节点发送的心跳包,那么就认为MASTER节点down了,需要根据优先级选出新的MASTER节点对外提供服务(所以健康检查脚本中需要有关闭当前节点keepalived服务的功能)。 1、安装keepalived服务 注意:安装keepalived服务需要在每个安装nginx服务的服务器上都安装 a、yum方式安装(需要连网)
b、安装包方式 keepalived安装包官方下载地址 b1、创建一个文件夹并将keepalived安装包上传至该文件夹中 b2、解压安装包并编译和安装
b3、安装后此时启动会有报错,无法启动,需要做如下配置 b31、keepalived启动默认读取 /etc/keepalived/keepalived.conf 配置文件,但是通过刚才的安装方式配置文件在 /usr/local/keepalived/etc/keepalived/keepalived.conf ,需要将此配置文件拷贝到 /etc/keepalived/ 目录中
b32、设置PIDFile文件
不做以上两步启动时会有类似报错: keepalived相关操作指令:
2、修改相关配置 yum安装方式配置文件是 /etc/keepalived/keepalived.conf ;安装包安装方式也将配置文件复制到了 /etc/keepalived/keepalived.conf ;所以修改配置文件时都是修改该配置文件。 配置文件说明: 虚拟路由器指由一组keepalived服务器实现的可供访问的vip并且可路由到对应真实服务上。 VRRP协议(Virtual Router Redundancy Protocol,虚拟路由冗余协议)。
配置keepalived集群构建虚拟路由器: 总共需要配置以下部分: 2.1、全局配置中配置 router_id 为当前节点的hostname 2.2、vrrp_instance 中定义当前节点的state、interface、priority、virtual_router_id、advert_int、authentication、virtual_ipaddress 信息,其中主备节点除state分别设置为MASTER和BACKUP,以及priority的值MASTER比BACKUP大,interface根据节点的网卡设置之外其余配置主备都一样,到这里完成了keepalived本身高可用主备的配置,接下来对需要被keepalived监控的真实服务做健康检查配置 2.3、添加健康检查真实服务的脚本,目的是某个节点的真实服务down掉之后将当前节点的keepalived也主动关闭,以便让keepalived集群自动完成新的可用master节点的选举,并写入虚拟ip到新的节点中 具体配置如下: MASTER:
BACKUP:
检测nginx服务脚本: