Nginx理论基础

以前看到Nginx 时总是懵逼,现在经过一段时间学习以后已基本掌握,所以特来记录一下自己的学习成果。

Nginx简介

学习一个新的知识总是要先知道他是什么东西。

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

以上说明抄录自百度百科

百度百科已经清楚的说明了Nginx 是个什么东西,一个代理服务器,并具有较好的并发能力。说到这里就不得不说一下Nginx和Apache了。

Apache和Nginx最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程;而 nginx 是异步的,多个连接(万级别)可以对应一个进程。一般来说,需要性能的 web 服务,用 nginx 。如果不需要性能只求稳定,更考虑 apache 。更为通用的方案是,前端 nginx 抗并发,后端 apache 集群,配合起来会更好。
详情请点击

Nginx学习可以分为四部分,反向代理,负载均衡,动静分离,高可用性。
下面根据这四部分进行一一的学习,并附有示例进行学习掌握。

1. 反向代理

有很多人想问有反向代理肯定有正向代理。没错确实有正向代理。

1.1 正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
来自百度百科

光说可能不太明白,看下图你应该就明白了。

在这里插入图片描述

1.2 反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
来自百度百科

光说可能不太明白,看下图你应该就明白了。

在这里插入图片描述

此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
和正向代理相比:反向代理不需要客户端在做配置,用户直接访问反向代理服务器就可以获得目标服务器的资源,用户不需要知道目标服务器的地址

反向代理实例: 一个小的示例让你明白什么是Nginx反向代理

2. 负载均衡

可能有很多人听过负载均衡 但是负载均衡到底是什么内有个清楚的概念。

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
来自百度百科

客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。这种是传统的数据请求模式。这种模式对于早期的系统相对单一并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?

我们首先想到的可能是升级服务器的配置,比如提高 CPU 执行频率加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?

上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

画图,没有什么是一张图解决不了的。

在这里插入图片描述

此时负载均衡服务器会将请求按照一定的规则进行请求的分配。都有什么策略呢?

2.1 负载均衡的分配策略

  1. 轮询(默认)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
  2. weight (权重)
    weight 代表权,重默认为 1,权重越高被分配的客户端越多
    指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。如:如果例子看不懂没有关系,下面还有实例会有解析。
	upstream server_pool {
	  server 192.168.5.21 weight = 10 ;
	  server 192.168.5.22 weight = 10 ;
	}
  1. ip_hash
    每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
    可以理解为当你访问了服务器以后你初始访问的哪个服务器,以后再要访问就一直是这个服务器。
    如:
	upstream server_pool {
	  ip_hash ;
	  server 192.168.5.21:80 ;
	  server 192.168.5.22:80 ;
	}
  1. fair (第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。如
	upstream server_pool {
	  server 192.168.5.21:80 ;
	  server 192.168.5.22:80 ;
	  fair ;
	}
负载均衡实例 一个小的示例让你明白什么是Nginx负载均衡(更新中)

3. 动静分离

动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开,不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。
来自百度百科

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

  • 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,目前主流推崇的方案
    在这里插入图片描述

  • 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

动静分离实例 一个小的示例让你明白什么是Nginx动静分离(更新中)

4. nginx 搭建高并发高可用集群

先来想一个问题,在反向代理过程中,如果你的反向代理服务器宕机了,你的请求数据是不是永远的拿不到,那么这个问题怎么解决呢?
于是我们想到了负载均衡的思想,增加Nginx服务器的数量,解决这一问题,当一个服务器宕机,你还有另一个可用。
在这里插入图片描述

那么问题来了当你主服务器宕机了,你还要记住那个副的服务器地址吗?如果服务器不是一个两个那我们该如何解决呢?

4.1 Keepalived+Nginx 高可用集群(主从模式)

什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,Keepalived通过请求一个vip来达到请求真是IP地址的功能,而VIP能够在一台机器发生故障时候,自动漂移到另外一台机器上,从来达到了高可用HA功能。

keepalived原理及配置文件详解这里把Keepalived讲解的很清楚了,如果想深入研究可以看一下。

在这里插入图片描述

针对上一个问题,我们只需要加一个虚拟服务器就可以解决,我们通过对主机和备用机绑定一个虚拟的ip 我们这里叫做vip,访问vip就等于访问ip,然后让他们可以间接的挂钩。(这里做的就是把两张网卡都绑定上一个虚拟的vip)但是我们对外公布的不在是nginx主机ip了 而是我们的虚拟vip了。让用户通过虚拟的vip访问我们的网站。因为我们是把vip和我们的nginx主机ip绑定的,而nginx主机又是和我们两台网站服务器绑定的,这样就完美的解决了以上的问题。

Keepalived+Nginx 高可用集群实例(更新中)

4.2 Keepalived+Nginx 高可用集群(双主模式)

在这里插入图片描述

双主模式实际上就是在主从模式上新添加了一个虚拟地址。

发布了18 篇原创文章 · 获赞 4 · 访问量 1069

猜你喜欢

转载自blog.csdn.net/weixin_44689277/article/details/105530620