Nginx三大功能及高并发分流

Nginx三大功能及高并发分流

一、什么是Nginx

Nginx(engine x)是一个高性能的HTTP和反向代理服务器,具有内存少,高并发能力的特点。

  1. 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。
  2. 无缓存的反向代理加速,简单的负载均衡和容错。

Nginx -- 代理服务器/高性能的负载均衡器

二、Nginx的三大功能

1、反向代理功能(核心功能,其他功能的依托,其实就是请求转发)

根据用户请求Url路径,在nginx的配置文件nginx.conf里配置匹配规则及转发规则,然后将请求转发给具体的微服务(或本地的静态资源、或本地lua脚本)进行处理(根据Url路径请求转发)。
反向代理

2、负载均衡功能(分流)

负载就是问题,高并发问题。均衡就是解决手段。高并发请求对单一微服务造成极大的压力,要使这个高并发请求能够平稳的处理,需要增加节点,直到能处理并发量问题为止。怎么控制节点?使用Nginx的负载均衡策略来控制。在Nginx的核心文件nginx.conf中配置好负载均衡策略,请求压力就下降了,过去压力一直在某一个服务上,现在压力分摊到每一个微服务。负载均衡策略一般常用的有轮询、权重,默认的是轮询,使用最多的是权重。
负载均衡

请求转发-->负载均衡(分流)
简单来说就是分流:使用nginx请求转发到目标服务器(Tomcat),当并发请求量过大,一个Tomcat不足以承担大量请求,可以做横向扩容(copy多个Tomcat服务器,配置不同请求端口),使用nginx进行负载均衡配置。

nginx的5种负载均衡策略
  • 轮询(默认)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver { 
		server 192.168.1.108; 
		server 192.168.1.109; 
} 
  • 权重(常用)
    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver { 
		server 192.168.1.108 weight=7; 
		server 192.168.1.109 weight=10; 
} 
  • IP绑定 ip_hash
    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver { 
		ip_hash; 
		server 192.168.1.108:8080; 
		server 192.168.1.109:8088; 
} 
  • fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver { 
		server server1; 
		server server2; 
		fair; 
} 
  • url_hash(第三方)
    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver { 
		server squid1:3128; 
		server squid2:3128; 
		hash $request_uri; 
		hash_method crc32; 
}

3、Nginx动静分离(作为静态资源服务器)

Nginx不但可以存储静态资源还能运行,把静态资源存放到Nginx中,Nginx不需重启就可以运行静态资源,只要页面不是jsp这种动态刷新的数据,面里改的东西就会立即生效(jsp本质是个Servlet,需要编译)。利用Nginx静态资源服务器的功能运行静态资源,Nginx比tomcat的性能要高很多,本质上是因为Nginx的并发处理能力强(5万-10万之间),另外它做静态资源处理内部也做了一些优化,请求的时候网络方面的优化 比tomcat要做得好。

动态资源文件:http:-->tomcat-->DB-->json-->浏览器
静态资源文件:css、js、html、png、jpg ...
静态资源服务器

(1)Linux安装Nginx

很多公司Nginx直接安装在服务器上,因为安装服务器上性能更高(不安装在docker中)。

nginx启动:进入到nginx的sbin目录,启动nginx./nginx &或者直接usr/local/nginx/sbin/nginx &
nginx重启:./nginx -s reload
nginx停止:./nginx -s stop
查看nginx是否启动成功./nginx -t
查看nginx进程:ps -ef|grep nginx

Tomcat启动:
cd /usr/local/tomcat/tomcat-8081/bin/
sh startup.sh &

(2)nginx.conf

用java的方法讲解nginx.conf:

动态请求

在这里插入图片描述

listen			80 
server_name		www.congyi.com
可以理解为java中的Controller上的@RequestMapping拦截80路径 
location / {
	......
}
可以理解为java中的方法上的路径,花括号中的可以理解为代码块
静态资源

如果是静态资源,比如http://192.168.42.11:80/order.css,那么会访问第二个

location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
	......
}

在这里插入图片描述

域名映射

进入到 C:\Windows\System32\drivers\etc\hosts 或者直接在运行中搜索 C:\WINDOWS\system32\drivers\etc
域名映射

在hosts文件中配置ip与域名映射,例如:127.0.0.1 congyi.com

三、Nginx高可用

高可用集群指当某一个节点或服务器发生故障时,另一个节点能够自动且立即向外提供服务。高可用集群适用于单个节点发生故障时,能够自动将资源、服务进行切换,这样可以服务一直在线。
在这个过程中,对于客户端来说是透明的。

小建议:如果在项目中用到了nginx,那么请尽量把你的服务做成高可用的。
在这里插入图片描述

有主nginx和从nginx,当主nginx挂掉了,那么从nginx会启用,但是之前配置的主nginx的域名与ip的映射就失效了,这时候就需要更改hosts的映射配置为从nginx的ip。这时候就用到了keepalived开放虚拟ip,监听nginx,保证nginx24小时不间断运行。

什么是Keepalived

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。

keepalived+mysql
keepalived+nginx

如何使用 keepalived+nginx 实现高可用

现在假设有主、从两个nginx服务,即在两个不同的ip服务器上,同时每台服务器上安装了keepalived。
监听软件:keepalived -- 监听 nginx
keepalived会提供一个虚拟ip映射主从nginx的不同ip。

现在看一下主服务器上keepalived的配置:
cd /etc/keepalived/
vim keepalived.conf
在这里插入图片描述

脚本
在这里插入图片描述

那么我们来测一下keepalived是否能成功执行这个脚本,首先要在nginx未启动的情况下进行测试,使用命令ps aux|grep nginx查看一下nginx的状态,如果nginx是启动的那么先停掉他usr/local/nginx/sbin/nginx -s stop。之后就可以启动keepalived进行测试了。
keepalived的启动命令和nginx的相同,进入到安装目录对应sbin目录下启动:./keepalived &
再次查看nginx状态,验证keepalived是否成功执行脚本重启了nginx。

以上是主节点master的配置及操作,下面是从节点backup配置:
在这里插入图片描述

主从节点的keepalived目录结构、脚本文件、指向的虚拟ip是一样的。

按上述主节点操作启动从节点的keepalived。
现在主、从节点都启动了,之后联网访问域名,访问到的是主节点master,然后把主节点的keepalived和nginx干掉,再次访问域名,如果还能成功访问,则验证了nginx的高可用配置是成功的。

ps:关于查看nginx进程的问题

在敲命令查看nginx服务进程的时候会发现有两个nginx的进程,一个master、一个worker,master只有一个,worker可以有多个。其中master可以理解为"项目经理",worker理解为我们的程序员(打工人),当有多个请求时,一个worker干不过来,这时候就向master,也就是我们的项目经理申请再招聘一个worker。
在这里插入图片描述

我们可以去验证一下:
进入到vim /usr/local/nginx/conf/nginx.conf,修改worker_prosses为2个:
在这里插入图片描述

再次查看nginx进程发现有两个worker:
在这里插入图片描述

posted @ 2021-03-10 21:47  貂上蝉  阅读(1605)  评论(0编辑  收藏  举报