新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 站长技术 > 服务器

Nginx 模块的基本结构

时间:2019-11-26 13:40:01  来源:  作者:
<a href=http://www.solves.com.cn/e/tags/?tagname=Nginx target=_blank class=infotextkey>Nginx</a> 模块的基本结构

 

模块配置结构

基本上每个模块都会提供一些配置指令,以便于用户可以通过配置来控制该模块的行为。那么这些配置信息怎么存储呢?那就需要定义该模块的配置结构来进行存储。

大家都知道 Nginx 的配置信息分成了几个作用域(scope,有时也称作上下文),这就是 main,server 以及 location。同样的每个模块提供的配置指令也可以出现在这几个作用域里。那对于这三个作用域的配置信息,每个模块就需要定义三个不同的数据结构去进行存储。当然,不是每个模块都会在这三个作用域都提供配置指令的。那么也就不一定每个模块都需要定义三个数据结构去存储这些配置信息了。视模块的实现而言,需要几个就定义几个。

有一点需要特别注意的就是,在模块的开发过程中,我们最好使用 Nginx 原有的命名习惯。这样跟原代码的契合度更高,看起来也更舒服。

对于模块配置信息的定义,命名习惯是ngx_http_<module name>_(main|srv|loc)_conf_t。这里有个例子,就是从我们后面将要展示给大家的 hello module 中截取的。

 typedef struct
 {
 ngx_str_t hello_string;
 ngx_int_t hello_counter;
 }ngx_http_hello_loc_conf_t;

模块配置指令

一个模块的配置指令是定义在一个静态数组中的。同样地,我们来看一下从 hello module 中截取的模块配置指令的定义。

 static ngx_command_t ngx_http_hello_commands[] = {
 { 
 ngx_string("hello_string"),
 NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS|NGX_CONF_TAKE1,
 ngx_http_hello_string,
 NGX_HTTP_LOC_CONF_OFFSET,
 offsetof(ngx_http_hello_loc_conf_t, hello_string),
 NULL },
 { 
 ngx_string("hello_counter"),
 NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
 ngx_http_hello_counter,
 NGX_HTTP_LOC_CONF_OFFSET,
 offsetof(ngx_http_hello_loc_conf_t, hello_counter),
 NULL }, 
 ngx_null_command
 };

其实看这个定义,就基本能看出来一些信息。例如,我们是定义了两个配置指令,一个是叫 hello_string,可以接受一个参数,或者是没有参数。另外一个命令是 hello_counter,接受一个 NGX_CONF_FLAG 类型的参数。除此之外,似乎看起来有点迷惑。没有关系,我们来详细看一下 ngx_command_t,一旦我们了解这个结构的详细信息,那么我相信上述这个定义所表达的所有信息就不言自明了。

ngx_command_t 的定义,位于src/core/ngx_conf_file.h中。

 struct ngx_command_s {
 ngx_str_t name;
 ngx_uint_t type;
 char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 ngx_uint_t conf;
 ngx_uint_t offset;
 void *post;
 };

name: 配置指令的名称。

type: 该配置的类型,其实更准确一点说,是该配置指令属性的集合。Nginx 提供了很多预定义的属性值(一些宏定义),通过逻辑或运算符可组合在一起,形成对这个配置指令的详细的说明。下面列出可在这里使用的预定义属性值及说明。

  • NGX_CONF_NOARGS:配置指令不接受任何参数。
  • NGX_CONF_TAKE1:配置指令接受 1 个参数。
  • NGX_CONF_TAKE2:配置指令接受 2 个参数。
  • NGX_CONF_TAKE3:配置指令接受 3 个参数。
  • NGX_CONF_TAKE4:配置指令接受 4 个参数。
  • NGX_CONF_TAKE5:配置指令接受 5 个参数。
  • NGX_CONF_TAKE6:配置指令接受 6 个参数。
  • NGX_CONF_TAKE7:配置指令接受 7 个参数。

可以组合多个属性,比如一个指令即可以不填参数,也可以接受1个或者2个参数。那么就是NGX_CONF_NOARGS|NGX_CONF_TAKE1|NGX_CONF_TAKE2。如果写上面三个属性在一起,你觉得麻烦,那么没有关系,Nginx 提供了一些定义,使用起来更简洁。

  • NGX_CONF_TAKE12:配置指令接受 1 个或者 2 个参数。
  • NGX_CONF_TAKE13:配置指令接受 1 个或者 3 个参数。
  • NGX_CONF_TAKE23:配置指令接受 2 个或者 3 个参数。
  • NGX_CONF_TAKE123:配置指令接受 1 个或者 2 个或者 3 参数。
  • NGX_CONF_TAKE1234:配置指令接受 1 个或者 2 个或者 3 个或者 4 个参数。
  • NGX_CONF_1MORE:配置指令接受至少一个参数。
  • NGX_CONF_2MORE:配置指令接受至少两个参数。
  • NGX_CONF_MULTI: 配置指令可以接受多个参数,即个数不定。
  • NGX_CONF_BLOCK:配置指令可以接受的值是一个配置信息块。也就是一对大括号括起来的内容。里面可以再包括很多的配置指令。比如常见的 server 指令就是这个属性的。
  • NGX_CONF_FLAG:配置指令可以接受的值是"on"或者"off",最终会被转成 bool 值。
  • NGX_CONF_ANY:配置指令可以接受的任意的参数值。一个或者多个,或者"on"或者"off",或者是配置块。

最后要说明的是,无论如何,Nginx 的配置指令的参数个数不可以超过 NGX_CONF_MAX_ARGS 个。目前这个值被定义为 8,也就是不能超过 8 个参数值。

下面介绍一组说明配置指令可以出现的位置的属性。

  • NGX_DIRECT_CONF:可以出现在配置文件中最外层。例如已经提供的配置指令 daemon,master_process 等。
  • NGX_MAIN_CONF: http、mail、events、error_log 等。
  • NGX_ANY_CONF: 该配置指令可以出现在任意配置级别上。

对于我们编写的大多数模块而言,都是在处理http相关的事情,也就是所谓的都是NGX_HTTP_MODULE,对于这样类型的模块,其配置可能出现的位置也是分为直接出现在http里面,以及其他位置。

  • NGX_HTTP_MAIN_CONF: 可以直接出现在 http 配置指令里。
  • NGX_HTTP_SRV_CONF: 可以出现在 http 里面的 server 配置指令里。
  • NGX_HTTP_LOC_CONF: 可以出现在 http server 块里面的 location 配置指令里。
  • NGX_HTTP_UPS_CONF: 可以出现在 http 里面的 upstream 配置指令里。
  • NGX_HTTP_SIF_CONF: 可以出现在 http 里面的 server 配置指令里的 if 语句所在的 block 中。
  • NGX_HTTP_LMT_CONF: 可以出现在 http 里面的 limit_except 指令的 block 中。
  • NGX_HTTP_LIF_CONF: 可以出现在 http server 块里面的 location 配置指令里的 if 语句所在的 block 中。

set: 这是一个函数指针,当 Nginx 在解析配置的时候,如果遇到这个配置指令,将会把读取到的值传递给这个函数进行分解处理。因为具体每个配置指令的值如何处理,只有定义这个配置指令的人是最清楚的。来看一下这个函数指针要求的函数原型。

char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

先看该函数的返回值,处理成功时,返回 NGX_OK,否则返回 NGX_CONF_ERROR 或者是一个自定义的错误信息的字符串。

再看一下这个函数被调用的时候,传入的三个参数。

  • cf: 该参数里面保存从配置文件读取到的原始字符串以及相关的一些信息。特别注意的是这个参数的args字段是一个 ngx_str_t类型的数组,该数组的首个元素是这个配置指令本身,第二个元素是指令的第一个参数,第三个元素是第二个参数,依次类推。
  • cmd: 这个配置指令对应的 ngx_command_t 结构。
  • conf: 就是定义的存储这个配置值的结构体,比如在上面展示的那个 ngx_http_hello_loc_conf_t。当解析这个 hello_string 变量的时候,传入的 conf 就指向一个 ngx_http_hello_loc_conf_t 类型的变量。用户在处理的时候可以使用类型转换,转换成自己知道的类型,再进行字段的赋值。

为了更加方便的实现对配置指令参数的读取,Nginx 已经默认提供了对一些标准类型的参数进行读取的函数,可以直接赋值给 set 字段使用。下面来看一下这些已经实现的 set 类型函数。

  • ngx_conf_set_flag_slot: 读取 NGX_CONF_FLAG 类型的参数。
  • ngx_conf_set_str_slot:读取字符串类型的参数。
  • ngx_conf_set_str_array_slot: 读取字符串数组类型的参数。
  • ngx_conf_set_keyval_slot: 读取键值对类型的参数。
  • ngx_conf_set_num_slot: 读取整数类型(有符号整数 ngx_int_t)的参数。
  • ngx_conf_set_size_slot:读取 size_t 类型的参数,也就是无符号数。
  • ngx_conf_set_off_slot: 读取 off_t 类型的参数。
  • ngx_conf_set_msec_slot: 读取毫秒值类型的参数。
  • ngx_conf_set_sec_slot: 读取秒值类型的参数。
  • ngx_conf_set_bufs_slot: 读取的参数值是 2 个,一个是 buf 的个数,一个是 buf 的大小。例如: output_buffers 1 128k;
  • ngx_conf_set_enum_slot: 读取枚举类型的参数,将其转换成整数 ngx_uint_t 类型。
  • ngx_conf_set_bitmask_slot: 读取参数的值,并将这些参数的值以 bit 位的形式存储。例如:HttpDavModule 模块的 dav_methods 指令。

conf: 该字段被 NGX_HTTP_MODULE 类型模块所用 (我们编写的基本上都是 NGX_HTTP_MOUDLE,只有一些 Nginx 核心模块是非 NGX_HTTP_MODULE),该字段指定当前配置项存储的内存位置。实际上是使用哪个内存池的问题。因为 http 模块对所有 http 模块所要保存的配置信息,划分了 main, server 和 location 三个地方进行存储,每个地方都有一个内存池用来分配存储这些信息的内存。这里可能的值为 NGX_HTTP_MAIN_CONF_OFFSET、NGX_HTTP_SRV_CONF_OFFSET 或 NGX_HTTP_LOC_CONF_OFFSET。当然也可以直接置为 0,就是 NGX_HTTP_MAIN_CONF_OFFSET。

offset: 指定该配置项值的精确存放位置,一般指定为某一个结构体变量的字段偏移。因为对于配置信息的存储,一般我们都是定义个结构体来存储的。那么比如我们定义了一个结构体 A,该项配置的值需要存储到该结构体的 b 字段。那么在这里就可以填写为 offsetof(A, b)。对于有些配置项,它的值不需要保存或者是需要保存到更为复杂的结构中时,这里可以设置为 0。

post: 该字段存储一个指针。可以指向任何一个在读取配置过程中需要的数据,以便于进行配置读取的处理。大多数时候,都不需要,所以简单地设为 0 即可。

看到这里,应该就比较清楚了。ngx_http_hello_commands 这个数组每 5 个元素为一组,用来描述一个配置项的所有情况。那么如果有多个配置项,只要按照需要再增加 5 个对应的元素对新的配置项进行说明。

需要注意的是,就是在ngx_http_hello_commands这个数组定义的最后,都要加一个ngx_null_command作为结尾。

模块上下文结构

这是一个 ngx_http_module_t 类型的静态变量。这个变量实际上是提供一组回调函数指针,这些函数有在创建存储配置信息的对象的函数,也有在创建前和创建后会调用的函数。这些函数都将被 Nginx 在合适的时间进行调用。

 typedef struct {
 ngx_int_t (*preconfiguration)(ngx_conf_t *cf);
 ngx_int_t (*postconfiguration)(ngx_conf_t *cf);
 void *(*create_main_conf)(ngx_conf_t *cf);
 char *(*init_main_conf)(ngx_conf_t *cf, void *conf);
 void *(*create_srv_conf)(ngx_conf_t *cf);
 char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);
 void *(*create_loc_conf)(ngx_conf_t *cf);
 char *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);
 } ngx_http_module_t; 
  • preconfiguration: 在创建和读取该模块的配置信息之前被调用。
  • postconfiguration: 在创建和读取该模块的配置信息之后被调用。
  • create_main_conf: 调用该函数创建本模块位于 http block 的配置信息存储结构。该函数成功的时候,返回创建的配置对象。失败的话,返回 NULL。
  • init_main_conf: 调用该函数初始化本模块位于 http block 的配置信息存储结构。该函数成功的时候,返回 NGX_CONF_OK。失败的话,返回 NGX_CONF_ERROR 或错误字符串。
  • create_srv_conf: 调用该函数创建本模块位于 http server block 的配置信息存储结构,每个 server block 会创建一个。该函数成功的时候,返回创建的配置对象。失败的话,返回 NULL。
  • merge_srv_conf: 因为有些配置指令既可以出现在 http block,也可以出现在 http server block 中。那么遇到这种情况,每个 server 都会有自己存储结构来存储该 server 的配置,但是在这种情况下 http block 中的配置与 server block 中的配置信息发生冲突的时候,就需要调用此函数进行合并,该函数并非必须提供,当预计到绝对不会发生需要合并的情况的时候,就无需提供。当然为了安全起见还是建议提供。该函数执行成功的时候,返回 NGX_CONF_OK。失败的话,返回 NGX_CONF_ERROR 或错误字符串。
  • create_loc_conf: 调用该函数创建本模块位于 location block 的配置信息存储结构。每个在配置中指明的 location 创建一个。该函数执行成功,返回创建的配置对象。失败的话,返回 NULL。
  • merge_loc_conf: 与 merge_srv_conf 类似,这个也是进行配置值合并的地方。该函数成功的时候,返回 NGX_CONF_OK。失败的话,返回 NGX_CONF_ERROR 或错误字符串。

Nginx 里面的配置信息都是上下一层层的嵌套的,对于具体某个 location 的话,对于同一个配置,如果当前层次没有定义,那么就使用上层的配置,否则使用当前层次的配置。

这些配置信息一般默认都应该设为一个未初始化的值,针对这个需求,Nginx 定义了一系列的宏定义来代表各种配置所对应数据类型的未初始化值,如下:

 #define NGX_CONF_UNSET -1
 #define NGX_CONF_UNSET_UINT (ngx_uint_t) -1
 #define NGX_CONF_UNSET_PTR (void *) -1
 #define NGX_CONF_UNSET_SIZE (size_t) -1
 #define NGX_CONF_UNSET_MSEC (ngx_msec_t) -1

又因为对于配置项的合并,逻辑都类似,也就是前面已经说过的,如果在本层次已经配置了,也就是配置项的值已经被读取进来了(那么这些配置项的值就不会等于上面已经定义的那些 UNSET 的值),就使用本层次的值作为定义合并的结果,否则,使用上层的值,如果上层的值也是这些UNSET类的值,那就赋值为默认值,否则就使用上层的值作为合并的结果。对于这样类似的操作,Nginx 定义了一些宏操作来做这些事情,我们来看其中一个的定义。

 #define ngx_conf_merge_uint_value(conf, prev, default) \
 if (conf == NGX_CONF_UNSET_UINT) { \
 conf = (prev == NGX_CONF_UNSET_UINT) ? default : prev; \
 }

显而易见,这个逻辑确实比较简单,所以其它的宏定义也类似,我们就列具其中的一部分吧。

 ngx_conf_merge_value
 ngx_conf_merge_ptr_value
 ngx_conf_merge_uint_value
 ngx_conf_merge_msec_value
 ngx_conf_merge_sec_value

等等。

下面来看一下 hello 模块的模块上下文的定义,加深一下印象。

 static ngx_http_module_t ngx_http_hello_module_ctx = {
 NULL, /* preconfiguration */
 ngx_http_hello_init, /* postconfiguration */
 NULL, /* create main configuration */
 NULL, /* init main configuration */
 NULL, /* create server configuration */
 NULL, /* merge server configuration */
 ngx_http_hello_create_loc_conf, /* create location configuration */
 NULL /* merge location configuration */
 };

注意:这里并没有提供 merge_loc_conf 函数,因为我们这个模块的配置指令已经确定只出现在 NGX_HTTP_LOC_CONF 中这一个层次上,不会发生需要合并的情况。

模块的定义

对于开发一个模块来说,我们都需要定义一个 ngx_module_t 类型的变量来说明这个模块本身的信息,从某种意义上来说,这是这个模块最重要的一个信息,它告诉了 Nginx 这个模块的一些信息,上面定义的配置信息,还有模块上下文信息,都是通过这个结构来告诉 Nginx 系统的,也就是加载模块的上层代码,都需要通过定义的这个结构,来获取这些信息。

我们先来看下 ngx_module_t 的定义

 typedef struct ngx_module_s ngx_module_t;
 struct ngx_module_s {
 ngx_uint_t ctx_index;
 ngx_uint_t index;
 ngx_uint_t spare0;
 ngx_uint_t spare1;
 ngx_uint_t abi_compatibility;
 ngx_uint_t major_version;
 ngx_uint_t minor_version;
 void *ctx;
 ngx_command_t *commands;
 ngx_uint_t type;
 ngx_int_t (*init_master)(ngx_log_t *log);
 ngx_int_t (*init_module)(ngx_cycle_t *cycle);
 ngx_int_t (*init_process)(ngx_cycle_t *cycle);
 ngx_int_t (*init_thread)(ngx_cycle_t *cycle);
 void (*exit_thread)(ngx_cycle_t *cycle);
 void (*exit_process)(ngx_cycle_t *cycle);
 void (*exit_master)(ngx_cycle_t *cycle);
 uintptr_t spare_hook0;
 uintptr_t spare_hook1;
 uintptr_t spare_hook2;
 uintptr_t spare_hook3;
 uintptr_t spare_hook4;
 uintptr_t spare_hook5;
 uintptr_t spare_hook6;
 uintptr_t spare_hook7;
 };
 #define NGX_NUMBER_MAJOR 3
 #define NGX_NUMBER_MINOR 1
 #define NGX_MODULE_V1 0, 0, 0, 0, \
 NGX_DSO_ABI_COMPATIBILITY, NGX_NUMBER_MAJOR, NGX_NUMBER_MINOR
 #define NGX_MODULE_V1_PADDING 0, 0, 0, 0, 0, 0, 0, 0

再看一下 hello 模块的模块定义。

 ngx_module_t ngx_http_hello_module = {
 NGX_MODULE_V1,
 &ngx_http_hello_module_ctx, /* module context */
 ngx_http_hello_commands, /* module directives */
 NGX_HTTP_MODULE, /* module type */
 NULL, /* init master */
 NULL, /* init module */
 NULL, /* init process */
 NULL, /* init thread */
 NULL, /* exit thread */
 NULL, /* exit process */
 NULL, /* exit master */
 NGX_MODULE_V1_PADDING
 };

模块可以提供一些回调函数给 Nginx,当 Nginx 在创建进程线程或者结束进程线程时进行调用。但大多数模块在这些时刻并不需要做什么,所以都简单赋值为 NULL。



Tags:Nginx   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
1. 获取服务器证书文件下载好压缩包,找到Nginx文件夹中的证书。2. 安装服务器证书复制 server.key、server.cer 文件到 Nginx 安装目录下的 conf 目录。打开 Nginx 安装目录...【详细内容】
2020-03-19   Nginx  点击:(5)  评论:(0)  加入收藏
当我们有了一个 VPS 主机以后,为了不浪费 VPS 的强大资源(相比共享主机1000多个站点挤在一台机器上),往往有想让 VPS 做点什么的想法,银子不能白花啊:)。放置多个网站或者博客是...【详细内容】
2020-03-19   Nginx  点击:(12)  评论:(0)  加入收藏
VeryNginx 是一个基于openrestry(其实是基于nginx的lua扩展)的开发程序,实现了高级的防火墙,可以做访问统计和其他的一些防护功能。 VeryNginx 扩展了 Nginx 本身的功能,并提供了友好的 Web 交互界面。...【详细内容】
2020-03-19   Nginx  点击:(4)  评论:(0)  加入收藏
tomcat中的证书配置参数如下:<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" SSLEnabled="true" scheme="https" secure="t...【详细内容】
2020-03-17   Nginx  点击:(6)  评论:(0)  加入收藏
最近在部署自己的网站(racsky.com)时,使用了Nginx的服务反向代理,并且记录了过程与大家分享,相信这篇文章能够帮助到你。Nginx介绍Nginx是一款轻量级、高性能的反向代理Web服务器...【详细内容】
2020-03-17   Nginx  点击:(4)  评论:(0)  加入收藏
《深入理解Java虚拟机》但要想真的深入理解虚拟机一问肯定远远不够的,但是本文中分三部分对JVM有深入的解析。第1章 走近Java第2章 Java内存区域与内存溢出异常第3章 垃圾收...【详细内容】
2020-03-16   Nginx  点击:(6)  评论:(0)  加入收藏
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理...【详细内容】
2020-03-15   Nginx  点击:(5)  评论:(0)  加入收藏
1. 需求将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能; 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访...【详细内容】
2020-03-12   Nginx  点击:(2)  评论:(0)  加入收藏
#日志格式:&#39;$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"&#39;#统计...【详细内容】
2020-03-11   Nginx  点击:(7)  评论:(0)  加入收藏
运行工作结构原理:Nginx监听127.0.0.1:80和127.0.0.1:443Apache监听127.0.0.2:80和127.0.0.2:443HAProxy侦听公用IP地址的端口80和443。 它将HTTP请求从端口80重定向到端口44...【详细内容】
2020-03-08   Nginx  点击:(3)  评论:(0)  加入收藏
说明php有许多开源项目比较好像,在自己的机器上用docker搭建了很多。每个docker都是跑了个apache,每个docker里面都有apache。这样好像有点浪费资源,而平时都是用nginx,所以研究...【详细内容】
2020-03-06   Nginx  点击:(3)  评论:(0)  加入收藏
现在很多人都喜欢用nginx作为Web服务器部署网站,nginx配置起来也是相当的方便,如果你的网站是PHP语言开发的话,下面我们教大家简单的一招快速的隐藏网页的php后缀名,实现一种Pre...【详细内容】
2020-03-05   Nginx  点击:(14)  评论:(0)  加入收藏
VeryNginx 是一个基于openrestry(其实是基于nginx的lua扩展)的开发程序,实现了高级的防火墙,可以做访问统计和其他的一些防护功能。 VeryNginx 扩展了 Nginx 本身的功能,并提供了...【详细内容】
2020-03-01   Nginx  点击:(18)  评论:(0)  加入收藏
一、背景为了避免别人把未备案的域名解析到自己的服务器ip而导致服务器被断网,需要在nginx上设置禁止通过ip访问服务器,只能通过域名访问。 二、解决方法如果网站只配置了...【详细内容】
2020-03-01   Nginx  点击:(16)  评论:(0)  加入收藏
通过配置 Nginx 配置文件,实现正向代理、反向代理、负载均衡、Nginx 缓存、动静分离和高可用 Nginx 6种功能,并对 Nginx 的原理作进一步的解析。当需要使用 Nginx 配置文件时,...【详细内容】
2020-02-28   Nginx  点击:(9)  评论:(0)  加入收藏
环境准备 1.因为Nginx依赖于gcc的编译环境,所以,需要安装编译环境来使Nginx能够编译起来。命令:yum install gcc-c++显示完毕,表示安装完成:2.Nginx的http模块需要使用pcre来解析...【详细内容】
2020-02-27   Nginx  点击:(0)  评论:(0)  加入收藏
在我们的程序应用中经常会有一些配置文件或者是版本文件需要下载,此时如果把这些下载文件放到程序容器中,在文件太大导致下载时间太长或者大量并发下载时可能会影响程序的正常...【详细内容】
2020-02-25   Nginx  点击:(4)  评论:(0)  加入收藏
购买SSL证书要想使用https访问你的网址,首先得拥有颁发的SSL证书。我使用的是免费版,有效期为一年,过期后再重新申请。 申请SSL证书购买后,可在搜索框输入证书关键字进入到控...【详细内容】
2020-02-24   Nginx  点击:(8)  评论:(0)  加入收藏
此脚本是参考nmgxy/klionsec修改而来,重新添加了一些特征,只用来临时救急,还是推荐到ELK或者Splunk中分析Github:https://github.com/al0ne/nginx_log_check 功能 统计Top...【详细内容】
2020-02-24   Nginx  点击:(8)  评论:(0)  加入收藏
对于nginx的惊群问题,我们首先需要理解的是,在nginx启动过程中,master进程会监听配置文件中指定的各个端口,然后master进程就会调用fork()方法创建各个子进程,根据进程的工作原理...【详细内容】
2020-02-24   Nginx  点击:(8)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条