1、什么是正向代理、反向代理与负载均衡

什么是正向代理:

1.正向代理服务时由客户端设立的
2客户端了解代理服务器和目标服务器都是谁
3.帮助实现突破访问权限,提高访问的速度,对目标服务器隐藏客户端的ip地址

什么是反向代理

1.反向代理服务器是配置在服务端的
2.客户端是不知道到底访问的那一台服务器
3.达到负载均衡,并且可以真正的隐藏ip地址

当我们有一个服务器集群,并且服务器集群中的每台服务器的内容一样的时候,同样我们要直接从个人电脑访问到服务器集群服务器的时候无法访问,必须通过第三方服务器才能访问集群
这个时候,我们通过第三方服务器访问服务器集群的内容,但是我们并不知道是哪一台服务器提供的内容,此种代理方式称为反向代理

什么是负载均衡

公司会建立很多的服务器,这些服务器组成了服务器集群,然后,当用户访问网站的时候,先访问一个中间服务器,再让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入选择的服务器
所以,用户每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况
一句话:nginx会给你分配服务器压力小的去访问

在实际应用中,遇到了这样一个场景:
已有一个手机 APP 客户端,需要在该 APP 客户端中实现通过 Web 的形式接入其他的应用页面。按照常规的流程,在 APP 中为应用设置入口链接按钮,当用户点击应用入口按钮时,APP 启动 WebView 并打开设置的应用链接即可。
但在该场景中,接入 APP 的应用均部署在内网服务器,外网无法直接访问,因此在 APP 中配置的链接是内网地址,当用户通过外网使用 APP 时,将无法访问接入的 Web 应用。
针对如上场景中遇到的问题,本文中提出了基于 Nginx 实现动态代理的解决方案。

2、使用代理

在前面的场景中,要实现内网应用能够被外网访问,一般有两种方式:
● 将应用部署到可被外网访问的服务器,通常为 DMZ 区服务器
● 使用反向代理服务器,将外网请求代理转发到内网的应用服务器
其中,将内网应用部署到可被外网访问的服务器上的方法,通常受限于可提供的硬件环境、安全控制等方面的问题,并不是解决该类问题的首选方案。因此,通常会在可被外网访问的服务器上部署反向代理服务器,使用代理转发来解决。
目前最常用的软件反向代理服务器有 Apache 和 Nginx 。通过配置文件设置,就可以将特定的链接向应用服务器转发。例如 Nginx 可通过以下简单的配置,即可实现代理转发:

server
{listen 80;server_name domain.com;location /app1 {proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://192.168.10.38:3000/app1;}access_log logs/domain.com.access.log;
}

在以上实例中,Nginx 配置完成后,即可将 http://domain.com/app 的所有请求代理转发到 http://192.168.10.38:3000/app1 地址,这样就可以实现针对 app1 的从外网访问内网应用的代理转发功能。此时 app1 对于外网的访问地址就变成了 http://domain.com/app 。
通过使用代理服务器, 所有的应用将拥有统一域名 ,而通过 二级目录区分 不同的应用。
在 Apache 中同样可以采用类似的策略进行代理转发,本文中主要以 Nginx 作为实例。
在多个接入多个应用的情况下,只要按照上述实例中的配置,为不同的应用分配不同的二级目录,即可实现向不同应用进行代理转发。这样就可以解决文章开始提出的问题。
但是这一解决方案也存在问题:
● 当需要新增/修改/删除应用的代理转发配置时,需要人工修改配置文件,并重启代理转发服务器,这将导致服务的暂时不可用。
● 当接入应用较多时,配置文件将越来越大,对用人工维护造成极大的不便。
● 当代理转发服务器进行集群化部署时,每次对配置文件的更新,都需要更新所有代理转发服务器,并进行重启,这将增大维护的风险。
针对以上的问题,需要对该访问进行进一步改进。

3、使用动态代理

如果能够使反向代理服务器动态的通过集中的配置数据更新针对应用的代理配置,就可以解决上述方案中存在的问题。
经过研究分析,本文中提出 动态代理 方案,流程如下:

当请求进入反向代理服务器时,反向代理服务器将分析进入的请求 URL ,识别 URL 中的二级目录(用于区分不同的应用),然后使用该二级目录作为应用标识,到代理配置数据数据中进行查询,获得代理地址的返回结果,然后将该请求转发到对应的应用服务器。
同时,管理人员可以通过特定的管理端,对代理配置数据进行 CRUD 操作,方便管理人员对代理应用配置的实时管理。
通过以上流程,即可实现在不中断服务的情况下,动态修改代理配置。同时也可以确保集群化的反向代理服务器同步更新,都可以获得最新的配置数据。
使用动态代理方案,即可以解决在文章开头提出的问题。

4、基于 Nginx 实现动态代理

为了实现动态代理方案,需要在反向代理服务器中增加定制的功能。针对这一目的,研究了目前主流的反向代理服务器 Apache 和 Nginx ,结论如下:
Apache 和 Nginx 均可以增加定制的模块以实现定制的功能。但是 Apache 目前必须使用 C 语言按照 Apache 的要求编写模块,这对于开发者要求相对较高。而 Nginx 同样可以使用 C 语言开发扩展模块,但除此之外,目前已有针对 Nginx 开发的 Lua 语言解释器模块,即可以在 Nginx 的配置文件中直接调用 Lua 语言开发的脚本程序,这种方式极大的降低了定制功能开发的难度。因此,采用 Nginx 作为反向代理服务器,使用 Lua 语言作为定制功能开发语言,进行动态代理功能实现。
同时,由于反向代理服务器需要处理大量的代理请求,因此会频繁的读取反向代理配置数据。基于这一情况,选用 Redis 作为数据库,利用其高性能的数据读写,支撑代理配置数据的频繁访问。
根据以上的技术选型,设计流程图如下:

在 Nginx 的配置文件中通过 Lua 解释器模块,调用 Lua 脚本。请求进入 Nginx 后,通过 Lua 脚本处理请求,并连接 Redis 获取当前 URL 对应的应用的代理地址,处理完成后,将代理地址回写到 Nginx 的配置块,由 Nginx 完成后续的代理转发工作。
在运行期间,管理人员可以使用代理管理端,对 Redis 中的代理配置数据进行操作,操作完成后,Nginx 代理服务器将及时读取到最新的配置数据进行转发。
经过调研,在具体开发过程中,采用了基于 Nginx 进行了模块扩展的 OpenResty。OpenResty 基于 Nginx 扩展了大量的模块,其中非常核心的特点就是在 Nginx 中集成了 Lua 解释器,实现了 Nginx 调用 Lua 脚本。同时 OpenResty 还提供了 Lua 语言实现的访问 Redis 的代码模块。

5、Nginx 动态代理优化

代理配置数据缓存

在实际测试过程中,当访问量较大时,由于 Nginx 服务器每次代理都会查询 Redis ,可能是导致 Redis 压力过大而无法响应,导致请求被阻塞。
为了应对这一问题,在 Nginx 中,使用 Lua 脚本设置内存缓存,从 Redis 获取的代理数据将在一定时间内保留在 Nginx 服务器的内存中,在内存缓存数据有效期内,将不会再重复向 Redis 请求数据。
经过测试,在进行数据缓存优化后,极大的提高了 Redis 访问的稳定性。

Redis 集群化

由于单点 Redis 一旦无法提供服务,将导致 Nginx 代理服务无法正常使用。针对这一问题,需要对 Redis 进行集群化。
目前比较成熟的解决方案是对 Redis 进行主从备份,一个主节点提供对外服务,多个从节点进行数据备份,并在主节点停止服务后产生新的主节点继续提供服务。使用 Redis 提供的 Redis Sentinel 进行主从节点监控,并向 Nginx 提供最新的主节点信息。

Nginx 集群化

随着访问量逐渐增大,单机的 Nginx 将无法再支持过大的访问量,同时单机 Nginx 一旦停止服务,将影响整个系统的正常运行。因此需要将 Nginx 进行集群化,部署多个 Nginx 反向代理服务器,提供同样的服务。
基于 Nginx 的动态代理方案,提供的代理服务为无状态服务,因此可以直接复制 Nginx 以实现集群化。

6、Nginx的负载均衡

Nginx为我们提供了三种负载均衡的策略
● 轮询:
将客户端发起的请求,平均分配给每个服务器,轮着处理请求
● 权重:
会将客户端的请求,根据服务器的权重值不同,分配不同的请求数量给权重不同的服务器
● ip_hash
基于发起请求的客户端IP地址不同,他会始终将请求发送到指定的服务器上.

轮询

修改conf.d目录下的default.conf文件

# 在server块外面声明upsteam  fs-server是我自己取得名字 自定义名称不要加下划线_
# server 指定服务地址,端口
upsteam fs-server {server 47.112.174.148:8080;server 47.112.174.148:8081;.....
}server{listen 80;server_name localhost;#基于反向代理到我们上面upsteam指定的服务名字,默认使用轮询location / {proxy_pass http://upsteam的名字/;}
}
权重

修改conf.d目录下的default.conf文件

# 在server块外面声明upsteam  fs-server是我自己取得名字 自定义名称不要加下划线_
# server 指定服务地址,端口
# weight=值越大权重约定,被访问的几率大些
upsteam fs-server {server ip:port weight=10;server ip:port weight=2;.....
}server{listen 80;server_name localhost;#基于反向代理到我们上面upsteam指定的服务名字,默认使用轮询location / {proxy_pass http://upsteam的名字/;}
}
ip_hash

修改conf.d目录下的default.conf文件

# 在server块外面声明upsteam  fs-server是我自己取得名字 自定义名称不要加下划线_
# server 指定服务地址,端口
# ip_hash 表示负载均衡使用ip_hash 当某个ip访问nginx的时候,后续始终将请求发送到指定的服务器上.
upsteam fs-server {ip_hash;server ip:port;server ip:port;.....
}server{listen 80;server_name localhost;#基于反向代理到我们上面upsteam指定的服务名字,默认使用轮询location / {proxy_pass http://upsteam的名字/;}
}

7、Nginx的动静分离

1.动静分离原理
服务端接受来自客户端的请求中,既有静态资源也有动态资源,静态资源由nginx提供服务,动态资源nginx转发至后端。
2.nginx静态处理优势
nginx处理静态页面的效率远高于tomcat的处理能力

● 若tomcat的请求量为1000次,则nginx的请求量为6000次
● tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3.6M
● Nginx处理静态资源的能力是Tomcat处理的6倍

Nginx反向代理、负载均衡和动静分离相关推荐

  1. Nginx+Tomcat实现负载均衡与动静分离

    Nginx+Tomcat实现负载均衡与动静分离 一.Nginx负载均衡和动静分离 1.Nginx 实现负载均衡是通过反向代理实现 反向代理(Reverse Proxy) 是指以 代理服务器(例:Ngi ...

  2. Nginx 反向代理 负载均衡 虚拟主机

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  3. nginx 反向代理负载均衡 tomcat集群应用

    nginx 反向代理负载均衡 tomcat集群应用 环境介绍: 系统:centos5.8_64 192.168.0.201:nginx服务器 192.168.0.202:tomcat服务器 192.1 ...

  4. Nginx反向代理 负载均衡sky

    Nginx服务部署 Nginx简介 Nginx (engine x) 是一个轻量级的.高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗 ...

  5. Nginx反向代理负载均衡虚拟主机动静分离UrlRewrite防盗链

    文章目录 1. Nginx简介 1.1 Nginx背景 1.2 Nginx的优点 1.3 Nginx的功能特性及常用功能 2.Nginx安装 2.1 下载上传解压 1.2 安装 3.nginx核心概念 ...

  6. Nginx 反向代理 负载均衡 动静分离 高可用 原理

    1.Nginx简介 1.1 概述 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理服务器,特点是占有内存少,并发能力强,能经受高负载的考验,有报告表明能 ...

  7. Nginx+Tomcat 搭建负载均衡、动静分离(tomcat多实例)

    文章目录 一.Tomcat多实例配置 1.关闭防火墙 2.将软件包上传到/opt目录下 3.安装JDK 4.安装Tomcat 5.配置tomcat环境变量 6.修改tomcat2中的server.xm ...

  8. Nginx 反向代理+负载均衡

    一.Nginx 的引入背景 ● 公司产品出现瓶颈? 我们公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户. 用户少, ...

  9. 一文解读Nginx+Tomcat实现负载均衡、动静分离

    前言 一.Nginx 负载均衡实现原理 1.Nginx 实现负载均衡是通过反向代理实现 反向代理(Reverse Proxy) 是指以 代理服务器(例:Nginx) 来接受 internet 上的连接 ...

  10. Nginx反向代理负载均衡

    环境准备: 总共四台机器,两台装有Nginx的机器做负载均衡,两台机器装有Apache作为WEB服务器. 机器信息 hostname IP 说明 lb01 192.168.1.19 nginx主负载均 ...

最新文章

  1. datanode 不能连接master
  2. 【Windows Phone】Metro设计语言
  3. springbot集成finereport后在web中使用iframe引用报表
  4. PHP秒杀截流原理,流量新大陆:巧借PC、移动端评论截流,让精准流量“爆起来”...
  5. tortoisegit推送ssh-key需要输入用户信息
  6. linux子系统安装gromacs,科学网—Windows下GROMACS程序的编译 - 李继存的博文
  7. 【2018.10.2】Note of CXM
  8. 【JAVA 第四章 流程控制语句】课后习题 判断两个圆是否相交 圆和直线的位置关系
  9. 因触屏故障 美国监管部门对15.9万辆特斯拉进行调查
  10. 模2除法介绍(CRC校验码计算)
  11. 我对管理和领导的理解
  12. 石像鬼 openwrt chinadns dns-forwarder 开机无法自动启动
  13. Fedora 使用 yaourt
  14. [机器学习]三行代码快速划分交叉训练中训练集和验证集
  15. 开机强制进入安全模式的三种方法
  16. GEE实战 | LULC获取与处理
  17. 漫谈程序员系列:任性,春节前辞职
  18. 计算机里的游戏安装包怎么删除,游戏怎么清缓存?电脑中LOL更新留下的缓存垃圾删除的教程...
  19. macOS如何复制粘贴无格式文本
  20. linux系统安装ntp,Linux系统安装配置NTP时间服务器

热门文章

  1. 马云,受聘顶尖大学荣誉教授!聘期3年!
  2. 安全合规/GDPR --19--GDPR实施中的高风险处理类别
  3. Chain of Thought 开山之作论文详解
  4. linux 网卡聚合mac,linux网卡与MAC地址绑定方法总结
  5. python子图命名_python – 用于子图的plt.setp替代或如何在x轴...
  6. java计算机毕业设计vue图书档案管理系统MyBatis+系统+LW文档+源码+调试部署
  7. PDF itext pkcs#7 国密签名验证
  8. POI-Ecel模板导出
  9. ladybug单张影像导出
  10. “天才少年”稚晖君宣布离职再创业 !