目录
1 Nginx简介
2 相关概念
2.1 简单请求和非简单请求
2.2 跨域
2.3 正向代理和反向代理
2.4 负载均衡
2.5 动静分离
3 环境准备
3.1 安装gcc
3.2 安装openssl
3.3 安装pcre
3.4 安装zlib
4 安装nginx
5 负载均衡配置
5.1 准备工作
5.2 配置示例
5.3 实现效果
5.4 nginx分配服务器策略
6 结束语
传统的 Web 服务器,每个客户端连接作为一个单独的进程或线程处理,需在切换任务时将 CPU 切换到新的任务并创建一个新的运行时上下文,消耗额外的内存和 CPU 时间,当并发请求增加时,服务器响应变慢,从而对性能产生负面影响。
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是,Nginx 是免费的并可以商业化,配置使用也比较简单。
Nginx 的最重要的几个使用场景:
静态资源服务,通过本地文件系统提供服务;
反向代理服务,延伸出包括缓存、负载均衡等;
API 服务,OpenResty ;
首先我们来了解一下简单请求和非简单请求,如果同时满足下面两个条件,就属于简单请求:
请求方法是 HEAD
、GET
、POST
三种之一;
HTTP 头信息不超过右边着几个字段:Accept
、Accept-Language
、Content-Language
、Last-Event-ID
Content-Type
只限于三个值 application/x-www-form-urlencoded
、multipart/form-data
、text/plain
;
凡是不同时满足这两个条件的,都属于非简单请求。
浏览器处理简单请求和非简单请求的方式不一样:
简单请求
对于简单请求,浏览器会在头信息中增加 Origin
字段后直接发出,Origin
字段用来说明,本次请求来自的哪个源(协议+域名+端口)。
如果服务器发现 Origin
指定的源不在许可范围内,服务器会返回一个正常的 HTTP 回应,浏览器取到回应之后发现回应的头信息中没有包含 Access-Control-Allow-Origin
字段,就抛出一个错误给 XHR 的 error
事件;
如果服务器发现 Origin
指定的域名在许可范围内,服务器返回的响应会多出几个 Access-Control-
开头的头信息字段。
非简单请求
非简单请求是那种对服务器有特殊要求的请求,比如请求方法是 PUT
或 DELETE
,或 Content-Type
值为 application/json
。浏览器会在正式通信之前,发送一次 HTTP 预检 OPTIONS
请求,先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些 HTTP 请求方法和头信息字段。只有得到肯定答复,浏览器才会发出正式的 XHR
请求,否则报错。
在浏览器上当前访问的网站向另一个网站发送请求获取数据的过程就是跨域请求。
跨域是浏览器的同源策略决定的,是一个重要的浏览器安全策略,用于限制一个 origin 的文档或者它加载的脚本与另一个源的资源进行交互,它能够帮助阻隔恶意文档,减少可能被攻击的媒介,可以使用 CORS 配置解除这个限制。
关于跨域网上已经有很多解释,这里就不啰嗦,也可以直接看 MDN 的 <浏览器的同源策略> 文档进一步了解,这里就列举几个同源和不同元的例子,相信程序员都能看得懂。
# 同源的例子
http://example.com/app1/index.html # 只是路径不同
http://example.com/app2/index.html
http://Example.com:80 # 只是大小写差异
http://example.com
# 不同源的例子
http://example.com/app1 # 协议不同
https://example.com/app2
http://example.com # host 不同
http://www.example.com
http://myapp.example.com
http://example.com # 端口不同
http://example.com:8080
反向代理(Reverse Proxy)对应的是正向代理(Forward Proxy),他们的区别:
正向代理: 一般的访问流程是客户端直接向目标服务器发送请求并获取内容,使用正向代理后,客户端改为向代理服务器发送请求,并指定目标服务器(原始服务器),然后由代理服务器和原始服务器通信,转交请求并获得的内容,再返回给客户端。正向代理隐藏了真实的客户端,为客户端收发请求,使真实客户端对服务器不可见;
例如:你的浏览器无法直接访问谷哥,这时候可以通过一个代理服务器来帮助你访问谷哥,那么这个服务器就叫正向代理。
反向代理: 与一般访问流程相比,使用反向代理后,直接收到请求的服务器是代理服务器,然后将请求转发给内部网络上真正进行处理的服务器,得到的结果返回给客户端。反向代理隐藏了真实的服务器,为服务器收发请求,使真实服务器对客户端不可见。一般在处理跨域请求的时候比较常用。现在基本上所有的大型网站都设置了反向代理。
例如:去饭店吃饭,可以点川菜、粤菜、江浙菜,饭店也分别有三个菜系的厨师 ,但是你作为顾客不用管哪个厨师给你做的菜,只用点菜即可,小二将你菜单中的菜分配给不同的厨师来具体处理,那么这个小二就是反向代理服务器。
简单的说,一般给客户端做代理的都是正向代理,给服务器做代理的就是反向代理。
正向代理和反向代理主要的原理区别可以参见下图:
一般情况下,客户端发送多个请求到服务器,服务器处理请求,其中一部分可能要操作一些资源比如数据库、静态资源等,服务器处理完毕后,再将结果返回给客户端。
这种模式对于早期的系统来说,功能要求不复杂,且并发请求相对较少的情况下还能胜任,成本也低。随着信息数量不断增长,访问量和数据量飞速增长,以及系统业务复杂度持续增加,这种做法已无法满足要求,并发量特别大时,服务器容易崩。
很明显这是由于服务器性能的瓶颈造成的问题,除了堆机器之外,最重要的做法就是负载均衡。
请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡,核心是「分摊压力」。Nginx 实现负载均衡,一般来说指的是将请求转发给服务器集群。
例如:晚高峰乘坐地铁的时候,入站口经常会有地铁工作人员大喇叭“请走 B 口,B 口人少车空....”,这个工作人员的作用就是负载均衡。
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
一般来说,都需要将动态资源和静态资源分开,由于 Nginx 的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx 上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。
使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响
本次使用系统环境是centos7.5
如果要使用nginx,首先要准备环境,因为nginx是c语言写的,必须在安装nginx之前安装gcc、openssl、pcre、zlib这四个前提依赖。
本次实战是离线安装方式,需要下载安装包,请自行下载。
(1)上传压缩依赖包
(2)解压压缩文件
tar -xvf xxxxxx
(3)进入解压目录执行命令
./configure
make
make check
make install
(1)上传压缩依赖包
(2)解压压缩文件
tar -xvf xxxxxx
(3)进入解压目录执行命令
./configure
make
make check
make install
(1)上传压缩依赖包
(2)解压压缩文件
tar -xvf xxxxxx
(3)进入解压目录执行命令
./configure
make
make check
make install
(1)上传压缩依赖包
(2)解压压缩文件
tar -xvf xxxxxx
(3)查看编辑参数
./configure --help
(4)添加prefix路径
./configure --prefix=/usr/local/zlib
(5)查看执行结果
echo $?
(6)编译执行安装
make
make check
make install
(7)写入动态库的路径
echo "/usr/local/zlib/lib/" >> /etc/ld.so.conf
ldconfig -v
(1)上传压缩依赖包
(2)解压压缩文件
tar -xvf xxxxxx
(3)进入解压目录执行命令
./configure
make
make check
make install
(4)进入目录 /usr/local/nginx/sbin/nginx 启动服务
(5)nginx常用命令
进入nginx安装目录:cd /usr/local/nginx/sbin
查看nginx 版本号: ./nginx -v
启动nginx: ./nginx
停止nginx: ./nginx -s stop
重新加载nginx: ./nginx -s reload
因为我是微服务spring boot项目,至此以微服务为例,配置nginx负载均衡。
部署两个微服务项目,一个是8073,一个是8072
浏览器地址栏输入地址 http://172.16.5.89:8070,负载均衡效果,平均 8072 和 8073 端口中
(1)轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
(2)weight
weight 代表权重默认为 1,权重越高被分配的客户端越多。
(3)ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器。
(4)fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
至此nginx安装以及spring boot微服务项目负载均衡配置完成。
如需要离线安装包,请自行下载,地址:https://download.csdn.net/download/lovelichao12/12503614