阅读 1977

写给后端的Nginx初级入门教程:基础篇

Nginx是什么?

Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,有报告表明能支持高 达 50,000 个并发连接数。国内京东,淘宝,阿里,新浪皆有使用Nginx。

Nginx通常被用来实现正向代理,反向代理,负载均衡,以及动静分离这四个功能。

本篇文章作为基础篇,将主要讲解这四个Nginx应用中最基础的概念,帮助大家更好的理解,从而为下一章的代码配置做准备:

不废话,直接上干货。

正向代理:

在说什么是反向代理之前,我们需要先了解一下什么是正向代理,正如大家所知,由于某些不可抗拒的因素,我们没有办法在中国大陆直接访问Google等网站,或者说访问GitHub这些国外网站网速比较慢,不论是正向代理还是反向代理,都其实可以看作是代理模式的衍生版本。下面我们通过一个小栗子来理解正向代理在这里面起的作用:

阿呆这几天愁眉苦脸的,工作中某些业务需要用到谷歌邮箱,可是现在别说谷歌邮箱了,谷歌都打不开,这可急坏了阿呆,正当阿呆一筹莫展之际,突然想到二呆刚被公司派去俄罗斯北极圈推销冰箱了,自己上不了谷歌,但是二呆能上啊,而且二呆的电脑并没有被限制访问,于是阿呆就想出了一个天才的办法,阿呆在公司远程控制二呆的电脑访问Google邮箱,这么一来问题便得到了完美解决。

而这个例子中的请求路径是这样的,我们先发送请求到我们的代理服务器,然后代理服务器再去请求Google的服务器,最后将请求到的内容返回给我们本机。而这样一种模式呢,我们就称之为正向代理。如图所示(图画的丑,下次还丑):

反向代理:

在了解了什么是正向代理之后,反向代理就容易理解多了。正向代理中我们的代理服务器是作为一个消费者存在的,而反向代理中我们则对外提供服务,我们来看下面这个例子:

二呆从俄罗斯回来之后,业绩上是一无所获,好在公司不至于太过绝情,于是给了二呆一次将功补过的机会。工作内容也很简单,要求二呆去组织一个暖气事业部为将来非洲的暖气业务做准备,这当然没问题,刚开始的时候,二呆感觉还好,因为公司部门不多,所以可以很方便叫某个人的编号去安排工作,比如8080,你去处理这个请求,8081你去处理这个,8082你去问问非洲人民的意见怎么样,可是慢慢随着公司在此项目上投入的越来越多,部门员工也排到了10000多,这下二呆还要记住每个人的编号就不太现实了,**于是二呆设立了一台代理服务器,让代理服务器去记住这些人的编号和功能,而二呆只需要记住代理服务器的编号就行了,于是整个部门在二呆眼里慢慢变成了一个整体,而具体有多少人二呆则是完全不关心了,甚至二呆都不需要知道部门中都有哪些员工,**如图所示:

而反向代理和正向代理最大的区别就是客户端完全感知不到代理的存在,比如我们正向代理访问Google,可能需要在本地软件比如小飞机上设置相应的代理服务器的地址和端口,而反向代理则完全不需要设置,比如淘宝,当客户端去访问淘宝的时候,可完全不知道淘宝开了多少台服务器,每个服务器的地址是多少,只需要像往常一样在浏览器中输入:taobao.com就行,至于双十一将至,阿里又额外开了多少台服务器,客户端则是完全感知不到的,所有的请求则是通过代理服务器通过负载均衡的方式分发到不同的服务器中了。

一句话总结:

反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器 IP 地址。

负载均衡:

负载均衡,其实不算是一个新的概念,负载均衡其实是在反向代理基础之上实现的,如果说反向代理的目的是为了隐藏真实服务器的IP地址的话,负载均衡则是提供了一组策略来将请求从代理服务器上分发到这些真实的服务器上去

在Nginx中,一共提供了三种负载均衡策略供开发者灵活选择:

  • 轮询(默认方式): 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
  • 权重(weight): weight 代表权重,默认为 1,权重越高被分配的客户端越多,权重越大,能力越大,责任越大,处理的请求就越多。
  • ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。

一句话总结:

增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

动静分离:

当我们的应用初具规模,服务器后端需要面对大量请求的话,原来的动静混合打包发布的方式就不再那么适用了,因为我们服务器一边需要去处理客户端发过来的动态请求,比如数据库的查询,计算等,又同时要处理客户端发过来的静态请求,比如图片,css样式等静态文件,大量的请求毫无疑问会增加我们后端的压力,挤占我们用于处理动态请求的性能,为了解决这个问题呢,于是就有了动静分离这种部署的方式。

动静分离就是把很少会发生修改的诸如图像,视频,css样式等静态资源文件放置在单独的服务器上,而动态请求则由另外一台服务器上进行,这样一来,负责动态请求的服务器则可以专注在动态请求的处理上,从而提高了我们程序的运行效率,与此同时,我们也可以针对我们的静态资源服务器做专属的优化,增加我们静态请求的响应速度。

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,

一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;

另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开,具体如何配置,后期Nginx实战会详细说明。

如下图所示:

总结:

本篇文章作为Nginx的第一篇,主要侧重讲了以下Nginx的四个基本概念,也是我们日常开发中遇到的最为频繁的四个功能,下一节呢,我们则从实际的代码入手,通过编写相应的代码,一步一步的完成反向代理,负载均衡,动静分离的配置。而正向代理呢,如果有兴趣的小伙伴可以自行查阅相关资料(狗头保命)。

相关笔记已经同步开源至本人github,欢迎star:

韩数的开发笔记

最后,欢迎点赞,关注我,有你好果子吃(滑稽)