文章目录

  • Nginx
  • 代理
    • 正向代理
    • 反向代理
    • 配置实例
  • 动静分离
    • 概念
    • 配置实例
  • 负载均衡
    • 概念
    • 分配策略
    • 配置实例

Nginx

Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 nginx
的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等

聊到Nginx, 那就必定要讲他最基本的三大功能

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

代理

这里的代理指的是网络代理中的正向代理与反向代理,是代理模式的一种应用实例,如果需要拓展了解代理模式,可以看看我的趣谈设计模式系列博客
趣谈设计模式 | 代理模式(Proxy):利用代理来控制对象的访问

正向代理

当我们需要访问一些网站的时候,可能由于服务器距离过远,又或者是网络限制,使得我们不能够直接访问一些服务器,这时候就需要用到正向代理。

正向代理,就是让代理服务器给客户端做代理。即代理服务器将客户端的请求转发给目标服务器

流程如上图,客户端将请求发送给代理服务器,代理服务器再代替客户端向目标服务器发送请求,目标服务器收到请求后将响应返回给代理服务器,代理服务器再将相应的结果返还给客户端。这样就借助代理服务器,通过转发的方式使得原本不能通信的两端实现通信。


反向代理

反向代理,即让代理服务器为目标服务器做代理。在这种情况下,客户端对代理其实是无感知的,因为它没有做任何的配置,所以在它眼里,代理服务器就是目的服务器。所以在这种情况下,对外暴露的只有一个反向代理服务器,而隐藏了真实服务器

当客户端将请求发送给代理服务器时,再由代理服务器进行选择,将请求转发给内部真实的目标服务器,获取数据后将结果返回给客户端。流程如下图


配置实例

目标
根据访问的路径转发到不同的服务器中

流程

1.准备两台HTTP服务器以及测试页面
2.配置nginx

首先准备了两个http服务器,分别绑定在了本地的8081和8082端口,并分别存放一个html文件用于标识

//服务器1
<h1>port 8081: test1!!!<h1>//服务器2
<h1>port 8082: test2!!!<h1>

接着打开nginx的配置文件

vim /usr/local/nginx-1.18.0/conf/nginx.conf

接着在http块中增加一个新的server节点,让其提供反向代理服务,端口号为9000,并通过配置location来设置转发规则

server {listen       9000;               //端口号server_name  192.168.220.128;  //主机号//正则表达式,当url中包含test1时,将其转发到下面的服务器中location ~ /test1/  {proxy_pass http://192.168.220.128:8081;}location ~ /test2/ {proxy_pass http://192.168.220.128:8082;}}

根据上面设置,转发情况如下

访问:http://192.168.220.128:9000/test1/ -------> 转发至:192.168.220.128:8081
访问:http://192.168.220.128:9000/test1/ -------> 转发至:192.168.220.128:8082



配置成功


动静分离

概念

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力,这就是动静分离

动静分离简单来说就是当客户端向代理服务器发送请求的时候,代理服务器会把动态跟静态请求分开,并将其转发到对应的服务器上。由于静态资源不需要进行交互,所以这样将其划分开一定程度上减少了服务器的压力。

动静分离从目前实现角度来讲大致分为以下两种

  1. 把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
  2. 动态跟静态文件混合在一起发布,通过nginx来将其分开。

由于我本地没有其他的服务器,因此下面我们就以第二种方式来实现


配置实例

目标
将静态资源转发到静态服务器中

流程

1.准备好静态资源
2.配置nginx

由于我本地没有其他的服务器,因此就将在本机中完成转发,假设根目录下的data文件夹即是静态资源服务器,我分别将一个html文件和一个图片存放在/data/www, data/image中,当url中包含www或者image这些静态资源时,将其转发到/data/即静态服务器中

下面开始配置,直接对nginx配置文件中的http块下的server配置即可

通过location指定不同的后缀名实现不同的请求转发

server {listen       80;server_name  192.168.220.128;location /www/ {root /data/;    //静态资源服务器index index.html index.htm;}location /image/ {root /data/;autoindex on;    //文件索引列表}
}

根据上面设置,转发情况如下

访问:http://192.168.220.128/www/ -------> 转发至:192.168.220.128/data/www/
访问:http://192.168.220.128/image/ -------> 转发至:192.168.220.128/data/imgae/

下面进行测试


负载均衡

概念

负载均衡即根据服务器的负载情况,按照分配策略将请求分发到不同的服务器上,让各个服务器的负载均衡,即避免了忙闲不均的问题,又保证了服务的高可用、高性能。

在当今的互联网时代,由于信息与用户的爆炸性增长,服务器的压力越来越大,早已不是原理那个单机就能满足的年代了。要想保证服务的稳定,那就必须要在服务器这方面下功夫,我们首先想到的就是提高服务器的性能,但是如今硬件缓慢的性能提升以及抵不上流量增加的速度,即使我们将机器全部换到顶级配置也无法解决这个问题。

因此我们将视角放在了横向发展,即通过不断增加服务器的数量来构造出一个集群,将请求均衡的分发到集群中的各个服务器上,这样就能够以低成本、高效果的方式缓解了日益增长的压力,这也就是负载均衡的应用场景。


分配策略

轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

//当没有指定时默认使用
upstream serverlist {server 192.168.220.128:8081;   server 192.168.220.128:8082;}

权重(weight):weight代表权重,默认为 1。采用了加权Round-Robin算法,权重越高则被分配的概率也就越大。通过通过设置不同的权重来控制访问量,解决后端服务器性能不均的问题

upstream serverlist {server 192.168.220.128:8081 weight = 4;    //没有指定权重时默认为1   server 192.168.220.128:8082 weight = 3;}

ip_hash每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。但是在扩容以及服务器宕机时,由于服务器数量发生变化,hash算法的计算结果也会不一样,就会导致大范围的缓存失效或者扩容困难等问题,因此hash模块中又引入了一致性哈希算法,在这里就不展开讲了,有兴趣的小伙伴可以看看我以前的博客
分布式存储与一致性哈希

upstream serverlist {ip_hash;server 192.168.220.128:8081;    server 192.168.220.128:8082;}

fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream serverlist {server 192.168.220.128:8081;    server 192.168.220.128:8082;fair;}

配置实例

目标
将静态资源转发到静态服务器中

流程

1.准备两个http服务器以及测试用html文件
2.配置nginx

负载均衡的配置方法如下,首先需要在http块中添加负载服务器列表

upstream serverlist {//可以在这里设置分配策略,默认为轮询分配server 192.168.220.128:8081;    //默认权重为1server 192.168.220.128:8082;}

接着在server中设置将请求转发到上述列表中

server {listen       80;server_name  192.168.220.128;location / {proxy_pass http://serverlist;   //设置转发列表root   html;index  index.html index.htm;}
}

配置完成后由于nginx默认采用轮询分配,因此我们每次刷新都会在两个服务器中轮询

Nginx 反向代理、动静分离、负载均衡及配置实例相关推荐

  1. nginx反向代理,实现负载均衡

    nginx反向代理,实现负载均衡 一,先启动nginx和php-cgi #启动 php-cgi /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 8000 -C 5 ...

  2. Nginx反向代理 实现Web负载均衡

    实现负载均衡的方式有很多种,DNS.反向代理.LVS负载均衡器(软件实现).F5(负载均衡器,硬件,非常昂贵)这里我们只提到基于DNS,以及反向代理的方式来实现负载均衡Web服务       DNS服 ...

  3. Nginx反向代理及简单负载均衡配置

    nginx配置文件主要分为六个区域:main section.events section.http section.sever section.location section.upstream s ...

  4. 负载均衡反向代理 动静分离

    #!/bin/bash IP=192.168.186.77 WG=192.168.186.2 YM=255.255.255.0 DIR=/etc/sysconfig/network-scripts W ...

  5. Squid反向代理加速缓存+负载均衡实验架构

    实验环境: 公司有两台web服务器,运行同一套网站,读取同一台mysql数据库. 两台web服务器的主机名如下: test1.com 192.168.1.119 test2.com 192.168.1 ...

  6. nginx反向代理结合apache和php的配置示例

    1.前端nginx主配置文件# cat nginx.conf worker_processes 8;#pid logs/nginx.pid; pid /data/www/logs/nginx.pid; ...

  7. 分布式与微服务系列(三)、SpringBoot+Zookeeper集群+Nginx反向代理+Dubbo分布式托管(提供者、消费者)

    SpringBoot+Zookeeper集群+Nginx反向代理+Dubbo分布式托管(提供者.消费者) 一.软件架构和微服务需求 1.1.微服务需求 1.2.框架选择 1.3.集群分布(下面为此图实 ...

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

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

  9. Nginx反向代理、负载均衡和动静分离

    1.什么是正向代理.反向代理与负载均衡 什么是正向代理: 1.正向代理服务时由客户端设立的 2客户端了解代理服务器和目标服务器都是谁 3.帮助实现突破访问权限,提高访问的速度,对目标服务器隐藏客户端的 ...

最新文章

  1. 卷积神经网络(Convolutional Neural Network, CNN)
  2. lodash源码分析之获取数据类型
  3. CISCO 2511终端服务器配置
  4. Jupyter Notebook 代码自动补全功能
  5. go语言项目优化(经验之谈)
  6. MySQL高级 - SQL技巧 - 数字函数与字符串函数
  7. netbeans7.4_NetBeans 7.2 beta:更快,更有用
  8. MATLAB——PLOT绘图
  9. 命令行关闭特定服务和调整服务启动方式
  10. Writing and Mapping classes(Chapter 3 of NHibernate In Action)
  11. CCCC-GPLT L3-013. 非常弹的球 团体程序设计天梯赛
  12. python程序设计陈春晖答案_Python程序设计
  13. 如何做好一场技术分享,100%纯实用技巧输出
  14. java测试vss_VSS项目分支
  15. 2010年度 中国WEB应用防火墙厂家和产品大全
  16. 熊猫压缩怎么使用_记录随时间变化的PagerDuty事件(使用熊猫)
  17. idle最好记的常用快捷键大全
  18. 深信服三面/hr面 总结
  19. 电脑如何登录两个微信
  20. 使用exe4j把jar转换成exe文件时,报错java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite

热门文章

  1. 谷歌浏览器中安装JsonView扩展程序
  2. break和continue-break代码演练
  3. Zookeeper_安全认证讲解
  4. 数据拆分缺点和解决方案
  5. Java8函数式编程(1)--Principle
  6. JAVA基本数据类型和String类型的转换
  7. mysql+encode+decode+错误_mysql decode encode 乱码问题
  8. 在 IntelliJ IDEA 中,如何快速将选中文件用资源管理器打开
  9. 代理、委托、钩子与打桩
  10. 【SpringBoot零基础案例09】【IEDA 2021.1】SpringBoot将核心配置文件中的自定义配置映射到一个对象