nginx
文章平均质量分 68
theanarkh
这个作者很懒,什么都没留下…
展开
-
好玩的Openresty
Openresty是国人发起的一个开源项目,大概看了一下,也体验了一下,在技术实现上,角度挺有意思的。Openresty是基于Nginx的web服务器,有意思的是Openresty的思路是把web应用服务集成到Nginx里面。大家都知道Nginx是通常配合Node.js、Go、PHP等后端技术一起使用,通过进程间通信或者socket完成一个完整的服务。那么Openresty是怎么做的呢?Openresty通过把自己写的Nginx第三方模块和Lua语言整合到Nginx里,然后打出一个新包Openr原创 2021-07-31 11:29:18 · 150 阅读 · 0 评论 -
nginx的timeout(基于nginx1.17.9)
nginx中使用timeout的地方非常多,本文主要分析客户端和nginx通信时涉及到的几个timeout。连接建立成功,接收业务数据超时接收http报文的超时1 连接建立成功,接收业务数据超时这个逻辑从ngx_event_accept函数开始分析,ngx_event_accept是nginx在监听某个端口时,底层建立tcp连接成功后回调的函数。我们首先需要了解,在nginx中。一个连接是使用ngx_connection_t表示。每个ngx_connection_t对应两个ngx_event_t原创 2020-06-14 23:19:37 · 464 阅读 · 0 评论 -
ngx_http_auth_basic_module源码解析(基于nginx1.17.9)
auth_basic模块是nginx中比较简单的模块。地址在http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html。我们通过分析这个模块的代码,不仅知道如何使用,还可以了解到http认证的实现。该模块支持http认证和验证的功能。支持两个配置。location / { // 在浏览器弹框里的提示语 auth_basic "hello"; // 用户输入密码后,以password文件来判断是否正确原创 2020-06-14 17:22:39 · 331 阅读 · 0 评论 -
nginx1.17.9源码分析之线程池
我们发现事件驱动的软件都得配一个线程池。libuv和nginx都是。因为事件驱动的软件是单线程。但是有些事情总会引起线程阻塞。所以这个事情就不能放到主线程里做。这就是为什么事件驱动都要配一个线程池。把任务交给线程池中的线程。主线程继续执行。任务完成后通知主线程或者执行回调就行。 我们先看一下nginx线程池的架构。然后开始分析。线程池模块在ngi...原创 2020-03-20 00:52:25 · 211 阅读 · 0 评论 -
从nginx1.17.9源码理解nginx -s reload
使用nginx的时候,我们经常会使用nginx -s reload命令重启。下面我们就分析一下,执行这个命令的时候,nginx里发生了什么?我们从nginx的main函数开始。在main函数里,执行ngx_get_options函数命令行的初始化工作。我们只看reload相关的逻辑。// 解析命令行参数static ngx_int_tngx_get_options(int argc, ch...原创 2020-03-15 17:35:51 · 531 阅读 · 0 评论 -
nginx1.17.9源码分析之管理配置的结构体(1)
我们知道nginx中有一个超级复杂的配置管理数据结构conf_ctx,他是一个多级指针。今天就是分析这个数据结构的形成过程。首先nginx在启动时对模块的数据结构进行了预初始化。ngx_int_t ngx_preinit_modules(void){ ngx_uint_t i; for (i = 0; ngx_modules[i]; i++) { ngx_...原创 2020-03-15 16:33:15 · 257 阅读 · 0 评论 -
nginx0.1.0 access_handler模块源码分析
access模块主要是对连接到nginx中的客户端进行权限管理,nginx会根据access模块注册的命令,在解析命令的时候,遇到对应的命令的时候,会调用access注册的处理函数,access模块的处理函数会解析并记录这些配置,然后在每个连接到来时,判断ip是否在封禁的池子了。nginx只判断deny的规则,即同一个ip命中多条规则的时候,只要有一条是deny则结果就是deny。即deny优先。...原创 2019-03-22 00:42:14 · 219 阅读 · 0 评论 -
ngin0.1.0之range_filter模块源码解析
/* * Copyright (C) Igor Sysoev */#include <ngx_config.h>#include <ngx_core.h>#include <ngx_http.h>/* * the single part format: * * "HTTP/1.0 206 Partial Content" CRLF ...原创 2019-03-21 01:25:10 · 196 阅读 · 0 评论 -
nginx0.1.0之http模块初始化源码分析(5)
继续http模块的分析,这次分析的是init_module钩子函数的执行。http模块各子模块的init_module钩子主要做的事情是两个,一个就是注册phases回调,一个就是挂载模块到filter链表。首先看一下注册phases回调的模块access模块static ngx_int_t ngx_http_access_init(ngx_cycle_t *cycle){ ngx_...原创 2019-03-04 01:04:05 · 420 阅读 · 0 评论 -
nginx0.1.0之http模块初始化源码分析(4)
我们继续分析ngx_http_block函数剩余的代码,剩下的代码就是处理phases和监听的端口、地址、servername的。// 恢复上下文 *cf = pcf; /* init lists of the handlers */ ngx_init_array(cmcf-&gt;phases[NGX_HTTP_REWRITE_PHASE].handlers, ...原创 2019-03-04 00:15:36 · 239 阅读 · 0 评论 -
nginx0.1.0之http模块初始化源码分析(3)
我们继续分析ngx_http_block函数的代码,指令解析完,继续执行各子模块的钩子函数。/* * init http{} main_conf's, merge the server{}s' srv_conf's * and its location{}s' loc_conf's */ // 取出ngx_http_core_module在http上下文的m...原创 2019-03-03 22:31:24 · 289 阅读 · 0 评论 -
nginx数据结构之ngx_list分析(nginx0.1.0)
/* * Copyright (C) Igor Sysoev */#ifndef _NGX_LIST_H_INCLUDED_#define _NGX_LIST_H_INCLUDED_#include <ngx_config.h>#include <ngx_core.h>typedef struct ngx_list_part_s ngx_lis...原创 2019-02-26 23:00:43 · 271 阅读 · 3 评论 -
nginx源码分析--数组链表
数组和链表的优缺点我们都知道,nginx的数组链表结合了这两种数据结构的优点,表面是链表,链表里每个节点是一个固定大小的数组。结构如下图。 ngx_list.h/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */#ifndef _NGX_LIST_H_INCLUDED_#define _NGX_LIST_H_IN原创 2017-05-09 18:11:51 · 392 阅读 · 0 评论 -
nginx源码分析--内存池
内存池是nginx很重要的数据结构,结构图大概如下。 ngx_palloc.h/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */#ifndef _NGX_PALLOC_H_INCLUDED_#define _NGX_PALLOC_H_INCLUDED_#include <ngx_config.h>#incl原创 2017-05-10 15:11:06 · 623 阅读 · 1 评论 -
阻塞、非阻塞、同步、异步的理解
阻塞、非阻塞和同步、异步都是描述了这样的一种场景,当我们去获取一样东西时,没有立刻得到时,我们怎么办。 但是他们两两不是一个层次的描述。阻塞、非阻塞描述的是某人想得到一样东西时,如果没有得到,某人会怎么办,这里的重点是某人。如果某人一直在等待而不做其他事情,那就是阻塞,反之是非阻塞。 同步、异步描述的是如果某人想得到的东西,已经可以得到时,如何通原创 2017-09-10 03:37:24 · 293 阅读 · 0 评论 -
nginx0.1.0之event模块初始化源码分析(1)
下面是nginx中几个重要的数据结构。struct ngx_command_s { ngx_str_t name; // 命令名字 int type; // 命令的属性,参数个数、上下文等 char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); // 处理该命令的函...原创 2019-02-28 23:38:36 · 285 阅读 · 0 评论 -
nginx0.1.0之event模块初始化源码分析(2)
本文分析nginx的event在初始化时的第一个步骤,就是执行每个类型为NGX_EVENT_MODULE的模块的create_conf函数。该版本一共有8个这样的模块。下面我们看一下各个模块create_conf函数的代码。这是ngx_event_core_module模块的create_conf函数。// 创建存储事件模块配置的结构体static void *ngx_event_creat...原创 2019-03-01 00:05:49 · 182 阅读 · 0 评论 -
nginx0.1.0之event模块初始化源码分析(3)
前面已经分析了event初始化的整体流程和第一步create_conf,接下来看一下第二步ngx_conf_parse。这里不分析该函数的代码,该函数主要是遍历配置文件的内容,然后读取命令和参数。最后匹配nginx所有模块的配置,找到处理该指令的函数。我们首先看一下event模块中ngx_event_core_module模块的指令配置。static ngx_command_t ngx_eve...原创 2019-03-01 01:42:36 · 207 阅读 · 0 评论 -
nginx0.1.0之event模块初始化源码分析(4)
event的配置解析相关的代码已经分析完毕。下面分析一下另一个流程中event模块的实现。即在nginx创建进程,并且开始执行进程里的代码的时候。入口函数是ngx_worker_process_cycle。for (i = 0; ngx_modules[i]; i++) { if (ngx_modules[i]->init_process) { if (n...原创 2019-03-01 02:41:02 · 165 阅读 · 0 评论 -
nginx0.1.0之http模块初始化源码分析
http模块的初始化类似event模块,初始化的起点在解析到http指令的时候。对应的处理函数是ngx_http_block,因为该函数比较长,所以我们分段解析。第一部分先解析http模块的pre_conf、create_main_conf函数的实现。static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *con...原创 2019-03-02 01:57:56 · 428 阅读 · 0 评论 -
nginx0.1.0之http模块初始化源码分析(2)
本文讲解http各个模块指令的解析。1 access模块1 allow、deny指令// 每次遇到allow或者deny命令的时候执行的回调static char *ngx_http_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){ ngx_...原创 2019-03-02 16:08:35 · 315 阅读 · 0 评论 -
nginx源码分析--数组
ngx_array.h/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */#ifndef _NGX_ARRAY_H_INCLUDED_#define _NGX_ARRAY_H_INCLUDED_#include <ngx_config.h>#include <ngx_core.h>struct ngx_array原创 2017-05-09 17:25:29 · 295 阅读 · 0 评论