Welcome!
致力于分享问题的解决办法

Nginx常见配置及结构体

常用配置

Nginx的配置文件nginx.conf是所有模块的基础,指导所有模块以配置项为核心来提供功能,每个模块都会有自己的配置文件。关于nginx.conf:

1. Nginx的配置文件每一行就是一条命令;

2. 最外层的为核心模块的配置参数(类型:NGX_CORE_MODULE);内部嵌套的为各个子模块的配置;

3. events {} 为事件模块(类型:NGX_EVENT_MODULE);

4. http {} 为HTTP模块 (类型:NGX_HTTP_MODULE);

5. 模块内还会嵌套多层。

例如:

#daemon on;       #守护进程模式
#user  nobody;      #运行的用户和用户组
worker_processes  1;  #worker进程数

#error_log  logs/error.log  error;  #设置日志路径与级别
#pid        logs/nginx.pid;     #指定pid文件

events {
    use epoll;
    worker_connections  1024;   #每个worker能够并发响应的最大请求数
}

http {
    include       mime.types;   #包含其他配置文件
    default_type  application/octet-stream;   #默认文件类型

    sendfile        on;   #开启高效文件传输,sendfile指令指定nginx是否调用sendfile函数
    #tcp_nopush     on;   #调用tcp_cork方法,有助于解决网络堵塞
    
    keepalive_timeout  65;    #超时时长

    #gzip  on;    #是否开启gzip压缩输出

    #nginx必须使用虚拟机来配置站点,每个虚拟主机使用一个server{ }段来配置:
    server {
        #监听端口,可加其他参数,rcvbuf=size,sndbuf=size,ssl等
        listen       8000;      
        server_name  localhost;   #主机名,可以多个;当收到请求时,与首部的server值比较

        #使用各location匹配用户请求的URI
        location / {    #用于设置默认规则,所有规则都匹配不到时,就用该配置
            root   html;  #设置web资源路径,用于指定请求的根文档目录
            index  index.html index.htm;  #定义默认主页,可以跟多个值,自左向右匹配
        }

        location ~* \.(gif|jpg|jpeg)$ {
            #匹配以.gif、.jpg、.jpeg结尾的请求
            ...
        }
        
        #根据HTTP返回状态码重定向页面
        #error_page  404 /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {  
            root   html;
        }
    }
}

rtmp { 
    server {
        listen 1935;    #监听的端口 
        chunk_size 4096;  #设置分块大小
        application live {
            live on;
        }
        application hls {
            live on; 
            hls on; 
            hls_path share/html/hls; 
        } 
        application vod {
            play share/vod;
        }
    } 
} 

Nginx核心结构体ngx_cycle_t解析

Nginx核心的框架代码都是围绕一个结构体ngx_cycle_t展开,无论是master管理进程,还是多个worker工作进程,每个进程都拥有唯一一个ngx_cycle_t结构体。定义如下:

/* ngx_cycle_t 全局变量数据结构 */
struct ngx_cycle_s {
    //保存所有模块配置项的结构体指针,该数组每个成员又是一个指针,这个指针又指向存储指针的数组
    void                  ****conf_ctx; /* 所有模块配置上下文的数组 */
    ngx_pool_t               *pool;     /* 内存池 */
    ngx_log_t                *log;      /* 日志 */
    ngx_log_t                 new_log;
    ngx_uint_t                log_use_stderr;  /* unsigned  log_use_stderr:1; */

    ngx_connection_t        **files;    /* 连接文件 */
    ngx_connection_t         *free_connections; /* 空闲连接 */
    ngx_uint_t                free_connection_n;/* 空闲连接的个数 */
    ngx_queue_t               reusable_connections_queue;/* 可再利用的连接队列 */
    
    ngx_array_t               listening;    /* 监听数组 */
    ngx_array_t               paths;        /* 路径数组 */
    ngx_list_t                open_files;   /* 已打开文件的链表 */
    ngx_list_t                shared_memory;/* 共享内存链表 */

    ngx_uint_t                connection_n; /* 已连接个数 */
    ngx_uint_t                files_n;      /* 已打开文件的个数 */
    ngx_connection_t         *connections;  /* 连接 */
    ngx_event_t              *read_events;  /* 读事件 */
    ngx_event_t              *write_events; /* 写事件 */

    /* old 的 ngx_cycle_t 对象,用于引用前一个 ngx_cycle_t 对象的成员 */
    ngx_cycle_t              *old_cycle;
    ngx_str_t                 conf_file;    /* nginx 配置文件 */
    ngx_str_t                 conf_param;   /* 命令行携带的参数 */
    ngx_str_t                 conf_prefix;  /* nginx 配置文件的路径 */
    ngx_str_t                 prefix;       /* nginx 安装路径 */
    ngx_str_t                 lock_file;    /* 加锁文件 */
    ngx_str_t                 hostname;     /* 主机名 */
};

其中的ngx_array_t listening是动态数组,元素类型是ngx_listening_t,每个都代表着Nginx服务器监听的一个端口以及相关参数,另外ngx_cycle_t结构体中的connections、free_connections等成员是与事件模块强相关的,connections、free_connectionsconnection、read_events和write_events就构成一个连接池,以data成员为next指针串联成单链表(connections指向首部,free_connections指向第一个空闲连接);read_events、write_events根据数组序号就可以与每一个连接对应(都是同样大小的数组)。如下图:

ngx_module_t解析

上篇提到的ngx_module_t是所有模块的接口,已经介绍了模块类型type字段,接下来是ngx_module_t接口定义以及含义如下:

typedef struct ngx_module_s ngx_module_t;
struct ngx_module_s {
    ngx_uint_t            ctx_index;    //每类模块中对应的index
    ngx_uint_t            index;        //在ngx_modules数组里的唯一索引
    char                 *name;         //模块名字
    
    ngx_uint_t            spare0-1;     //spare0、spare1为保留字段
    ...
        
    ngx_uint_t            version;      //Nginx版本
    const char           *signature;    // 模块的二进制兼容性签名
    void                 *ctx;          //每类模块需具体化的上下文
    ngx_command_t        *commands;     // 模块支持的指令
    ngx_uint_t            type;         //模块的类型
    
    //ngx_module_t作为所有模块的通用接口定义的7种回调方法
    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-7;    //暂时没用
};

index字段是所有模块唯一的索引,ctx_index是所有模块在同类模块里的索引,这里具体介绍一下其中的ctx、commands字段;

void *ctx:模块上下文,通常是函数指针表,不同类型的模块具有不同的含义,每一类下的ctx结构是一样的;

例如核心模块类型的上下文接口ngx_core_module_t如下,以配置项解析为基础,提供了creat_conf和init_conf两个回调方法:

typedef struct {
    ngx_str_t   name;   //核心模块名字
    void        *(*create_conf)(ngx_cycle_t *cycle);            //创建存储配置项的数据结构
    char        *(*init_conf)(ngx_cycle_t *cycle, void *conf);  //使用解析出的配置项进行初始化
} ngx_core_module_t;

核心模块类型的上下文接口ngx_event_module_t如下,除了配置解析,有9个事件驱动模块如epoll、select等必须实现其中的ngx_event_actions_t actions接口:

typedef struct {
    ngx_int_t  (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);  //添加事件方法
    ngx_int_t  (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);  //删除事件方法
    ngx_int_t  (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);//启用事件方法
    ngx_int_t  (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);//禁用事件方法
    ngx_int_t  (*add_conn)(ngx_connection_t *c);    //添加连接方法
    ngx_int_t  (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);  //删除连接方法

    ngx_int_t  (*notify)(ngx_event_handler_pt handler); 
    ngx_int_t  (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer,
                                 ngx_uint_t flags);     //处理事件方法,核心

    ngx_int_t  (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);   //初始化事件驱动模块的方法
    void       (*done)(ngx_cycle_t *cycle);     //退出方法
} ngx_event_actions_t;
typedef struct {
    ngx_str_t              *name;   //事件模块的名称
    void                 *(*create_conf)(ngx_cycle_t *cycle);
    char                 *(*init_conf)(ngx_cycle_t *cycle, void *conf);
    ngx_event_actions_t     actions;    //对于事件驱动机制,需要实现的方法
} ngx_event_module_t;

其他不同的模块类型都有不同的上下文接口,比如所有事件模块需要实现的ngx_event_module_t接口和所有http模块需要实现的ngx_http_module_t接口。部分模块类型的ctx上下文如下图所示:

ngx_command_t *commands:模块感兴趣的配置项以及如何处理,数组形式(因为所有模块都是以配置项来定制功能的);例如核心模块ngx_rtmp_module(自行添加)中commands定义如下:

static ngx_command_t  ngx_rtmp_commands[] = {
    { ngx_string("rtmp"),   //指令名称
      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
      ngx_rtmp_block,   //处理方法
      0,
      0,
      NULL },
      ngx_null_command
};

赞(0)
未经允许不得转载:fuRyZ's Blog » Nginx常见配置及结构体

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址