这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战
今天是8月的最后一天,2021年,已过去三分之二。贼快,感觉比nginx都快。在这里,首先感谢下掘金平台,给了我们一个学习,知识共享的一个平台。
入掘金不久,在8月份 有幸参与更文挑战,刚开始是为了拿到那些所谓的奖品,但是慢慢的,掘金的目的就达到了,我已经养成写文章的习惯了,再次感谢掘金平台。后面我会继续努力,持续输出更多干货!
多唠叨一句,大家可以点击我头像查看历史干货文章,每一篇都是贼干的那种。
话不多说,进入今天的正题
nginx
在我看来 ,Nginx 是后端工程师和运维工程师,以及前端工程师必须要掌握的必备技能,尤其在分布式系统应用越来越广泛的今天。可以这样毫不夸张的说。现在不管是互联网公司还是传统企业,nginx都有参与!
这么牛掰,究竟牛掰的点在哪里,今天我们get一下
先抛篇定义吧:Nginx 是一款开源的高性能轻量级 Web 服务器(也叫 HTTP 服务器),它主要提供的功能是:反向代理、负载均衡和HTTP 缓存。
注意:三个点:反向代理、负载均衡、http缓存 ,因为平时反向代理和负载均衡用的比较多。今天我们就围绕这两个点说下
反向代理
在Java设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象控制原对象的引用(我以前也讲过代理模式,感兴趣的大家可以点击头像查看下)。
代理简单来说,就是如果我们想做什么,但又不想直接去做,那么这时候就找另外一个人帮我们去做。比如中介公司就是给我们做代理服务的,我们委托中介公司帮我们找房子。
nginx就是这个中介。他来负责给我们找各种资源。
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
比如我们经常碰到的跨域问题(前后端分离的工程),我们前端工程师在浏览器输入localhost进入前端工程开始调整逻辑,但是接口地址调用的是后端的api工程,会出现跨域,那么nginx在本地启动,比如拦截80端口,给个拦截,然后转发到真实的api接口服务
server {
listen 80;
server_name ;
#定义拦截api
location /api {
proxy_pass http://www.web.server/web-api/;
index index.html index.htm index.jsp;
}
}
比如我们要访问www.web.server/web-api 这个线上服务,那浏览器直接输入localhost/api 即可。
最后看幅图理解下:
接下来讲一下第二点常用的:负载均衡
负载均衡
我先介绍下 nginx这个负载均衡存在的意义,为什么我们要需要负载均衡:
如果我们使用的是一台服务器,那么在高峰期时很多用户就需要排队等待系统响应,因为一台服务器能处理的并发数是固定的。例如,一个 Tomcat 在默认情况下只能开启 150 个线程(Tomcat 8.5.x 版本)来处理并发任务,如果并发数超过了最大线程数,那么新来的请求就只能排队等待处理了
如下图:
然而如果有负载均衡的话,我们就可以将所有的请求分配到不同的服务器上。假如 1 台服务器可以处理 2000 个请求,那么 5 台服务器就可以处理 10000 个请求了,这样就大大提高了系统处理业务的能力
是不是一目了然。这就是nginx的负载均衡。那么问题来了,负载均衡肯定得有一种算法吧,要不然怎么分配这些机器呢。接下来看下负载均衡算法策略
1、轮询策略(默认负载均衡策略)
轮询负载策略是指每次将请求按顺序轮流发送至相应的服务器上,看下配置
http {
//upstream 可以理解为定义变量。比如我们java当中的 String ab = "你好"
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
上面代码中:当我们使用“ip/”访问时,请求就会轮询的发送至上面配置的三台服务器上(srv1,srv2,srv3)
2、权重负载均衡策略
权重,大家应该知道,说白了就是按照比例。此配置方式是指每次会按照服务器配置的权重进行请求分发,权重高的服务器会收到更多的请求,这就相当于给 Nginx 在请求分发时加了一个参考的权重选项,并且这个权重值是可以人工配置的。因此我们就可以将硬件配置高,以及并发能力强的服务器的权重设置高一点,以更合理地利用服务器的资源,它配置示例如下:
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
上述配置中,比如我们有5 次请求,那么就有 3 次请求会分发给 srv1,1 次请求会分发给 srv2,另外 1 次请求会分发给 srv3。
3、最少连接数负载均衡
这个有点类似于我们的漏斗算法,是一个思想。每次将请求分发到当前连接数最少的服务器上,也就是 Nginx 会将请求试图转发给相对空闲的服务器以实现负载平衡。配置如下
upstream myapp1 {
least_conn;//加此标识则实现了最少连接数负载均衡
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
4、ip-hash 负载均衡
大家有没有发现。上述三种策略都没办法保证将每个客户端的请求固定的分配到一台服务器。那么问题来了,现在有这样一种场景:
假如用户的登录信息是保存在单台服务器上的,而不是保存在类似于 Redis 这样的第三方中间件上时,如果不能将每个客户端的请求固定的分配到一台服务器上,就会导致用户的登录信息丢失。因此用户在每次请求服务器时都需要进行登录验证,这样显然是不合理的。 这时候就需要我们的ip-hash策略算法了
ip-hash 负载均衡策略可以根据客户端的 IP,将其固定的分配到相应的服务器上,它的配置示例如下:
upstream myapp1 {
ip_hash; //加此标识则实现了ip-hash策略
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
总结
负载均衡和缓存功能是 Nginx 最常用的两个功能,这两个功能都属于高性能的调优手段,也和后端人员的关系比较密切,只有了解并会使用它们才能更好地调试和运行自己的项目。本节就讲到这里,后面我会推出一篇缓存和nginx结合使用的项目实践。欢迎大家关注。后面会推出更多的干货。
弦外之音
感谢你的阅读,如果你感觉学到了东西,麻烦您点赞,关注。也欢迎有问题我们下面评论交流
加油! 我们下期再见!
给大家分享几个我前面写的几篇骚操作