本章作为实战篇,将从实际的命令行出发,通过安装,启动,配置nginx来逐渐认识和使用Nginx,并能够自己实现一些简单的反向代理,负载均衡的配置。nginx本身作为一个完成度非常高的负载均衡框架,和很多成熟的开源框架一样,大多数功能都可以通过修改配置文件来完成,使用者只需要简单修改一下nginx配置文件,便可以非常轻松的实现比如反向代理,负载均衡这些常用的功能。
Nginx(engine x)是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器和HTTP缓存。
讲反向代理之前,先讲一个概念,什么是正向代理(Forward proxy)。如果没有特殊说明,我们所说的代理就是指正向代理。正向代理过程,隐藏了真实请求的客户端,服务端不知道真正的客户端是谁,客户端的请求都是被代理服务器代替来请求的。比如某些用来上网的工具(访问Google等站点)就是一个正向代理,正常浏览器访问http://google.com肯定是无法访问的,如果存在一个国外的服务器,当你访问google时,替你向google发了一次请求,并且把结果传给你,这时候你在浏览器浏览器的表象就是你可以访问google了,但是谷歌服务器并不知道真正访问的客户端是你的浏览器,也就是说正向代理是代理客户端,对服务器而言隐藏了真实的客户端。
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。看概念好像跟正向代理差不多,但其实可以看到最直观的一点区别,正向代理你浏览器访问的额是目标地址,而反向代理浏览器访问的是代理服务器。举个例子,当我们访问http://baidu.com时,我们都知道百度有成千上万台服务器在工作,所以真正响应你请求的服务器是未知的,但其实我们也不关心到底哪台服务器为我们工作了,我们只需要知道反向代理服务器,就能获取服务。浏览器并不知道真正访问的服务端是哪个,也就是说反向代理是代理服务器,对于浏览器而言隐藏了真实的服务端。
本文所使用的服务器操作系统是Centos,Nginx的安装方式可以有两种,一种是源码包安装、另一种是yum安装。yum安装比较简单,不容易出错。源码包安装是先将Nginx的源码下载下来,在自己的系统里编译生成可执行文件,然后执行,因为是在自己的系统上编译的,在性能上也许更好,这里投个懒,就不使用源码包这种方式了,有兴趣的同学可以去了解一下。
yum -y install nginx
-y表示安装过程中自动键入Y继续安装,安装成功后Nginx目录如下:
保存配置文件后重启Nginx,当访问localhost的时候,就相当于访问localhost:8080了
负载均衡是Nginx常用的一个功能,意思是讲请求分摊到多个服务单元上进行执行,例如Web服务器、FTP服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。
3.2.1 RR
这是Nginx的默认策略,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
假如upstream中其中一个服务8080挂掉了,访问http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8081,。因为Nginx会自动判断服务器的状态,如果服务器处于不能访问,就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,这就是Nginx的默认策略RR。
3.2.2 权重
指定每个服务的轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
假如有10次请求,很有可能8081服务被访问1次,8080被访问10次。
3.2.3 ip_hash
上面两种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当程序不是无状态的时候(比如服务端采用session保存数据),这时候就有一个很大的很问题。比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用ip_hash了,ip_hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3.2.4 fair
这是一个第三方策略,按后端服务器的响应时间来分配请求,响应时间短的优先分配。
3.2.5 url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,这种策略比较适合后端服务器存在缓存的情况,在upstream中加入hash语句即可。
一些对安全性要求比较高的站点,可能会使用 HTTPS(一种使用 ssl 通信标准的安全 HTTP 协议),https反向代理配置与http反向代理配置基本上是相似的,但需要知道几点:
有时候,我们需要配置静态站点(只包含html 文件和一堆静态资源)。比如所有的静态资源都放在了/app/dist目录下,我们只需要在Nginx配置文件中指定首页以及这个站点的host即可。
当我们升级http服务为https服务时,为了兼顾一些访问者还是通过http访问的方式,我们通常采用两种方式。
3.5.1 兼容方式
3.5.2 重定向方式
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。
这样我们就可以吧HTML以及图片和css以及js放到/app/dist目录下,而tomcat只负责处理后台处理,例如当我们后缀为gif的时候,Nginx默认会从/app/dist获取到当前请求的动态图文件返回。这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,并通过proxy_pass属性指定。
web开发领域中,经常采用前后端分离模式。这种模式下,前端和后端分别是独立的web应用程序,比如后端是Java 程序,前端是React或Vue应用。各自独立的web app在互相访问时,势必存在跨域问题。解决跨域问题一般有两种思路:
Nginx针对CORS提供了一种跨域解决方案,比如前端后端存在跨域时,前端和后端如果使用http进行交互,请求会被拒绝。这时候可以通过设置后台服务响应头方式解决。
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2018 群英 版权所有 茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号-36 粤公网安备 44090202000006号 粤工商备P091701000595