Nginx三大功能及高并发分流
Nginx三大功能及高并发分流
一、什么是Nginx
Nginx(engine x)是一个高性能的HTTP和反向代理服务器,具有内存少,高并发能力的特点。
- 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。
- 无缓存的反向代理加速,简单的负载均衡和容错。
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: