写给小白的 Nginx 文章
原文地址:Nginx concepts I wish I knew years ago
原文作者:Aemie Jariwala(已授权)
译者 & 校正:HelloGitHub-小鱼干 & 卤蛋
Nginx 是一个采用主从架构的 Web 服务器,可用于反向代理、负载均衡器、邮件代理和 HTTP 缓存。
Emmm,上面的 Nginx 介绍看过去有些复杂而且充满了不明觉厉的术语。Relax,在这篇文章里,我(原作者)会先带你理解 Nginx 的架构和专有术语,最后实践一把安装和配置 Nginx。
简单来说,你只要记住一点:Nginx 是个神奇的 Web 服务器。(注:神奇之处下文会娓娓道来)
那什么是 Web 服务器呢?简而言之,Web 服务器就是一个中间人。举个例子,你要访问 hellogithub.com
(注:原文例子为 dev.to),在地址栏输入 https://hellogithub.com
时,你的浏览器会找到 https://hellogithub.com
的网络服务器地址并将它指向后端服务器,后端服务器再返回响应给客户端。
代理 vs 反向代理
Nginx 的基本特性是代理,所以你一定要明白什么是代理和反向代理。
代理
看个小例子,现在我们有 N 个客户端(N >= 1),一个中间 Web 服务器(在本例中,我们称之为代理)和一个服务器。这个例子主要的场景是,服务器不知道哪个客户端在请求(响应)。是不是有点难以理解?下面让我用示意图讲解下:
如图,client1 和 client2 通过代理服务器向服务器发送请求 request1 和 request2,此时后端服务器不知道 request1 是由 client1 发送的还是 client2 发送的,但会执行(响应)操作。
反向代理
简单来说,反向代理与代理的功能相反。现在我们有一个客户端、一个中间 Web 服务器和 N 个后端服务器(N >= 1),同样的来看下示意图:
如图,客户端将通过 Web 服务器发送请求。而 Web 服务器会通过一个算法,当中最有意思的算法是轮询,直接将请求指向许多后端服务器中的一个,并通过 Web 服务器将响应返回给客户端。因此,在上面的例子中,客户端其实并不知道在与哪个后端服务器进行交互。
负载均衡
又是枯燥的一个名词:负载均衡,不过它很好理解,因为负载均衡本身就是反向代理的一个实例。
来看看负载均衡和反向代理的本质区别。在负载均衡中,你必须有 2 个或者更多的后端服务器,但在反向代理中,多台服务器不是必需的,甚至一台后端服务器也能运作。我们再深入点,如果我们有很多来自客户端的请求,负载均衡器会检查每个后端服务器的状态,均匀地分配请求,更快地向客户端发送响应。
有状态 vs 无状态应用
Okay,在我们开始实践 Nginx 之前,先搞清所有的基本知识!
有状态应用
有状态应用存了一个额外变量,只用来保存服务器中单个实例使用所需的信息。
如图所示,一个后端服务器 server1 存储了一些信息,服务器 server2 并不存储此信息,因此,客户端 (上图 Bob) 的交互可能会也可能不会得到想要的结果,因为它可能会与 server1 或 server2 交互。在本例中,server1 允许 Bob 查看数据文件,但 server2 不允许。因此,虽然有状态应用避免对数据库的多次 API 调用,并且(响应)速度更快,但它可能会在不同的服务器上导致这个(无法得到想要结果)问题。
无状态应用
无状态应用有更多的数据库 API 调用,但当客户端与不同后端服务器的交互时,无状态应用却存在更少的问题。
没明白?简单来说,如果我通过 Web 服务器从客户端向后端服务器 server1 发送请求,它将向客户端返回一个令牌,用于任何进一步的访问请求。客户端可以使用令牌并向 Web 服务器发送请求。此 Web 服务器将请求连同令牌一起发送到任意后端服务器,而每个后端服务器都能提供相同的所需结果。
Nginx 是什么?
Nginx 是网络服务器,到目前为止,我的整个博客一直在用这个网络服务器。老实说,Nginx 这就像个中间人。
这个图不难理解,它是目前为止所有概念的一个组合。在这里,我们有 3 个后端服务器运行在 3001、3002 和 3003 端口,这些后端服务器都能访问同一个运行在 5432 端口的数据库。
当一个客户端向 https://localhost
(默认端口 443)发起一个 GET /employees
请求时,Nginx 将基于算法向任意后端服务器发送请求,从数据库获取数据并将 JSON 数据返回 Nginx Web 服务器再发送给客户端。
如果我们使用一个诸如轮询这样的算法,它让 client2 向 https://localhost
发送一个请求,然后 Nginx 服务器会先将请求传到 3000 端口并将响应返回给客户端。对另一个请求,Nginx 会把请求传给 3002 端口,以此类推。
知识储备完成!到这里,你对 Nginx 是什么以及 Nginx 所涉及的术语有了一个清晰的理解。是时候,了解安装和配置技术了。
开始安装 Nginx
时机到了,如果你了解了上面的概念,可以动手开始 Nginx 实践了。
嗯,Nginx 的安装过程对任何系统来说都很简单。我是一个 Mac OSX 用户,所以例子的命令是基于 macOS 的, Ubuntu、Windows 和其他 Linux 发行版操作和例子类似。
$ brew install Nginx
只要执行上面这步,你的系统就有 Nginx 了!是不是很神奇!
运行 Nginx 如此简单
写给小白的 Nginx 文章的更多相关文章
- 写给小白的JVM学习指南
Java 虚拟机是学习 Java 的基础,也是迈入高级 Java 开发工程师的必备知识点.所以今天这篇文章我们来聊聊如何从零开始学习 Java 虚拟机. 基础 对于刚刚接触 JVM 的同学来说,JVM ...
- 手把手教你写DI_3_小白徒手支持 `Singleton` 和 `Scoped` 生命周期
手把手教你写DI_3_小白徒手支持 Singleton 和 Scoped 生命周期 在上一节:手把手教你写DI_2_小白徒手撸构造函数注入 浑身绷带的小白同学:我们继续开展我们的工作,大家都知道 Si ...
- Nginx 相关介绍(Nginx是什么?能干嘛?个人觉得写得比较好的文章,转载过来)
Nginx的产生 没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一资源描述符(Unifor ...
- 写给小白看的入门级 Java 基本语法,强烈推荐
之前写的一篇我去阅读量非常不错,但有一句留言深深地刺痛了我: 培训班学习半年,工作半年,我现在都看不懂你这篇文章,甚至看不下去,对于我来说有点深. 从表面上看,这句话有点讽刺我的文章写得不够通俗易懂的 ...
- 写给小白看的Mysql事务
1 为什么需要事务 在网上的很多资料里,其实没有很好的解释为什么我们需要事务.其实我们去学习一个东西之前,还是应该了解清楚这个东西为什么有用,硬生生的去记住事务的ACID特性.各种隔离级别个人认为没有 ...
- NodeJS写个爬虫,把文章放到kindle中阅读
这两天看了好几篇不错的文章,有的时候想把好的文章 down 下来放到 kindle 上看,便写了个爬虫脚本,因为最近都在搞 node,所以就很自然的选择 node 来爬咯- 本文地址:http://w ...
- 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- 写给大忙人的nginx核心配置详解
由于当前很多应该都是前后端分离了,同时大量的基于http的分布式和微服务架构,使得很多时候应用和不同项目组之间的系统相互来回调用,关系复杂.如果使用传统的做法,都在应用中进行各种处理和判断,不仅维护复 ...
- 手把手教你写DI_2_小白徒手撸构造函数注入
小白徒手撸构造函数注入 在上一节:手把手教你写DI_1_DI框架有什么? 我们已经知道我们要撸哪些东西了 那么我们开始动工吧,这里呢,我们找小白同学来表演下 小白同学 :我们先定义一下我们的广告招聘纸 ...
随机推荐
- 基于数据库、redis和zookeeper实现的分布式锁
基于数据库 基于数据库(MySQL)的方案,一般分为3类:基于表记录.乐观锁和悲观锁 基于表记录 用表主键或表字段加唯一性索引便可实现,如下: CREATE TABLE `database_lock` ...
- 【kinetic】操作系统探索总结(五)创建简单的机器人模型smartcar
p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify } a:link { color: r ...
- editmd输出到前端显示
官方案例:html-preview-markdown-to-html.html 输出后台数据显示在前端,格式化内容<!DOCTYPE html> <html lang="z ...
- Spring Boot中初始化资源的几种方式
CommandLineRunner 定义初始化类 MyCommandLineRunner 实现 CommandLineRunner接口,并实现它的 run()方法,在该方法中编写初始化逻辑 注册成Be ...
- JVM参数调优总结
一.前言 要想成为一名高级Java开发具备JVM调优的能力必不可少,能够根据项目实际情况进行JVM调优的前提是理解JVM原理和常用JVM参数的含义及作用,虽然<深入理解Java虚拟机>这本 ...
- 第十六章节 BJROBOT 开机自启动服务【ROS全开源阿克曼转向智能网联无人驾驶车】
1.把小车平放在地板上,用资料里的虚拟机,打开一个终端 ssh 过去主控端运行rosrun robot_upstart install znjrobot/launch/bringup.launch 2 ...
- 基础设施层-Adnc.Infr.Consul
Adnc.Infr.Consul 主要提供服务自动注册/发现以及获取配置. 项目结构 Configuration 配置中心相关共功能,主要有两个关键类 1.ConsulConfigurationPro ...
- vuetify 属性集合
1.v-form 组件具有 three 功能,可以通过在该组件上设置 ref 来访问它们. ref 允许我们访问组件上的内部方法,例如 <v-form ref="form"& ...
- 【项目实践】SpringBoot三招组合拳,手把手教你打出优雅的后端接口
以项目驱动学习,以实践检验真知 前言 一个后端接口大致分为四个部分组成:接口地址(url).接口请求方式(get.post等).请求数据(request).响应数据(response).如何构建这几个 ...
- win7-win10 禁用IPV6临时地址
IPV6临时地址本意是保护设备隐私,但有时候需要暂时禁用的情景下指令 netsh interface ipv6 set privacy state=disable 启用则修改最后的状态值为enable ...
Java 虚拟机是学习 Java 的基础,也是迈入高级 Java 开发工程师的必备知识点.所以今天这篇文章我们来聊聊如何从零开始学习 Java 虚拟机. 基础 对于刚刚接触 JVM 的同学来说,JVM ...
手把手教你写DI_3_小白徒手支持 Singleton 和 Scoped 生命周期 在上一节:手把手教你写DI_2_小白徒手撸构造函数注入 浑身绷带的小白同学:我们继续开展我们的工作,大家都知道 Si ...
Nginx的产生 没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一资源描述符(Unifor ...
之前写的一篇我去阅读量非常不错,但有一句留言深深地刺痛了我: 培训班学习半年,工作半年,我现在都看不懂你这篇文章,甚至看不下去,对于我来说有点深. 从表面上看,这句话有点讽刺我的文章写得不够通俗易懂的 ...
1 为什么需要事务 在网上的很多资料里,其实没有很好的解释为什么我们需要事务.其实我们去学习一个东西之前,还是应该了解清楚这个东西为什么有用,硬生生的去记住事务的ACID特性.各种隔离级别个人认为没有 ...
这两天看了好几篇不错的文章,有的时候想把好的文章 down 下来放到 kindle 上看,便写了个爬虫脚本,因为最近都在搞 node,所以就很自然的选择 node 来爬咯- 本文地址:http://w ...
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
由于当前很多应该都是前后端分离了,同时大量的基于http的分布式和微服务架构,使得很多时候应用和不同项目组之间的系统相互来回调用,关系复杂.如果使用传统的做法,都在应用中进行各种处理和判断,不仅维护复 ...
小白徒手撸构造函数注入 在上一节:手把手教你写DI_1_DI框架有什么? 我们已经知道我们要撸哪些东西了 那么我们开始动工吧,这里呢,我们找小白同学来表演下 小白同学 :我们先定义一下我们的广告招聘纸 ...
基于数据库 基于数据库(MySQL)的方案,一般分为3类:基于表记录.乐观锁和悲观锁 基于表记录 用表主键或表字段加唯一性索引便可实现,如下: CREATE TABLE `database_lock` ...
p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify } a:link { color: r ...
官方案例:html-preview-markdown-to-html.html 输出后台数据显示在前端,格式化内容<!DOCTYPE html> <html lang="z ...
CommandLineRunner 定义初始化类 MyCommandLineRunner 实现 CommandLineRunner接口,并实现它的 run()方法,在该方法中编写初始化逻辑 注册成Be ...
一.前言 要想成为一名高级Java开发具备JVM调优的能力必不可少,能够根据项目实际情况进行JVM调优的前提是理解JVM原理和常用JVM参数的含义及作用,虽然<深入理解Java虚拟机>这本 ...
1.把小车平放在地板上,用资料里的虚拟机,打开一个终端 ssh 过去主控端运行rosrun robot_upstart install znjrobot/launch/bringup.launch 2 ...
Adnc.Infr.Consul 主要提供服务自动注册/发现以及获取配置. 项目结构 Configuration 配置中心相关共功能,主要有两个关键类 1.ConsulConfigurationPro ...
1.v-form 组件具有 three 功能,可以通过在该组件上设置 ref 来访问它们. ref 允许我们访问组件上的内部方法,例如 <v-form ref="form"& ...
以项目驱动学习,以实践检验真知 前言 一个后端接口大致分为四个部分组成:接口地址(url).接口请求方式(get.post等).请求数据(request).响应数据(response).如何构建这几个 ...
IPV6临时地址本意是保护设备隐私,但有时候需要暂时禁用的情景下指令 netsh interface ipv6 set privacy state=disable 启用则修改最后的状态值为enable ...