Nginx-概念篇

Posted 程序媛琬淇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx-概念篇相关的知识,希望对你有一定的参考价值。

目录

    nginx概述

    正向代理

    反向代理

    负载均衡

    动静分离


Nginx概述




    Nginx(engine x)是一款自由的、开源的、高性能的HTTP和反向代理服务器,邮件代理服务器和通用TCP/UDP代理服务器。


    Nginx 通常用于反向代理、负载均衡 和 HTTP 缓存。


    其特点是高并发、高性能 和 低内存。


Nginx最初由俄罗斯程序员 Igor Sysoev 于 2002 年开始开发。

Nginx 是增长最快的 Web 服务器,市场份额已达 33.3%。

全球使用量排名第二,2011 年成立商业公司。 


Nginx 社区分支:

1. Openresty:作者 @agentzh(章宜春)开发的,最大特点是引入了 ngx_lua 模块,支持使用 Lua开发插件,并且集合了很多丰富的模块,以及 Lua 库。 

2. Tengine:主要是淘宝团队开发。特点是融入了因淘宝自身的一些业务带来的新功能。

3. Nginx 官方版本,更新迭代比较快,并且提供免费版本和商业版本。


Nginx作为HTTP服务器,有以下几项基本特性:

1. 处理静态文件,索引文件以及自动索引。

2. 打开文件描述符缓冲.无缓存的反向代理加速,简单的负载均衡和容错。

3. FastCGI:简单的负载均衡和容错。

4. 模块化的结构:包括gzipping,byte ranges, chunked responses,以及SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则此项处理可以并行运行,而不需要相互等待。

5. 支持SSL和 TLSSNI。



正向代理




在了解什么是正向/反向代理之前,需要先理解什么是代理。


    比如你现在缺钱,想去找马云爸爸借钱,可想而知人家可能鸟都不鸟你,到最后碰一鼻子灰借不到钱。不过你认识你家隔壁老王,而老王认识马云同志,而且关系还很好。这时候你托老王去找马云借钱,当然这事最后成了,你从马云那里借到了500万!这时候马云并不知道钱是你借的,只知道这钱是老王借的。最后由老王把钱转交给你。在这里,老王就充当了一个重要的角色:代理。


    上文所述的代理,就是我们常说的正向代理。


    代理客户端去请求服务器,隐藏了真实客户端,服务器并不知道真实的客户端是谁。正向代理应用最广泛的莫过于现在的某些 “科学上网工具”,你访问不了谷歌、Facebook时,你可以在国外搭建一台代理服务器,代理你访问,代理服务器再把请求到的数据转交给你,你就可以看到内容了。





相对专业的解释:


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



客户端必须要进行一些特别的设置才能使用正向代理。




反向代理




正向代理 代理对象是客户端,反向代理 代理对象是服务端。

正向代理:a通过b向c借钱,a知道c的存在。 

反向代理:a向b借钱,b又向c借,a不知道c的存在。



    此时联通总机充当的角色就是反向代理,你只知道和客服接通并聊了起来,具体为什么会接通这个客服MM,怎么接通的,你并不知道。


    反向代理隐藏了真正的服务端,就像你每天使用百度的时候,只知道敲打www.baidu.com 就可以打开百度搜索页面,但背后成千上万台百度服务器具体是哪一台为我们服务的,我们并不知道。我们只知道这个代理服务器,它会把我们的请求转发到真实为我们服务的那台服务器。


    软件层面一般常用Nginx来做反向代理服务器,它的性能非常好,用来做负载均衡。



Nginx-概念篇



相对专业的解释


    反向代理(Reverse Proxy)是指代理服务器来接受Internet上客户端的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器和目标服务器对外就表现为一个服务器,客户端并不知道ta访问的是代理服务器。


    通常的代理服务器,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的HTTP请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。


正向/反向代理的区别:


  • 用途方面


    1. 正向代理的典型用途是 为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。


  • 2. 反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问。


    3. 反向代理还可以为后端的多台服务器提供负载均衡,或为后端较慢的服务器提供缓冲服务。


    4. 另外,反向代理还可以启用高级URL策略和管理技术,使处于不同Web服务器的Web页面同时存在于同一个URL空间下。


  • 安全方面


    1. 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为经过授权的客户端提供服务。

    2. 反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。




负载均衡




基本的请求与响应流程


    客户端发送多个请求到服务器,服务器处理请求,有一些请求可能与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。


    这种早期系统的架构模式相对单一,并发请求相对较少的情况下是比较合适的,成本也低,但是随着访问量和数据量的飞速增长,以及业务的复杂度增加,这种架构会造成服务器响应客户端请求的速度缓慢,并发量特别大的时候,有可能会造成服务器直接宕机。


    针对这种情况,就需要对系统进行优化。


    系统的扩展可分为纵向(垂直)扩展和横向(水平)扩展。   


    纵向扩展,是从单机的角度通过增加硬件处理能力,比如 CPU处理能力,内存容量,磁盘等方面,实现服务器处理能力的提升,不能满足大型分布式系统(网站),大流量、高并发、海量数据的问题。 


    因此需要采用横向扩展的方式,通过添加机器来满足大型网站服务的处理能力。当一台机器不能满足,则增加两台或者多台机器,共同承担访问压力,此时就产生了一个概念----负载均衡。


    单个服务器无法支撑,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求 集中到单个服务器的情况分发到多个服务器上,将负载分发到不同的服务器,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的,这就是负载均衡。


    使用带有负载均衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。



负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种。


硬件负载均衡也称硬负载,特点是造价昂贵成本较高,但数据的稳定性安全性好。

更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。


负载均衡解决的问题


  • 解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力)。


  • 提供故障转移,实现高可用。


  • 通过添加或减少服务器数量,提供网站伸缩性(扩展性)。


  • 安全防护;(负载均衡设备上做一些过滤,黑白名单等处理)。



简单来说,负载均衡就是将服务器接收到的请求按照规则分发的过程。


Nginx支持的负载均衡规则(调度算法)方式如下:


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



    fair:智能调整调度算法,动态的根据后端服务器的请求响应时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。


    url_hash:按照请求的URL的Hash结果分配请求,每个请求URL会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的Hash软件包。


动静分离




    动静分离是将网站静态资源(htmljavascript,CSS,Img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。


    动静分离的一种做法是将静态资源部署在nginx上,后台项目部署到应用服务器上,根据一定规则静态资源的请求全部请求nginx服务器,达到动静分离的目标。



参考


理解正向/反向代理 

https://www.cnblogs.com/puls/p/8634505.html


Nginx 学习

https://blog.csdn.net/mtsunbw/article/details/112368624

https://www.cnblogs.com/xingyunblog/p/9066865.html

https://developer.51cto.com/art/202003/612549.htm


动静分离

https://blog.csdn.net/anhldd/article/details/83187115



以上是关于Nginx-概念篇的主要内容,如果未能解决你的问题,请参考以下文章

Nginx概念和配置项用法篇一

负载均衡----实现配置篇(Nginx)

uWSGI其一:概念篇

nginx的总结篇以及一台nginx代理多个资源服务

负载均衡----实现配置篇(Nginx)

学会这些微服务+Tomcat+NGINX+MySQL+Redis,再去面试阿里P7岗吧