常用配置
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
};
评论前必须登录!
注册