0%

前言

模块化是Nginx的一个重要特性,一方面可以很好的拆解各功能之间的耦合,另一方便让Nginx的扩展性得到很大提升。每个人都可以开发模块来适应实际遇到的场景。后面会有专门的一篇来介绍Nginx的模块开发工作,本篇则主要是介绍Nginx模块的内部结构,只有在完全了解这些的基础上,我们在开发模块的时候才能得心应手。相关代码参照src/core/ngx_module.h|.c

阅读全文 »

前言

在Nginx的源码的src/core/ngx_buf.c|h文件中我们可以看到两中数据结构,一个是ngx_buf_t,另一个是ngx_chain_tngx_buf_t是一个数据存储的结构体,在链表中用来保存节点的数据。这个数据可以是内存中的某一段,也可以是文件中的某一段内容。ngx_chain_t结构体则表示链表。

阅读全文 »

前言

这个queue从字面上来说是队列,但是阅读完之后感觉是一个双向循环链表,暂时也不知道怎么称呼了,后续能确定了之后再说吧。

Nginx中的队列也是一个包含哨兵节点的双向循环链表,和我们从教材中认识的双向循环链表有一些不同。在Nginx中,双向循环链表的结构体中只有两个数据成员,分别是指向前一个结构体的指针和指向后一个结构体多的指针,并没有一个数据成员是用来保存数据的。这是因为在Nginx中,队列都是作为其他结构中的一个数据成员出现的,相关数据存储都在和其他结构体中体现的。

阅读全文 »

前言

Nginx中list的实现很简单,内部采用链表的形式串联起多个节点,其中每个节点采用一个数组的形式,可以存储多个数据。在源码文件中src/core/ngx_list.h|.c中可以看到相关的函数并不多,只有创建初始化添加三个方法,在明白了内存池的相关逻辑后,阅读起来还是很轻松的。

阅读全文 »

前言

数组在Nginx中是通过ngx_array_t的结构体实现的,在这个结构体中,分别记录了数组的容量大小、实际使用的数量、每个元素的大小以及存储数组元素空间的起始地址,其内部存储数组元素的地方是一块连续的空间。在相关的函数中,都会看到为了维持这个连续性而进行的一些操作。

连续性是指当内存池为数组元素分配存储空间后,该内存池没有为其他的场景再次分配内存,接下来当数组需要扩大容量的时候,内存池能够接着上次为数组元素分配的地址结尾处接着分配空间,从而保证数组元素存储空间的连续。

阅读全文 »

前言

Nginx的字符串表示方法和C语言中的字符串表示方法不太一样,在C语言中一个字符串是从某一个地址开始,然后往后遍历直到遇到\0才表示这个字符串结束了。但是在Nginx中,根据实际的使用场景,在C语言的基础上对其稍加封装了一下,字符串的结束位置不再以\0作为结束标志,而是给出一个长度来计算结束位置。总的来说C语言中的字符串是通过起始位置和结束位置来确认,Nginx中则是通过起始位置和长度来确认。

详细说明可参照源码中src/ngx_string.h|.c文件。

阅读全文 »

概述

Nginx在大多数涉及到内存使用的地方都用到了ngx_pool_t这个结构体以及和这个结构体相关的一些函数。这个结构体是Nginx用来管理内存的用的,涉及到内存的申请、释放以及一些相关资源的管理。当我们需要去和内存打交道的时候,不需要去花费时间在担心某块内存没有释放造成野指针的情况。

Nginx在内存管理中将内存分为两种类型,一种是小块内存,一种是大块内存。这两种内存以ngx_pool_s结构体中max作为区分界限。其中小块内存是在内存池的数据块(对应结构体中的d)中进行分配,在大部分情况下的小块内存的分配过程中,只需要去移动一个内部的指针便可。在分配大块内存的过程中,每次都会去申请一块内存。因此对比来看,小块内存的申请效率更加方便。具体内容可以参考源码中src/core/ngx_palloc.h|.c的相关内容。

阅读全文 »

因为目前的工作都在是LNMP(linux + nginx + mysql + php)平台上进行开发,而且在大部分的工作中和PHP打交道的机会更多,对剩余的3个方面接触不是很深。很早之前就有计划要对这四方面的每个点进行深入的学习,当时因为工作太忙,很难抽出时间来去深入的学习。正好最近有一些闲暇时间,就开始执行自己的计划。我是准备按照Nginx、PHP、Mysql、Linux这个顺序去依次深入学习的,中间也许会有所变动。

从16年开始,慢慢的开始养成了写博客的习惯,一方面是方便自己以后巩固查缺补漏,另一方便是方便将自己的见解和其他人一起分享,互相探讨和进步。

此次阅读Nginx源码的主要目的有两点,一是通过阅读优秀的代码来审视自己的代码中的不足并加以改进,二是希望对Nginx有一个详细的了解,只有明白了之后,在以后的工作当中才能游刃有余的面对相关的问题。这一次的阅读顺序是按照我自己的思路去展开的,等到全部阅读完之后,会去写一篇总结并重新梳理一下所有的文章,希望能给想去阅读Nginx的朋友一些便利。

此次阅读的Nginx版本号为1.13.1

前言

在开发IOS应用的过程中,难免的会遇到和WebView打交道的场景,通常为了实现产品经理的功能需求还要去和WebView里面的JS进行交互。作为一个刚IOS开发的新人来说,第一次肯定会遇到各种问题和各种坑。在这里我把我的问题和解决方法罗列出来,希望对其他的大胸弟们有所帮助。

概述

IOS提供给我们的WebView控件类型总共有3中,UIWebViewWkWebViewSFSafariView。这三种类型的控件有这不同的使用限制和要求,在实际项目中,我们需要根据项目的实际要求选择其中的一个就可以了。接下来,我会介绍一下这三种类型的区别。

阅读全文 »