文章分类 - Nginx核心知识讲解
百万并发下的Nginx性能优化之道
    
摘要:在我们的nginx的http模块处理请求之前尼,首先要确保它的指令被正确的解析出来了,也就是说我们知道,为了处理这个请求,到底使用哪一个指令的值,因为我们说到指令的配置可以出现在http下,也可以出现在server块下,也可以出现在location下,在这里尼,我们首先需要确保这个请求是被哪个ser
        阅读全文
                
摘要:当我们在Nginx中确定哪一个域名处理用户请求的时候,或者用location匹配到哪些url的时候,或者我们重写url的时候,往往我们都需要使用正则表达式;因为正则表达式尼可以使我们的匹配的功能更加的强大,下面我来简单的介绍下正则表达式的用法; 正则表达式有很多种复杂的配置,这里简单介绍一些常用的语
        阅读全文
                
摘要:在HTTP模块开始处理用户请求之前尼,首先我们需要nginx的框架先对客户端建立好连接,然后接收用户发来的http的line;比如说方法,url等;然后再去接收到所有的header;那么根据这些header信息,我们才能决定使用哪些配置块;才能决定让http模块怎么样去处理请求; 所以我们先来看一看
        阅读全文
                
摘要:一个请求进入Nginx开始处理之前尼? 我们首先要增添端口,以使得Nginx可以和客户端建立起一个TCP连接,那么监听端口的这个指令尼,叫listen;它是放在我们的server配置块下的;通过监听的端口或者地址;我们其实已经可以决定有哪些匹配上我们TCP四元簇的地址连接对应的server块的相关指
        阅读全文
                
摘要:在讲解配置指令之前,先来看下HTTP配置指令的嵌套结构; 因为每一个二进制提供的指令,很多时候它可以出现在它的context也就是上下文,既可以在location中,又可以在server中,或者HTTP 中,甚至在if这样的配置快中; 那么当一个指令出现在多个配置块中的时候,它们的值可能是冲突的,那
        阅读全文
                
摘要:通过实例向大家演示HTTP模块,并结合以前讲解的知识; nginx的模块非常多,包括官方模块和第三方模块;每一个模块又都有自己独特的指令;这些繁琐的指令是非常难以记忆的; 接下来带领大家以请求处理流程的方式进行把所有的常用的HTTP模块的指令梳理在一起;把HTTP模块已在Nginx设计架构中定义的1
        阅读全文
                
摘要:接下来,我们来查看Nginx的动态模块,动态模块可以帮助我们在使用Nginx的时候,在升级Nginx的时候帮助我们减少编译环节;下面我们来看下动态模块在编译及使用的流程; 我们再用一个例子,给大家演示下; 我们在使用动态模块之前,先来看下在不适用动态模块的方法里,我们是怎么样使用Nginx; 首先我
        阅读全文
                
摘要:之前我们提到nginx的多个worker进程之间,做进程间通讯的时候,经常在共享内存上使用红黑树来管理许多对象,那么实际上在Nginx的内存上也会大量使用红黑树,现在我们来看看nginx中第二个非常常用的数据容器,红黑树首先是个二叉树,比如每一个节点:比如下图11有两个子节点,左子节点是6,右子节点
        阅读全文
                
摘要:Nginx容器是许多nginx高级功能的实现基础,即使我们不需要编辑第三方模块或者查看nginx的源代码;但我们需要变更我们的nginx配置文件,以达到最大化的性能; 我们也需要了解Nginx容器是怎么样使用的;下面我们来看下nginx最主要的内部容器; (1):首先就是数组,也就是ngx_arra
        阅读全文
                
摘要:刚刚我们谈到nginx不同的worker进程间需要共享信息的时候,需要通过共享内存;我们也谈到了共享内存上可以使用链表或者红黑树这样的数据结构;但是每一个红黑树上有许多节点;每一个节点你都需要分配内存去存放;那么怎么样把一整块共享内存切割成一小块给红黑树上的每一个节点使用尼? 下面我们来看下Slab
        阅读全文
                
摘要:Nginx是一个多进程程序,不同的worker进程之间,如果想要共享数据,那么只能通过共享内存;下面我们来看一看Nginx的共享内存是怎么使用的? nginx的进程间的通讯方式主要有两种 (1):第一种是信号,之前我们在说如何管理nginx的过程中已经比较详细的介绍过了; (2):共享内存:如果需要
        阅读全文
                
摘要:如果你开发过nginx的第三方模块,虽然我们在写C语言代码,但是不需要关心内存的释放,如果你现在在配置一些罕见场景的nginx的时候,你可能会需要去修改nginx在请求和连接上初始分配的内存池大小,但是nginx官方上推荐通常不需要修改这样的配置,那么我们究竟要不要修改这些内存池的大小尼? 下面我们
        阅读全文
                
摘要:之前我们谈到了nginx的读写事件,这些网络读写事件究竟是怎么应用到nginx上的尼? 还有我们谈到nginx使用了一个连接池来增加它的资源的利用率,下面我们来看下nginx的连接池究竟是怎么来使用的? 我们来看下上图中的右边的图,每一个worker进程里面都有一个独立的ngx_cycle_t这样的
        阅读全文
                
摘要:针对不同的具体场景,nginx模块会细分为子模块;在特定的复杂的场景下这些子模块会新增新的特性和功能;下面我们来看下nginx模块是怎样划分为子模块的; 上一节中我们谈到了ngx_module_t 是每一个模块必须具备的数据结构;其中它有一个成员叫type;这个type其实也就定义了这个模块它是属于
        阅读全文
                
摘要:Nginx之所以能有如此多的特性,是因为有大量的第三方开发者,在为它开发模块,Nginx之所以有这么丰富的生态圈,则是因为它的模块设计非常的优良,就比如TCP协议,它从上个世纪70年代设计至今,没有做过大的变动,接下来我们来看下nginx的模块设计究竟有什么高明之处? 理解Nginx模块, (1):
        阅读全文
                
摘要:很多同学对:同步&异步 阻塞&非阻塞这样的两个概念不是很清楚; 在我看来,阻塞和非阻塞主要是指操作系统和底层的C库提供的方法或者一个系统调用,也就是说我们在调用这个方法的时候,这个方法可能会导致我的进程进入sleep状态,为什么会进入sleep状态尼?就是当前的状态不满足的情况下,操作系统主动的把我
        阅读全文
                
摘要:前面我们谈到了nginx怎么使用epoll运行自己的事件驱动框架的,那么这样的一个事件驱动框架到底会给我们带来怎样的一个好处尼? 我们来看下在请求切换的这样一个场景中,这种事件驱动框架给我们带来的争议; 在下面的这张图中,实际上有三个请求,蓝色的,绿色的还有橘黄色的; 每一个请求如果是一个HTTP请
        阅读全文
                
摘要:上一节我们谈论到了Nginx的事件分发机制,在这个循环流程中,Nginx怎样能够快速的从操作系统的KERNEL中获取到等待处理的事件;这么一个简单的步骤,其实经历了很长时间才得以想出办法解决; 比如,到现在Nginx主要在使用epool这样一个网络事件收集器的模型: 现在我们简单来回顾下epool主
        阅读全文
                
摘要:在我们了解了网络事件以及事件分发收集器以后,我们再来看nginx是怎样来处理事件的? 当我们nginx刚刚启动的时候,实际上,在第一步wait for events on connections,也就是说我们打开了80或443端口;这个时候我们在等待新的事件进来,什么样的事件尼?比如新的客户端连上了
        阅读全文
                
摘要:之前我们谈到了网络报文的发送,以及这些报文对应了Nginx中的网络事件,比如像accept建立一条新连接,其实是收到了一条读事件,这么说大家可能觉得比较抽象,接下来我们通过抓包来分析建立三次握手时是怎么样让 Nginx 收到读事件,使用的抓包工具是 Wireshark 这里我们访问我们之前搭建的一个
        阅读全文
                
 
                    
                
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号