栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

高可用负载均衡&反向代理服务

Java 更新时间:发布时间: 百科书网 趣学号
高可用负载均衡&反向代理服务 概念简介 什么是高可用
  • 高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。
  • 假设系统一直能够提供服务,我们说系统的可用性是100%。
  • 如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。
  • 很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。
  • 百度的搜索首页,是业内公认高可用保障非常出色的系统,甚至人们会通过http://www.baidu.com 能不能访问来判断“网络的连通性”,百度高可用的服务让人留下啦“网络通畅,百度就能访问”,“百度打不开,应该是网络连不上”的印象,这其实是对百度HA最高的褒奖。
如何保障系统的高可用
  • 我们都知道,单点是系统高可用的大敌,单点往往是系统高可用最大的风险和敌人,应该尽量在系统设计的过程中避免单点。方法论上,高可用保证的原则是“集群化”,或者叫“冗余”:只有一个单点,挂了服务会受影响;如果有冗余备份,挂了还有其他backup能够顶上。
  • 保证系统高可用,架构设计的核心准则是:冗余。有了冗余之后,还不够,每次出现故障需要人工介入恢复势必会增加系统的不可服务实践。所以,又往往是通过“自动故障转移”来实现系统的高可用。
高可用工作方式

(1)主从方式 (非对称方式)

  • 工作原理:主机工作,备机处于监控准备状况;当主机宕机时,备机接管主机的一切工作,待主机恢复正常后,按使用者的设定以自动或手动方式将服务切换到主机上运行,数据的一致性通过共享存储系统解决。

(2)双机双工方式(互备互援)

  • 工作原理:两台主机同时运行各自的服务工作且相互监测情况,当任一台主机宕机时,另一台主机立即接管它的一切工作,保证工作实时,应用服务系统的关键数据存放在共享存储系统中。

(3)集群工作方式(多服务器互备方式)

  • 工作原理:多台主机一起工作,各自运行一个或几个服务,各为服务定义一个或多个备用主机,当某个主机故障时,运行在其上的服务就可以被其它主机接管。
什么是负载均衡
  • 负载均衡LB(Load Balancing)是一种计算机网络技术, 用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载, 以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。使用带有负载均衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载均衡服务通常是由专用软件和硬件来完成。
硬件负载与软件负载 硬件负载均衡
  • 主要品牌有:F5、Array、NetScaler等

  • 优点

    • 其功能强大,不仅包含负载均衡还包括应用交换、会话交换、状态监控、智能网络地址转换、通用持续性、响应错误处理、IPv6网关、高级路由、智能端口镜像、SSL加速、智能HTTP压缩、TCP优化、第7层速率整形、内容缓冲、内容转换、连接加速、高速缓存、cookie加密、选择性内容加密、应用攻击过滤、拒绝服务(DoS)攻击和SYN Flood保护、防火墙过滤等功能。
    • 直接连接交换机,处理网络请求能力强,与系统无关,负载性可以强。可以应用于大量设施、适应大访问量、使用简单。
  • 缺点

    • 价格高昂、成本高,配置冗余.即使网络请求分发到服务器集群,负载均衡设施却是单点配置。
    • 无法有效掌握服务器及应使用状态。
软件负载均衡
  • 主要有LVS、HAProxy、Nginx等

  • 优点

    • 便宜:只要每个Linux服务器,然后装上Nginx或者其他负载均衡软件
    • 灵活:7层和4层负载均衡可以根据业务进行选择,也可以根据业务进行比较方便的扩展,比如:由于业务特殊性需要做一些定制化的功能。
  • 缺点

    • 性能一般:比如说一个Nginx大约能支撑5w并发
    • 功能没有硬件负载均衡强大(这个有点牵强,毕竟价格差距在那里)
    • 安全性远不如硬件负载均衡。
负载均衡的常见负载算法
  • RR 轮询

    • 这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
  • WRR 加权轮

    • 这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充,LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
  • LBLC 基于局部性的最少连接调度算法

    • 这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
  • LBLCR 复杂的基于局部性最少的连接算法

    • 记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
  • DH 目标地址散列调度算法

    • 该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
  • SH 源地址散列调度算法

    • 与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源
  • R 随机法

    • 随机算法也是一种适用场景比较多的负载均衡算法,这种算法基本思想也很简单,随机生成一个数字(或者随机挑一个IP地址)出来,然后挑到谁就去谁家,当然,如果随机数是等概况生成的,那时间长了,基本上跟轮询算法也没啥区别了,当然区别最主要的还是在顺序,随机么就没那么严格的顺序了。
  • WR 加权随机法

    • 加权随机法是在随机法的基础上加了加权的条件,随机法时间长了,基本上跟一般轮询算法就没啥区别了,刚才也提到了,如果服务器的配置都差不多,那也就算了,但是如果服务器处理能力差异比较大,那水平高的和水平低的服务器都给这么多任务,那对于高配置来讲就有点浪费,对于低配置的服务器来讲却有点吃不消,所以在这种配置差异性比较大的情况下,加权的工作还是十分必要的。加权随机算法就是适用于这样的场景。
软负载之:nginx介绍 百度百科地址
https://baike.baidu.com/item/nginx
nginx简介
  • Nginx (“engine x”) 是一个开源的,支持高性能、高并发的 Web 服务和代理服务软件。它是由俄罗斯人 Igor Sysoev 开发的,最初被应用在俄罗斯的大型网站www.rambler.ru 上。后来作者将源代码以类 BSD 许可的形式开源出来供全球使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EMNRloXP-1632891678744)(G:笔记Linux运维第三阶段高可用负载均衡&反向代理服务.assetsimage-20210919164035870.png)]

  • Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处理网络请求与响应。
  • master进程主要用来管理worker进程,具体包括如下4个主要功能:
  1. 接收来自外界的信号。
  2. 向各worker进程发送信号。
  3. 监控woker进程的运行状态。
  4. 当woker进程退出后(异常情况下),会自动重新启动新的woker进程。
nginx优点
  • 轻量级,同样起web 服务,比apache 占用更少的内存及资源
  • 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简单
  • 社区活跃,各种高性能模块出品迅速
  • Nginx本身就是一个反向代理服务器
  • Nginx支持7层负载均衡
  • nginx 适合做静态,简单,效率高
  • 功能强大,社区衍生版众多,超主流代理服务器
nginx应用场景
  • WEB服务器:这是应用比较多的场景,配置虚拟主机提供HTTP WEB服务。可以先通过动态/静态内容分离,而后为静态内容(html/css/js/图片等)提供HTTP访问功能;而动态内容可以整合代理模块,代理给上游服务器,来支持对外部程序的直接调用或者解析。
  • 反向代理服务器:这是应用非常多的场景,为后端服务器代理。接收客户端请求,根据负载均衡策略转发给后端多个上游服务器处理;然后再等待后端服务器返回请求响应,接收到后再返回给请求的客户端。
nginx基本架构
一个master进程生成多个worker子进程(每个进程只有一个线程),一个worker响应多个用户请求
非阻塞、IO复用、事件驱动:select,poll, epoll, kqueue,/dev/poll
支持sendfile,sendfile64
支持文件AIO(异步I/O)
支持mmap
灵活的文件配置
占用内存小:10,000个非活动HTTP保持连接占用大约2.5M内存
nginx基本功能
实现与服务静态文件(静态资源的web服务器),能缓存打开的文件描述符
反向代理服务器,缓存、负载均衡、健康状态检测
支持FastCGI
模块化机制,非DSO机制,支持多种过滤器gzip,SSI和图像的模块完成图形大小调整等支持SSL
基于名称和IP做虚拟主机
支持keeplive
支持平滑配置更新或程序版本升级
定制访问日志,支持使用日志缓存以提高性能
支持URL rewrite
支持路径别名
支持基于IP及用户的认证
支持速率限制,并发数限制等
基本概念 什么是代理
  • 代理其实就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介。刚开始的时候,代理多数是帮助内网client访问外网server用的后来出现了反向代理,"反向"这个词在这儿的意思其实是指方向相反,即代理将来自外网客户端的请求转发到内网服务器,从外到内。

  • 总结:

    • 正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端
    • 反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端
正向代理
  • 正向代理类似一个跳板机,代理访问外部资源
  • 比如我们国内访问谷歌,直接访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ASrReYFc-1632891678746)(G:笔记Linux运维第三阶段高可用负载均衡&反向代理服务.assetsimage-20210919164405774.png)]

正向代理的用途
  • 访问原来无法访问的资源,如google
  • 可以做缓存,加速访问资源
  • 对客户端访问授权,上网进行认证
  • 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理(Reverse Proxy)
  • 反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连
    接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d4yvTPpl-1632891678747)(G:笔记Linux运维第三阶段高可用负载均衡&反向代理服务.assetsimage-20210919164455937.png)]

反向代理的作用
  • 保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
  • 负载均衡,通过反向代理服务器来优化网站的负载
动静分离 什么是动静分离
  • 为了提高网站的响应速度,减轻程序服务器(tomcat,jboss等)的负载,对于静态资源比如图片,js,css等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。用户请求的动态文件比如servlet,jsp则转发给tomcat,jboss服务器处理,这就是动静分离。这也是反向代理服务器的一个重要的作用。

  • java动静分离。主要是通过nginx+tomcat来实现,其中nginx处理图片、html、js、css等静态文件,tomcat处理jsp、servlet等动态请求。

静分离结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ShO7MWQc-1632891678748)(G:笔记Linux运维第三阶段高可用负载均衡&反向代理服务.assetsimage-20210919164632142.png)]

nginx安装 官网地址
http://nginx.org/
Nginx官方文档 英文版
http://tengine.taobao.org/nginx_docs/en/index.html
中文版
http://tengine.taobao.org/nginx_docs/cn/
版本介绍
  • MainLine Version:主线版本开发
  • Stable:稳定版本
  • Legacy Version:历史版本
windows系统
  • zip包免安装版本
  • 80端口不能被占用
nginx安装 注意事项
  • 由于nginx默认端口也是80端口,如果此时你的机器上开启了Apache或者IIS服务,切忌在启动nginx之前务必关闭IIS或Apache服务,否则nginx启动命令不会成功。

  • 安装目录中不要包含中文或者特殊字符

  • 控制台(CMD)切换到Nginx目录下,输入start nginx ,然后在浏览器页面输入IP地址,出现如下界面则表示安装成功。默认监听80端口号。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YSJR4hVn-1632891678749)(G:笔记Linux运维第三阶段高可用负载均衡&反向代理服务.assetsimage-20210919165627033.png)]

  • 打开浏览器,在地址栏中输入IP地址。
http://192.168.198.198/
  • nginx主页如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xfE8SaKN-1632891678749)(G:笔记Linux运维第三阶段高可用负载均衡&反向代理服务.assetsimage-20210919165705614.png)]

nginx 命令
开启nginx服务
start nginx

nginx -v 显示nginx的版本信息(nginx version)
nginx -t 查看nginx的配置文件的目录
nginx -h 查看帮助信息

关闭nginx服务,快速停止nginx,可能并不保存相关信息
nginx.exe -s stop

关闭nginx服务,完整有序的停止nginx,并保存相关信息
nginx.exe -s quit

重载nginx服务,当你改变了nginx配置信息并需要重新载入这些配置时可以使用此命令重载nginx
nginx.exe -s reload

重新打开日志文件命令
nginx -s reopen
nginx的目录结构
  • nginx的优秀除了体现在程序结构以及代码风格上,nginx的源码组织也同样简洁明了,目录结构层次结构清晰,值得我们去学习。nginx的源码目录与nginx的模块化以及功能的划分是紧密结合,这也使得我们可以很方便地找到相关功能的代码。
conf 目录:存放 Nginx 的主要配置文件,很多功能实现都是通过配置该目录下的
nginx.conf 文件,后面我们会详细介绍。
docs 目录:存放 Nginx 服务器的主要文档资料,包括 Nginx 服务器的 LICENSE、
OpenSSL 的 LICENSE 、PCRE 的 LICENSE 以及 zlib 的 LICENSE ,还包括本版
本的 Nginx服务器升级的版本变更说明,以及 README 文档。
html 目录:存放了两个后缀名为 .html 的静态网页文件,这两个文件与 Nginx 服务器
的运行相关。
logs 目录:存放 Nginx 服务器运行的日志文件。
temp:用来存放零时文件
nginx.exe:启动 Nginx 服务器的exe文件,如果 conf 目录下的 nginx.conf 文
件配置正确的话,通过该文件即可启动 Nginx 服务器。
配置文件
  • nginx.conf
  • 包含三部分内容
    1. 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,处理并发数的配置,日志存放路径,配置文件引入,允许生成worker process数等。
    2. events 块:配置影响nginx服务器或与用户的网络连接 。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
    3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。 还包含两部分:
      • http 全局块:配置虚拟主机的相关参数,一个http中可以有多个server。
      • server 块:配置请求的路由,以及各种页面的处理情况。
精简配置
worker_processes 1;
events {
	worker_connections 1024;
}
http {
	include mime.types;
	default_type application/octet-stream;
	sendfile on;
	keepalive_timeout 65;
	server {
		listen 8080;
		server_name localhost;
		location / {
			root html;
			index index.html index.htm;
		}
		error_page 500 502 503 504 /50x.html;
		location = /50x.html {
			root html;
		}
	}
}
基本配置
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobodynobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:
debug|info|notice|warn|error|crit|alert|emerg
events {
	accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
	multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
	#use epoll; #事件驱动模型,
	select|poll|kqueue|epoll|resig|/dev/poll|eventport
	worker_connections 1024; #最大连接数,默认为512
}
http {
	include mime.types; #文件扩展名与文件类型映射表
	default_type application/octet-stream; #默认文件类型,默认为text/plain
	#access_log off; #取消服务日志
	log_format myFormat '$remote_addr–$remote_user [$time_local]
	$request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
	access_log log/access.log myFormat; #combined为日志格式的默认值
	sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
	sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
	keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
	upstream mysvr {
		server 127.0.0.1:7878;
		server 192.168.10.121:3333 backup; #热备
	}
	error_page 404 https://www.baidu.com; #错误页
	server {
		keepalive_requests 120; #单连接请求上限次数。
		listen 4545; #监听端口
		server_name 127.0.0.1; #监听地址
		location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
			#root path; #根目录
			#index vv.txt; #设置默认页
			proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
			deny 127.0.0.1; #拒绝的ip
			allow 172.18.5.54; #允许的ip
		}
	}
}
入门案例 案例一:修改欢迎页面
  • 修改index.html页面,欢迎来到nginx!



	Welcome to nginx!



欢迎来到nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

中文乱码问题
  • 如果出现中文乱码问题,需要在html页面中增加配置




Welcome to nginx!



欢迎来到nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

案例二:修改端口号 修改配置文件
.....省略配置.....
server {
listen 8080;
server_name localhost;
.....省略配置.....
重启nginx
nginx.exe -s reload
测试
http://192.168.198.198:8080/
实战案例 案例一:配置本地虚拟主机 修改nginx.conf文件
  • 进入 conf 文件夹,新建 lagouedu 文件夹;
  • 将内部的 lagouedu 配置段提取单独放在一个文件里,存到了 conf/lagouedu下,以方便配置多个虚拟主机。
  • 并在 nginx.conf 里 http 配置段内添加了一行 include lagouedu/*.conf; 用来读取 servers 下的虚拟主机配置
  • 为了方便操作,我们基本都是在conf文件最后一行前边添加。
include lagouedu/*.conf;
lagouedu.conf文件
  • 在lagouedu文件夹中新建lagouedu.conf文件。更换新的欢迎页面。
server {
	listen 9090;
	server_name localhost;
	location / {
		root html;
		index lagouedu.html lagouedu.htm;
	}
	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root html;
	}
}
lagouedu.html



Welcome to nginx!



欢迎来到拉勾教育!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

重启nginx
nginx.exe -s reload
测试
http://192.168.198.198:9090/
案例二:修改首页位置
  • 默认为html/index.hml。可以通过修改lagouedu.conf文件将首页放置在其他位置。
    • 在E盘新建lagouedu目录,用来存放首页
    • 复制nginx中的html文件夹,将html粘贴到lagouedu中
    • 删除nginx中的html文件夹中的lagouedu.html
lagouedu.conf文件
  • 在lagouedu文件夹中修改lagouedu.conf文件。更换新的欢迎页面位置
server {
	listen 9090;
	server_name localhost;
	location / {
		root E:lagoueduhtml;
		index lagouedu.html lagouedu.htm;
	}
	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root html;
	}
}
lagouedu.html
  • 更新页面内容 欢迎来到拉勾教育!修改了首页位置



Welcome to nginx!



欢迎来到拉勾教育!修改了首页位置

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

重启nginx
nginx.exe -s reload
测试
http://192.168.198.198:9090/
案例三:虚拟域名
  • 推荐在虚拟机中配置。不要在宿主机中进行配置
修改host文件
  • 可以自行修改:C:WindowsSystem32driversetc下的hosts文件。
  • hosts文件在系统盘中不允许修改,我们可以将其复制出来修改后再粘贴回去。
127.0.0.1 www.devopstest.com
重启nginx
nginx.exe -s reload
测试
http://www.devopstest.com:9090/
案例四:反向代理
  • 通过反向代理的方式配置上一个案例
  • 正向代理:是一个位于客户端和目标服务器之间的服务器,为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标(目标服务器),然后代理向目标服务器转交请求并将获得的内容返回给客户端。
  • 简单来说:
  • 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器;这个代理服务器呢,他能访问那个我不能访问的网站;于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容;代理服务器去取回来,然后返回给我;从网站的角度,只在代理服务器来取内容的时候有一次记录;有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
  • 反向代理:对于客户端而言它就像是目标服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(目标服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
  • 简单来说:
  • 用户访问www.google.com 。 国内无法访问。例如可以访问ooxx.meooxx.me上并不存在readme偷偷从另外一台服务器上取回来,然后作为自己的内容吐给用户;但用户并不知情;这里所提到的 ooxx.me 这个域名对应的服务器就设置了反向代理功能;
  • 正向代理和反向代理的区别:
    (1)从用途上来讲:
    • 正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。
      (2)从安全性来讲:
    • 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
  • 这两个代理的核心区别是:正向代理代理的是客户端,而反向代理代理的是服务器。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eHwfUojS-1632891678750)(G:笔记Linux运维第三阶段高可用负载均衡&反向代理服务.assetsimage-20210919172004115.png)]

  • nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要正则表达式写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。
反向代理配置
  • 修改location中的配置 proxy_pass http://127.0.0.1:9090;
修改nginx.conf文件
server {
	listen 80;
	server_name localhost;
	location / {
		proxy_pass http://127.0.0.1:9090;
		index index.html index.htm;
	}
}
重启nginx
nginx -s reload
测试
http://www.devopstest.com/
反向代理相关指令介绍 listen
  • 该指令用于配置网络监听。主要有如下三种配置语法结构:
  • 配置监听的IP地址
listen address[:port] [default_server] [setfib=number]
[backlog=number] [rcvbuf=size] [sndbuf=size] [deferred]
[accept_filter=filter] [bind] [ssl];
  • 配置监听端口
listen port[default_server] [setfib=number] [backlog=number]
[rcvbuf=size] [sndbuf=size] [accept_filter=filter]
[deferred] [bind] [ipv6only=on|off] [ssl];
  • 配置 UNIX Domain Socket
listen unix:path [default_server] [backlog=number]
[rcvbuf=size] [sndbuf=size] [accept_filter=filter]
[deferred] [bind] [ssl];
listen *:80 | *:8080 #监听所有80端口和8080端口
listen IP_address:port #监听指定的地址和端口号
listen IP_address #监听指定ip地址所有端口
listen port #监听该端口的所有IP连接
  • 下面分别解释每个选项的具体含义:
    1. address:IP地址,如果是 IPV6地址,需要使用中括号[] 括起来,比如[fe80::1]等。
    2. port:端口号,如果只定义了IP地址,没有定义端口号,那么就使用80端口。
    3. path:socket文件路径,如 var/run/nginx.sock等。
    4. default_server:标识符,将此虚拟主机设置为 address:port 的默认主机。(在 nginx-0.8.21 之前使用的是 default 指令)
    5. setfib=number:nginx-0.8.44 中使用这个变量监听 socket 关联路由表,目前只对 FreeBSD 起作用,不常用。
    6. backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在 FreeBSD 中默认为 -1,其他平台默认为511.
    7. rcvbuf=size:设置监听socket接收缓存区大小。
    8. sndbuf=size:设置监听socket发送缓存区大小。
    9. deferred:标识符,将accept()设置为Deferred模式。
    10. accept_filter=filter:设置监听端口对所有请求进行过滤,被过滤的内容不能被接收和处理,本指令只在 FreeBSD 和 NetBSD 5.0+ 平台下有效。filter 可以设置为 dataready 或 httpready 。
    11. bind:标识符,使用独立的bind() 处理此address:port,一般情况下,对于端口相同而IP地址不同的多个连接,nginx 服务器将只使用一个监听指令,并使用bind() 处理端口相同的所有连接。
    12. ssl:标识符,设置会话连接使用 SSL模式进行,此标识符和Nginx服务器提供的 HTTPS 服务有关。
server_name
  • 该指令用于虚拟主机的配置。通常分为以下两种:
    • 基于名称的虚拟主机配置
    • 基于 IP 地址的虚拟主机配置
基于名称的虚拟主机配置
  • 语法格式如下:
server_name name ...;
  1. 对于name 来说,可以只有一个名称,也可以有多个名称,中间用空格隔开。而每个名字由两段或者三段组成,每段之间用“.”隔开。
server_name 123.com www.123.com
  1. 可以使用通配符“*”,但通配符只能用在由三段字符组成的首段或者尾端,
    或者由两端字符组成的尾端。
server_name *.123.com www.123.*
  1. 还可以使用正则表达式,用“~”作为正则表达式字符串的开始标记。
server_name ~^wwwd+.123.com$;
  • 该表达式“”表示匹配正则表达式,以www开头(“^”表示开头),紧跟着一个09之间的数字,在紧跟“.123.co”,最后跟着“m”($表示结尾)
  • 以上匹配的顺序优先级如下:
1 准确匹配 server_name
2 通配符在开始时匹配 server_name 成功
3 通配符在结尾时匹配 server_name 成功
4 正则表达式匹配 server_name 成功
基于 IP 地址的虚拟主机配置
  • 语法结构和基于域名匹配一样,而且不需要考虑通配符和正则表达式的问题
server_name 192.168.1.1
location
  • 该指令用于匹配 URL。
  • 语法如下:
location [ = | ~ | ~* | ^~] uri {
}
  1. = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
  2. ~:用于表示 uri 包含正则表达式,并且区分大小写。
  3. ~*:用于表示 uri 包含正则表达式,并且不区分大小写。
  4. ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用location 块中的正则 uri 和请求字符串做匹配。
  • 注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
proxy_pass
  • 该指令用于设置被代理服务器的地址。可以是主机名称、IP地址加端口号的形式。

  • 语法结构如下:

proxy_pass URL;
  • URL 为被代理服务器的地址,可以包含传输协议、主机名称或IP地址加端口号,
    URI等。
proxy_pass http://www.123.com/uri;
index
  • 该指令用于设置网站的默认首页。
  • 语法为:
index filename ...;
  • 后面的文件名称可以有多个,中间用空格隔开。
index index.html index.jsp;
  • 通常该指令有两个作用:第一个是用户在请求访问网站时,请求地址可以不写首页名称;第二个是可以对一个请求,根据请求内容而设置不同的首页。
案例五:负载均衡 负载均衡概述
  • 早期的系统架构,基本上都是如下形式的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9XrHgKf3-1632891678751)(G:笔记Linux运维第三阶段高可用负载均衡&反向代理服务.assetsimage-20210919173105028.png)]

  • 客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
  • 这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?
  • 我们首先想到的可能是升级服务器的配置,比如提高CPU执行频率,加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?
  • 上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ytsaXNoX-1632891678751)(G:笔记Linux运维第三阶段高可用负载均衡&反向代理服务.assetsimage-20210919173156566.png)]

  • 负载均衡完美的解决了单个服务器硬件性能瓶颈的问题,但是随着而来的如何实现负载均衡呢?客户端怎么知道要将请求发送到那个服务器去处理呢?
  • nginx 服务器是介于客户端和服务器之间的中介,实现反向代理的功能,客户端发送的请求先经过 nginx ,然后通过 nginx 将请求根据相应的规则分发到相应的服务器。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzbrLJEW-1632891678752)(G:笔记Linux运维第三阶段高可用负载均衡&反向代理服务.assetsimage-20210919173229243.png)]

负载均衡算法
  • 源地址哈希法
  • 轮询法
  • 随机法
  • 加权轮询法
  • 加权随机法
  • 最小连接数法
nginx实现负载均衡
  • 负载均衡主要通过专门的硬件设备或者软件算法实现。通过硬件设备实现的负载均衡效果好、效率高、性能稳定,但是成本较高。而通过软件实现的负载均衡主要依赖于均衡算法的选择和程序的健壮性。均衡算法又主要分为两大类:
    • 静态负载均衡算法:主要包括轮询算法、基于比率的加权轮询算法或者基于优先级的加权轮询算法。
    • 动态负载均衡算法:主要包括基于任务量的最少连接优化算法、基于性能的最快响应优先算法、预测算法及动态性能分配算法等。
    • 静态负载均衡算法在一般网络环境下也能表现的比较好,动态负载均衡算法更加适用于复杂的网络环境。
普通轮询算法
两台相同的Tomcat服务器,通过 localhost:8080 访问Tomcat1,通过localhost:8081访问Tomcat2,现在我们要输入 localhost 这个地址,可以在这两个Tomcat服务器之间进行交替访问
基于比例加权轮询
  • 上述两台Tomcat服务器基本上是交替进行访问的。但是这里我们有个需求:由于Tomcat1服务器的配置更高点,我们希望该服务器接受更多的请求,而 Tomcat2服务器配置低,希望其处理相对较少的请求。那么这时候就用到了加权轮询机制了。
基于IP路由负载
  • 我们知道一个请求在经过一个服务器处理时,服务器会保存相关的会话信息,比如session,但是该请求如果第一个服务器没处理完,通过nginx轮询到第二个服务器上,那么这个服务器是没有会话信息的。

  • 最典型的一个例子:用户第一次进入一个系统是需要进行登录身份验证的,首先将请求跳转到Tomcat1服务器进行处理,登录信息是保存在Tomcat1 上的,这时候需要进行别的操作,那么可能会将请求轮询到第二个Tomcat2上,那么由于Tomcat2 没有保存会话信息,会以为该用户没有登录,然后继续登录一次,如果有多个服务器,每次第一次访问都要进行登录,这显然是很影响用户体验的。

  • 这里产生的一个问题也就是集群环境下的 session 共享,如何解决这个问题?

  • 通常由两种方法:

    1. 第一种方法是选择一个中间件,将登录信息保存在一个中间件上,这个中间件可以为 Redis 这样的数据库。那么第一次登录,我们将session 信息保存在 Redis中,跳转到第二个服务器时,我们可以先去Redis上查询是否有登录信息,如果有,就能直接进行登录之后的操作了,而不用进行重复登录。
    2. 第二种方法是根据客户端的IP地址划分,每次都将同一个 IP 地址发送的请求都分发到同一个 Tomcat 服务器,那么也不会存在 session 共享的问题。
  • 而 nginx 的基于 IP 路由负载的机制就是第二种形式。

基于服务器响应时间负载分配
  • 根据服务器处理请求的时间来进行负载,处理请求越快,也就是响应时间越短的优先分配。
对不同域名实现负载均衡
  • 通过配合location 指令块我们还可以实现对不同域名实现负载均衡
负载均衡案例 准备三份nginx
nginx-master
nginx-agent01
nginx-agent02
nginx-agent01配置
  • 模拟拉勾教育旗下的java课程首页。
  • 修改nginx.conf文件
include lagouedu/*.conf;
  • 新增java.conf文件
server {
	listen 9090;
	server_name localhost;
	location / {
		root html;
		index lagouedujava.html lagouedujava.htm;
	}
	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root html;
	}
}
  • lagouedujava.html文件

拉勾教育java课程首页!

  • 启动nginx
start nginx
  • 测试nginx-agent01
localhost:9090
nginx-agent02配置
  • 模拟拉勾教育旗下的运维课程首页。
  • 修改nginx.conf文件
include lagouedu/*.conf;
  • 新增devops.conf文件
server {
	listen 9091;
	server_name localhost;
	location / {
		root html;
		index lagouedudevops.html lagouedudevops.htm;
	}
	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root html;
	}
}
  • lagouedudevops.html文件

拉勾教育运维课程首页!

  • 启动nginx
start nginx
  • 测试nginx-agent02
localhost:9091
nginx-master配置
  • nginx.conf文件
  • 修改默认server的80端口
server {
	listen 8090;
}
  • 增加lagouedu相关配置
include lagouedu/*.conf;
  • lagouedu.conf文件
  • 因为我们启动了3台nginx。所以不能启动默认的80端口。将master节点更改8088端口。
upstream lagouedu {
	server 127.0.0.1:9090;
	server 127.0.0.1:9091;
}
server {
	listen 8088;
	server_name localhost;
	location / {
		proxy_pass http://lagouedu;
	}
}
  • 启动nginx
start nginx
  • 测试nginx-master
localhost:8088
centos7系统
  • 80端口不能被占用
  • 推荐使用tar包方式安装
tar包安装
  • 系统版本:Centos7.8
安装nginx编译环境
  • nginx 是 C语言 开发,在 Linux 操作系统上运行。请先执行以下命令,安装nginx依赖库,如果缺少依赖库,可能会安装失败。
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
  • 对于 gcc,因为安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境的话,需要安装gcc。
  • 对于 pcre,prce(Perl Compatible Regular expressions)是一个Perl库,包括perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。
  • 对于 zlib,zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
  • 对于 openssl,OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。
编译安装
tar -zxvf nginx-1.18.0.tar.gz
目录结构
.
├── auto 自动检测系统环境以及编译相关的脚本
│ ├── cc 关于编译器相关的编译选项的检测脚本
│ ├── lib nginx编译所需要的一些库的检测脚本
│ ├── os 与平台相关的一些系统参数与系统调用相关的检测
│ └── types 与数据类型相关的一些辅助脚本
├── conf 存放默认配置文件,在make install后,会拷贝到安装目录中去
├── contrib 存放一些实用工具,如geo配置生成工具(geo2nginx.pl)
├── html 存放默认的网页文件,在make install后,会拷贝到安装目录中去
├── man nginx的man手册
└── src 存放nginx的源代码
├── core nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数
├── event 对系统事件处理机制的封装,以及定时器的实现相关代码
│ └── modules 不同事件处理方式的模块化,如select、poll、epoll、kqueue等
├── http nginx作为http服务器相关的代码
│ └── modules 包含http的各种功能模块
├── mail nginx作为邮件代理服务器相关的代码
├── misc 一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持
└── os 主要是对各种不同体系统结构所提供的系统函数的封装,对外提
供统一的系统调用接口
接着进入到解压之后的目录,进行编译安装。
./configure
make
make install
接着我们进入到 /usr/local/nginx/sbin 目录,通过如下命令启动 nginx:
./nginx

查看 nginx 是否有服务正在运行:
ps -ef | grep nginx

测试:
http://192.168.198.90

nginx安装目录
/usr/local/nginx
nginx命令
进入到 /usr/local/nginx/sbin 目录:
查看nginx版本号
./nginx -v

启动nginx
./nginx

关闭nginx
./nginx -s stop

重启nginx
./nginx -s reload
yum方式安装
  • 如果采用yum安装。Gcc等程序不用安装。默认情况Centos7中无nginx的源,因此可以如下执行命令添加源。

  • 添加源

rpm方式安装:
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginxrelease-centos-7-0.el7.ngx.noarch.rpm
  • 安装Nginx
yum install -y nginx
  • 启动Nginx并设置开机自动运行
systemctl start nginx.service
systemctl enable nginx.service
  • nginx默认安装路径
以下是Nginx的默认路径:

1.Nginx配置文件路径:/etc/nginx/
2.PID目录:/var/run/nginx.pid
3.错误日志:/var/log/nginx/error.log
4.访问日志:/var/log/nginx/access.log
默认站点目录:/usr/share/nginx/html
官方yum安装方式
  • nginx官网提供了Centos的源地址。
官网地址
http://nginx.org/en/linux_packages.html#stable
安装依赖
yum install -y yum-utils
创建nginx.repo文件
vi /etc/yum.repos.d/nginx.repo
  • nginx.repo文件内容如下:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$ba
search/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
安装nginx
yum install -y nginx
启动Nginx并设置开机自动运行
systemctl start nginx.service
systemctl enable nginx.service
nginx默认安装路径
以下是Nginx的默认路径:
1.Nginx配置文件路径:/etc/nginx/
2.PID目录:/var/run/nginx.pid
3.错误日志:/var/log/nginx/error.log
4.访问日志:/var/log/nginx/access.log
默认站点目录:/usr/share/nginx/html
转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/275748.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号