当前位置: 首页 > news >正文

nginx反向代理,负载均衡,动静分离

反向代理,负载均衡

nginx通常被用作后端服务器的反向代理,这样就可以很方便的实现动静分离以及负载均衡,从而大大提高服务器的处理能力。

nginx实现动静分离,其实就是在反向代理的时候,如果是静态资源,就直接从nginx发布的路径去读取,而不需要从后台服务器获取了。

但是要注意,这种情况下需要保证后端跟前端的程序保持一致,可以使用Rsync做服务端自动同步或者使用NFS、MFS分布式共享存储。

Http Proxy模块,功能很多,最常用的是proxy_pass和proxy_cache

如果要使用proxy_cache,需要集成第三方的ngx_cache_purge模块,用来清除指定的URL缓存。这个集成需要在安装nginx的时候去做,如:

./configure --add-module=…/ngx_cache_purge-1.0 …

nginx通过upstream模块来实现简单的负载均衡,upstream需要定义在http段内

weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。

ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。

代理

说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;

此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店~客人到某达斯专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是某达斯厂家,目标角色就是用户

正向代理

我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们。

这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。

反向代理

多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色

反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!

 

在实际生产项目中,大部分的就是正向代理和反向代理结合起来使用

 我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,反向代理了多台真实的业务处理服务器

 

实验:负载均衡

三台主机

nginx        192.168.100.10

http1         192.168.100.20

http2         192.168.100.30

实验前都需要关闭selinux,防火墙

 

//rs1主机上,安装httpd,然后添加一个测试网页
[root@rs1 ~]# yum -y install httpd
[root@rs1 ~]# echo "this is rs1" > /var/www/html/index.html
[root@rs1 ~]# systemctl restart httpd
[root@rs1 ~]# systemctl enable httpd//rs2主机上,安装httpd,然后添加一个测试网页
[root@rs2 ~]# yum -y install httpd
[root@rs2 ~]# echo "this is rs2" > /var/www/html/index.html
[root@rs2 ~]# systemctl restart httpd
[root@rs2 ~]# systemctl enable httpd//在nginx主机上,修改配置文件,设置负载均衡
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
//在http{}中配置upstream
.....upstream cc {server 192.168.100.20;server 192.168.100.30;}server {listen       80;server_name  localhost;location / {proxy_pass http://cc;}//测试配置文件是否正确,然后重载nginx
[root@nginx ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginx ~]# nginx -s reload
测试访问

增加权重

设置权重,如果想其中一台后端真实服务器,多承担一些访问量,可以去设置weight权重

 upstream cc {server 192.168.100.20 weight=2;server 192.168.100.30;}
测试访问

此时访问的时候,rs1这台主机会访问两次后才会轮到rs2

此时,我们发现三台主机都是使用80端口,所以,在nginx配置文件中的upstream中,对应的真实后端服务器,我们并没有设置端口。如果其中某台后端服务器使用8080端口呢?我们如何进行设置,rs1为8080端口,rs2为80端口

首先修改rs1的httpd服务,侦听8080端口,并重启httpd服务[root@rs1 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@rs1 ~]# systemctl restart httpd
//在nginx中upstream cc {server 192.168.100.20:8080 weight=2;server 192.168.100.30:80;}
[root@nginx ~]# nginx -s reload

测试访问

配置ip_hash

 upstream cc {ip_hash;server 192.168.100.20:8080 weight=2;server 192.168.100.30:80;}[root@nginx ~]# nginx -s reload

测试访问

         ip_hash这种负载均衡就是:例如多个用户通过nginx访问到了后端的httpd集群中,这个时候因为有不同用户,所以ip也不同,ip+hash算法计算的hash值都传到了httpd,nginx就记录了这个ip和hash值,那么下次同一个ip过来还是会分配到这个httpd的。

        如果在集群中的某台服务器出现故障,我们想要从nginx的集群配置中移除掉,我们不可以直接的将那一行删掉,比如server 192.168.100.10:8080 weight=2;删掉,如果直接删掉会导致nginx的hash算法重新计算,那么用户的会话或者说缓存都会失效掉,所以这里如果不用这台服务器,直接比较为down即可,也就是 server 192.168.100.10:8080 down,这么做就可以了。

 动静分离

nginx+tomcat  还是基于上面的环境添加一台tomcat

Tomcat:192.168.100.50

此时tomcat已经部署完成了

 配置nginx,设置动静分离

 upstream cc {server 192.168.100.20;server 192.168.100.30;}upstream tomcat {server 192.168.100.50:8080;}server {listen       80;server_name  localhost;location / {proxy_pass http://cc;}location /test {proxy_pass http://tomcat;}

测试访问

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux下TCP编程
  • 编成笔记-atan2函数学习分析
  • RabbitMQ 性能优化
  • E:Failed to fetch的解决方案——Linux换源方法
  • Python 开放端口进行数据传输
  • 通过写文件方式写入 Hive 数据
  • 【C++】日期和时间
  • SpringCloudGateway网关技术
  • 【Kotlin设计模式】Kotlin实现工厂模式
  • 【WPF】WPF学习之面试常问问题
  • Visual Studio中 自动生成版本号递增版本号
  • React 入门第四天:理解React中的路由与导航
  • 【C#】字段
  • 点晴oa办公系统提效管理+业务协同
  • 极光公布2024年第二季度财报
  • 【翻译】babel对TC39装饰器草案的实现
  • ➹使用webpack配置多页面应用(MPA)
  • Angular Elements 及其运作原理
  • angular学习第一篇-----环境搭建
  • canvas 绘制双线技巧
  • Fundebug计费标准解释:事件数是如何定义的?
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Invalidate和postInvalidate的区别
  • JDK 6和JDK 7中的substring()方法
  • Laravel 中的一个后期静态绑定
  • leetcode386. Lexicographical Numbers
  • Nodejs和JavaWeb协助开发
  • passportjs 源码分析
  • Python 基础起步 (十) 什么叫函数?
  • 服务器之间,相同帐号,实现免密钥登录
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 浏览器缓存机制分析
  • 物联网链路协议
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #APPINVENTOR学习记录
  • #在 README.md 中生成项目目录结构
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (二)丶RabbitMQ的六大核心
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (一)RocketMQ初步认识
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • ./configure、make、make install 命令
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET CLR Hosting 简介
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET大文件上传知识整理
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /etc/motd and /etc/issue
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [20171113]修改表结构删除列相关问题4.txt
  • [AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性