自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 NGINX Tail Command 功能

功能:此功能可以在执行完某一类配置指令后执行特定脚本或者可执行程序,用来完成和系统的联动。通过此功能可以不用修改源码直接通过配置来完成特定功能。用法:配置语法:tail_command <nginx directive> <executable program>比如:tail_command proxy_bind /root/nginx/proxy_bindtail_command listen listen_script.sh配置语义:tail_co

2021-05-18 22:46:49 186

原创 NGINX if脚本指令逻辑运算支持

概述NGINX的if指令只支持单个条件运算,比如 if ($a = 'test')或者if ($a != "test")等。利用闲暇时间扩充了if指令可,可以支持简单的&&和||逻辑运算。比如if ($a = 'test'||$b != 'testb') 或者if ($a = 'test'&& $b != 'testb')。源码地址:https://github.com/pei-jikui/nginx-if局限目前只支持 if (a &...

2021-04-09 23:05:31 513

原创 NGINX脚本语言原理及源码分析(四)

概述前几篇文章,我们分别介绍了NGINX变量的基本特性和实现原理以及NGINX中复杂变量求值的原理。 本篇,我们继续分析NGINX中rewrite模块定义的系列指令比如if/set/break/return等的实现原理。基本原理我们在分析NGINX复杂变量求值时,已经介绍和分析了NGINX脚本执行的基本原理。除了复杂变量求值涉及到NGINX脚本语言以外,另外一种显式地通过在配置脚本中配置的指令,比如NGINX 的rewrite模块或者geo模块定义的指令也需要NGINX的脚本语言功能的支持。

2021-04-09 13:38:16 255

原创 NGINX脚本语言原理及源码分析(三)

概述上两篇文章,我们分别介绍了NGINX变量的基本特性和实现原理。本篇,我们继续通过分析NGINX中复杂变量是如果通过NGINX脚本语言的原理实现求值的。基本原理语言编译我们平常使用的计算机语言一般分为两类,一种是编译型语言比如C语言,一种是脚本语言比如lua。编译型语言都要经历"编译"这个阶段,而脚本语言一般会简化掉这个步骤,直接解释执行。下图是一个程序语言从编写到运行的简要流程:所述流程中,词法分析是把源代码分析成一个个独立的单词。然后语法分析是对词法分析中生成的单词流进行进

2021-04-07 13:48:44 696

原创 NGINX 脚本语言原理及源码分析(二)

概述上篇文章,我们介绍了NGINX变量的基本特性。本篇,我们继续分析变量的实现原理,来分析变量是如何被定义以及如果被使用的。因为NGINX变量本身支持变量插入,比如set $abc ${host}abc{url}类型的变量。这种复杂变量abc的求值也是NGINX变量实现的一个特色和难点。对于这个复杂变量求值,我们将在下一篇分析脚本语言实现时进行分析。数据结构针对每一个变量,NGINX内部对应有两个数据结构,一个是NGX_HTTP_VARIABLE_S用来存储变量的名称等信息,另外一个是NGX

2021-03-22 11:16:42 190

原创 NGINX 脚本语言原理及源码分析(一)

概述NGINX本身提供了简单的脚本解析功能来提高配置使用的灵活性。与常用的语言一样,可以通过在NGINX文件中使用变量和指令来完成对NGINX的编程,来实现特定的功能。简单变量使用例子:…location /test {if ($args_name = “test”) { return 200 “welcome”;}}上面的配置完成的功能是,如果客户访问的服务器的/test URI并且携带的name参数值是test, 则给client返回状态码200并且输出是“we...

2021-03-15 19:20:31 1044

原创 NGINX缓存原理及源码分析(二)

概述上篇我们讲述了NGINX缓存的原理以及NGINX的Cache Loader和Cache Manager进程是如何工作的。本篇,我们继续分析NGINX工作原理的剩余的两个部分,那就是NGINX是如何生成和使用缓存的。引用上篇文章中的图片来描述从高层次来看,NGINX缓存的大体结构。如上图所示,NGINX在内存中维护一棵红黑树,然后每一个节点上存储这文件的元数据(meta data),并且在磁盘中存放文件的完整内容。NGINX的缓存功能都是围绕上述数据结构进行的。主要包括以下四个任务:

2021-01-20 00:21:08 394

原创 NGINX缓存原理及源码分析(一)

概述缓存是计算机领域的一种非常重要设计。主要用来提升响应速度。比如计算机系统中的存储体系就是这一经典缓存的实现。它是由寄存器,缓存,内存,磁盘,网络组成的一个层级体系,用来存储各种信息。类比日常生活中,我们对于知识的存储系统也是一个层级的缓存体系。它是由我们的大脑,笔记本,身边朋友,书籍,网络组成的。这些层级系统有一个共同的特点就是层级越高它的容量越小,速度越快但是同时价格也越贵。在我们使用浏览器获取信息时,也有一个缓存体系在发挥作用。那就是客户端浏览器缓存,中间各级代理设备缓存,服务器缓存,服务器

2021-01-07 21:07:50 760 7

原创 NGINX带宽限制原理及源码分析

概述我们前面已经分析了NGINX速率限制,并发限制的原理。NGINX的速率控制用来控制新建连接的速度,并发控制用来控制并发连接数目,而带宽控制是用来控制单个连接上从服务器到客户端数据传输的速率。作为NGINX流量控制系列的最后一篇文章,本文我们分析NGINX的带宽控制的原理。原理算法NGINX采用了令牌桶算法进行带宽控制。使用一张经典的图偏来描述令牌桶算法:具体流程是:系统以固定速率产生令牌,并且缓存到令牌桶里。 当令牌桶满时,再来的令牌会被丢弃。 传输报文时,根据.

2020-12-21 12:26:10 604 2

原创 NGINX并发限制原理及源码分析

概述上篇我们分析了NGINX速率限制的原理,本篇我们继续分析NGINX并发限制的原理,后面一篇,我们继续分析NGINX带宽限制的原理。速率限制用来限制单个客户端在单位时间的请求数目,而并发限制用来限制同一时间的连接总数。本篇文章我们对并发限制功能的原理和源代码进行分析,从而可以更好地理解和使用此功能。原理并发限制实现原理相对简单。它像速率限制那样需要采用漏桶或者令牌头算法进行流量的控制和整形。它只需维护一个计数表示当前的连接数,然后在建立连接时增加计数,连接断开时减少计数。当新的连接到来时比

2020-12-17 18:51:17 444

原创 NGINX速率限制原理及源码解析

概述NGINX速率限制功能是一个很重要的安全模块。通过正确有效地配置,使得特定客户端对某一个URI的访问频率频率进行有效地限制, 从而可以有效地减缓暴力密码破解攻击,也可以有效减缓DDOS攻击的破坏性,还可以防止上游服务器被大量并行的请求耗尽资源。本篇文章我们就速度限制功能的原理和源代码进行解析,从而可以更好地理解和使用速度限制功能。原理漏桶(Leaky Bucket)算法和令牌桶(Token Bucket)算法被广泛使用于通信领域进行流量整形和速率控制。NGINX采用的是漏桶(Leaky

2020-12-15 12:01:58 734 2

原创 NGINX共享内存实现原理及源码分析

Nginx 共享内存实现原理及源码解读概述Nginx是一个多进程的架构模型,其中类似流量统计,流量控制,负载均衡等诸多功能需要在不同的worker进程之间共享数据,相互配合完成任务。这些功能都是通过共享内存的帮助来得以实现的。Nginx实现的slab内存分配机制中,为了更高效地使用内存空间,采用了经典的时间换空间的思想。而且在增加的计算时间中,绝大部分都采用了位移操作,尽可能地在提高内存使用率的同时节省CPU时间。本文试着去从源代码层面去分析Nginx共享内存的分配使用的slab机制是如何实

2020-12-08 11:25:18 540

原创 Nginx Location匹配原理及源码分析

一 Location的作用上篇我们对Nginx如何对请求进行server匹配进行了分析。在Nginx定义的每一个server中,还可以定义多个不同的location。这些不同的location根据请求中的URI的不同对HTTP请求进一步细分,提供不同的处理方法和服务。比如,根据请求中的URI不同,对于有些服务Nginx可以通过提供本地静态文件,而对于另外的动态内容请求可以转发到另外的动态服务进程中。在实际的成产环境中,一个server 中可以定义非常多的location。而且在定义location时

2020-11-28 14:03:09 580

原创 Nginx Server匹配原理及源码分析

一概述Nginx最重要的功能之一就是把不同的请求分发到不同的服务处理中。其实质就是把服务请求转发到正确的服务上去。如果说二层的转发是依据数据包的二层mac地址,三层的转发依据的是数据包三层的IP地址,那么Nginx的服务转发依靠的是数据包的四七层信息。Nginx的请求路由转发,可以分成两个阶段。第一个阶段是匹配定义的server。首先根据请求中的目的地址和端口进行匹配。如果相同的目的地址和端口同时还会对应多个servers,再根据server_name属性进行进一步匹配。第二阶段...

2020-11-23 16:55:29 771 2

原创 Nginx动态DNS原理及源码分析

一 概述Nginx在配置上游的服务器时,支持域名配置。而且根据不同的配置,nginx提供了静态和动态解析两种方式。本文试图从代码层面分析动态dns解析是如何实现的。静态解析http { upstream test { server private.server1.com.cn; server private.server2.com.cn;...

2020-11-19 12:53:43 903 1

原创 Nginx内存池现实机制

问题引入使用C语言编程时,一般使用malloc和free进行动态内存申请和释放。如果一不小心忘记了调用free进行释放,很容易造成内存泄露。另一方面,频繁地进行malloc和free操作,很容易造成内存碎片。与此同时,因为malloc支持多线程同时操作,所以,使用同步锁是不可避免的。当然,根据malloc的实现原理,线程在进行malloc操作的时候,如果不能获得同步锁,就会另外在进程的heap区域开辟一段子区域进行内存申请,这样有效地避免长时间等待。但是频繁尝试去获得锁也需要一定的时间开销。问题解决

2020-05-12 14:01:07 181

原创 Nginx同步机制的实现原理

一 简介Nginx采用多进程加IO多路复用的方式来处理并发请求。进程之间采用信号量,共享内存等方式进行信息共享和同步。采用共享内存方式在多进程之间进行数据共享,必然需要进程之间采用同步机制进行同步。Nginx中最有名的同步锁就是ngx_accept_mutex。通过使用它,Nginx用来解决多进程并发处理的“网络惊群”问题。只有获得ngx_accept_mutex的进程才有资格处理当前的新...

2020-05-05 11:29:50 707 1

原创 Nignx sendfile 选项原理和实现

1 简介Linux kernel2.2版本引入了sendfile这种 “零拷贝(zero-copy)” 系统调用机制进行文件传输大大提高了静态文件的传输速度。Nginx随后也增加sendfile这一选项用来加速文件传输速度。本文我们试图去分析sendfile提升文件传输速度的奥秘以及从代码层面分析nginx是如何使用sendfile进行加速的。2 配置Nginx的sendfile选...

2020-05-02 18:39:54 535

原创 Nginx模块负载均衡原理源码分析

一 简介负载均衡是nginx非常重要的一项功能。在http和stream模块中也起着很重要的作用。两个模块中负载均衡工作的原理基本是一致的。下面,我们通过分析stream模块中负载均衡工作的原理,来深入理解nginx中负载均衡工作的原理。二 配置使用无论是http还是stream模块,都可以通过如下的配置语法把某一个服务和上游服务器关联起来。 upstream vpnft...

2020-04-10 17:14:33 1045 6

原创 Nginx stream 模块监听端口处理

一 简介Nginx 模块在定义服务时,一般是通过配置server里面的listen端口来完成。根据不同的listen语法,可以实现下了几种功能。 1. 最简单的,可以通过不同ip和port,对应某一个服务。server1 { listen 1.2.3.4:2121;}上面的配置,可以让所有到1.2.3.4端口是2121的连接进行server1规...

2020-04-08 20:56:56 4189

原创 添加Nginx ALG模块支持FTP协议ALG

概述本文系原创,同时发布于F5社区。Nginx从1.9.0开始加入了stream模块支持四层的代理,转发和负载均衡。但是,stream模块的功能相对简单。对需要ALG处理的协议比如FTP的支持也远远不够。我试着去修改了Nginx 的源代码,使之支持了FTP Passive模式的ALG功能。 Github的源码地址为:源码。可能大家会说,Passive模式不需要ALG。准确的说,P...

2020-03-20 19:33:19 1328

原创 Nginx stream 模块数据流程分析

1.nginx stream 模块从nginx1.9.0开始,新增加了stream模块用来实现四层协议的转发、代理和负载均衡。与著名的四层LB软件lvs相比,stream 模块(开源版)无论从功能还是性能上,都有一定的差距,实现也相对简单。从原理上来说,stream模块在应用层实现四层的转发,需要与两端建立起socket连接以后,来实现两端的数据收发进行代理转发。因此,大量的数据从内核态到...

2020-03-12 22:37:41 2818

原创 Nginx 核心框架主要数据结构

本文是原创,同时发布于F5社区作为一款源自于俄罗斯的软件,Nignx优秀的模块设计使得各个功能模块就像俄罗斯方块游戏中的一个个的方块一样被组合在一起。而粘合这些方块的,正是Nignx本身的核心框架。这个框架小巧又强大,朴实又高贵。通过最普通的技术呈现了一个实用又强大的系统框架。要了解和学习Nginx精华的核心框架,阅读代码是必不可少的一部分。“Talk is cheap, show ...

2020-03-06 15:20:41 184 2

原创 Nginx 高速并发处理模型

一 概述 Nginx是一款高性能webserver软件。除此以外它还具有很强的负载均衡,反向代理,邮件代理以及静态缓存的功能。在提供这些功能的同时,Nginx通过优秀的架构设计,实现了高速的高并发处理。这篇文章我们通过分析Nginx的框架结构,来解释它的高速并发处理的背后原因。二 框架结构 如下图所示,Nginx结合采用多进程和IO多路复用的结构处理并发客户请求。Mas...

2020-02-23 09:27:56 455

原创 STEP BY STEP创建大二层网络

STEP BY STEP创建大二层网络背景在一个客户项目中,需要在两台物理主机上创建多台虚机,并且保证这些虚机都在同一个二层网络里。因为当时还不清楚具体的客户需求,所以我们一方面和售前交流获取具体用户需求的信息,比如两台物理机的位置,他们的网络连接情况等等。与此同时,我们也准备了两套方案来应备可能的情况。最终的情况比我们想象的要简单,两个物理宿机本身就在同一...

2020-01-15 14:07:06 442

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除