Nginx学习之二-配置项解析及编程实现
- #user nobody;
- worker_processes 1;
- #error_log logs/error.log;
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
- #pid logs/nginx.pid;
- events {
- worker_connections 1024;
- }
- http {
- include mime.types;
- default_type application/octet-stream;
- #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- # '$status $body_bytes_sent "$http_referer" '
- # '"$http_user_agent" "$http_x_forwarded_for"';
- #access_log logs/access.log main;
- sendfile on;
- #tcp_nopush on;
- #keepalive_timeout 0;
- keepalive_timeout 65;
- #gzip on;
- server {
- listen 80;
- server_name localhost;
- #charset koi8-r;
- #access_log logs/host.access.log main;
- location / {
- root html;
- index index.html index.htm;
- }
- #error_page 404 /404.html;
- # redirect server error pages to the static page /50x.html
- #
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
- # proxy the PHP scripts to Apache listening on 127.0.0.1:80
- #
- #location ~ \.php$ {
- # proxy_pass http://127.0.0.1;
- #}
- # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
- #
- #location ~ \.php$ {
- # root html;
- # fastcgi_pass 127.0.0.1:9000;
- # fastcgi_index index.php;
- # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
- # include fastcgi_params;
- #}
- # deny access to .htaccess files, if Apache's document root
- # concurs with nginx's one
- #
- #location ~ /\.ht {
- # deny all;
- #}
- }
- # another virtual host using mix of IP-, name-, and port-based configuration
- #
- #server {
- # listen 8000;
- # listen somename:8080;
- # server_name somename alias another.alias;
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
- # HTTPS server
- #
- #server {
- # listen 443;
- # server_name localhost;
- # ssl on;
- # ssl_certificate cert.pem;
- # ssl_certificate_key cert.key;
- # ssl_session_timeout 5m;
- # ssl_protocols SSLv2 SSLv3 TLSv1;
- # ssl_ciphers HIGH:!aNULL:!MD5;
- # ssl_prefer_server_ciphers on;
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
- }
- #测试配置项2
- location /test2 {
- test_str "hello my dear HUST!";
- test_flag on;
- test_num 10;
- test_size 1000;
- mytest;
- }
- //存储配置项参数的结构体
- typedef struct{
- ngx_str_t arg_str;//保存一个字符串类型的参数
- ngx_int_t arg_num;
- ngx_flag_t arg_flag;
- size_t arg_size;
- ngx_array_t* arg_str_array;
- ngx_array_t* arg_keyval;
- off_t arg_off;
- ngx_msec_t arg_msec;
- time_t arg_sec;
- ngx_bufs_t arg_bufs;
- ngx_uint_t arg_enum_seq;
- ngx_uint_t arg_bitmask;
- ngx_uint_t arg_access;
- ngx_path_t* arg_path;
- }ngx_http_mytest2_loc_conf_t;
- 24 typedef struct {
- 25 ngx_int_t (*preconfiguration)(ngx_conf_t *cf);
- 26 ngx_int_t (*postconfiguration)(ngx_conf_t *cf);
- 27
- 28 void *(*create_main_conf)(ngx_conf_t *cf);
- 29 char *(*init_main_conf)(ngx_conf_t *cf, void *conf);
- 30
- 31 void *(*create_srv_conf)(ngx_conf_t *cf);
- 32 char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);
- 33
- 34 void *(*create_loc_conf)(ngx_conf_t *cf);
- 35 char *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);
- 36 } ngx_http_module_t;
- 78 struct ngx_command_s {
- 79 ngx_str_t name;//配置项名称
- 80 ngx_uint_t type;//决定这个配置项可以在哪些块中出现以及可以携带的参数类型和个数
- 81 char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);//回调方法,可以自己实现也可以使用预设的14个方法
- 82 ngx_uint_t conf;//配置项所处内存的相对偏移量
- 83 ngx_uint_t offset;//当前配置项在整个存储配置项的结构体中的偏移位置
- 84 void *post;//配置项的回调方法
- 85 };
- //设置配置项的解析方式
- static ngx_command_t ngx_http_mytest2_commands[] = {
- {
- //test_str配置项
- ngx_string("test_str"),
- NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
- ngx_conf_set_str_slot,//预设的配置项解析方法
- NGX_HTTP_LOC_CONF_OFFSET,
- offsetof(ngx_http_mytest2_loc_conf_t,arg_str),
- NULL
- },
- {
- //test_flag配置项
- ngx_string("test_flag"),
- NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
- ngx_conf_set_flag_slot,//预设的配置项解析方法
- NGX_HTTP_LOC_CONF_OFFSET,
- offsetof(ngx_http_mytest2_loc_conf_t,arg_flag),
- NULL
- },
- {
- //test_num配置项
- ngx_string("test_num"),
- NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
- ngx_conf_set_num_slot,//预设的配置项解析方法
- NGX_HTTP_LOC_CONF_OFFSET,
- offsetof(ngx_http_mytest2_loc_conf_t,arg_num),
- NULL
- },
- {
- //test_size配置项
- ngx_string("test_size"),
- NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
- ngx_conf_set_size_slot,//预设的配置项解析方法
- NGX_HTTP_LOC_CONF_OFFSET,
- offsetof(ngx_http_mytest2_loc_conf_t,arg_size),
- NULL
- },
- {
- //mytest配置项
- ngx_string("mytest"),
- NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS,
- ngx_http_mytest2,
- NGX_HTTP_LOC_CONF_OFFSET,
- 0,
- NULL
- },
- ngx_null_command
- };
其中自定义的配置项解析方法ngx_http_mytest2:
- //模块的回调方法
- static char *
- ngx_http_mytest2(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
- {
- ngx_http_core_loc_conf_t *clcf;
- clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
- clcf->handler = ngx_http_mytest2_handler;//每当遇到配置项mytest的时候会回调这个方法
- return NGX_CONF_OK;
- }
真正完成处理工作的handler是 ngx_http_mytest2_handler:
- //模块真正完成处理工作的handler
- static ngx_int_t ngx_http_mytest2_handler(ngx_http_request_t *r)
- {
- ngx_http_mytest2_loc_conf_t *elcf;//存储配置项参数的结构体
- elcf = ngx_http_get_module_loc_conf(r,ngx_http_mytest2_module);
- if (!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD | NGX_HTTP_POST))) {
- return NGX_HTTP_NOT_ALLOWED;
- }
- ngx_int_t rc = ngx_http_discard_request_body(r);
- if (rc != NGX_OK) {
- return rc;
- }
- ngx_str_t type = ngx_string("text/plain");
- ngx_str_t str_format = ngx_string("test_str=%V,test_flag=%i,test_num=%i,test_size=%z");
- ngx_str_t test_str = elcf->arg_str;
- ngx_flag_t test_flag = elcf->arg_flag;
- ngx_int_t test_num = elcf->arg_num;
- size_t test_size = elcf->arg_size;
- int data_len = str_format.len + test_str.len + 1;
- r->headers_out.status = NGX_HTTP_OK;
- r->headers_out.content_length_n = data_len;//响应包包体内容长度
- r->headers_out.content_type = type;
- rc = ngx_http_send_header(r);
- if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
- return rc;
- }
- ngx_buf_t *b;
- b = ngx_create_temp_buf(r->pool,data_len);
- if (b == NULL) {
- return NGX_HTTP_INTERNAL_SERVER_ERROR;
- }
- ngx_snprintf(b->pos,data_len,(char *)str_format.data,&test_str,test_flag,test_num,test_size);
- b->last = b->pos + data_len;
- b->last_buf = 1;
- ngx_chain_t out;
- out.buf = b;
- out.next = NULL;
- return ngx_http_output_filter(r, &out);
- }
- ./configure --prefix=/usr/local/nginx --add-module=XX(新模块的config文件以及源码所存放的目录)
- make
- sudo make install
- #编译新模块的makefile文件
- ngx_http_mytest_module.o: ngx_http_mytest_module.c
- gcc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I /home/xiajun/TEST/Nginx/nginx-1.4.1/src/core -I /home/xiajun/TEST/Nginx/nginx-1.4.1/src/event -I /home/xiajun/TEST/Nginx/nginx-1.4.1/src/event/modules -I /home/xiajun/TEST/Nginx/nginx-1.4.1/src/os/unix -I /home/xiajun/TEST/Nginx/nginx-1.4.1/objs -I /home/xiajun/TEST/Nginx/nginx-1.4.1/src/http -I /home/xiajun/TEST/Nginx/nginx-1.4.1/src/http/modules -I /home/xiajun/TEST/Nginx/nginx-1.4.1/src/mail -o ngx_http_mytest_module.o /home/xiajun/TEST/Nginx/nginx-1.4.1/mytest/ngx_http_mytest_module.c
- //Nginx自定义模块实现代码
- //E-Mail:xiajunhust@gmail.com(江南烟雨)
- #include <ngx_config.h>
- #include <ngx_core.h>
- #include <ngx_http.h>
- static ngx_int_t
- ngx_http_mytest2_handler(ngx_http_request_t *r);
- static char *
- ngx_http_mytest2(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
- static void*
- ngx_http_mytest2_create_loc_conf(ngx_conf_t *cf);
- static char*
- ngx_http_mytest2_merge_loc_conf(ngx_conf_t *cf,void *parent,void *child);
- //存储配置项参数的结构体
- typedef struct{
- ngx_str_t arg_str;//保存一个字符串类型的参数
- ngx_int_t arg_num;
- ngx_flag_t arg_flag;
- size_t arg_size;
- ngx_array_t* arg_str_array;
- ngx_array_t* arg_keyval;
- off_t arg_off;
- ngx_msec_t arg_msec;
- time_t arg_sec;
- ngx_bufs_t arg_bufs;
- ngx_uint_t arg_enum_seq;
- ngx_uint_t arg_bitmask;
- ngx_uint_t arg_access;
- ngx_path_t* arg_path;
- }ngx_http_mytest2_loc_conf_t;
- //设置配置项的解析方式
- static ngx_command_t ngx_http_mytest2_commands[] = {
- {
- //test_str配置项
- ngx_string("test_str"),
- NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
- ngx_conf_set_str_slot,//预设的配置项解析方法
- NGX_HTTP_LOC_CONF_OFFSET,
- offsetof(ngx_http_mytest2_loc_conf_t,arg_str),
- NULL
- },
- {
- //test_flag配置项
- ngx_string("test_flag"),
- NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
- ngx_conf_set_flag_slot,//预设的配置项解析方法
- NGX_HTTP_LOC_CONF_OFFSET,
- offsetof(ngx_http_mytest2_loc_conf_t,arg_flag),
- NULL
- },
- {
- //test_num配置项
- ngx_string("test_num"),
- NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
- ngx_conf_set_num_slot,//预设的配置项解析方法
- NGX_HTTP_LOC_CONF_OFFSET,
- offsetof(ngx_http_mytest2_loc_conf_t,arg_num),
- NULL
- },
- {
- //test_size配置项
- ngx_string("test_size"),
- NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1,
- ngx_conf_set_size_slot,//预设的配置项解析方法
- NGX_HTTP_LOC_CONF_OFFSET,
- offsetof(ngx_http_mytest2_loc_conf_t,arg_size),
- NULL
- },
- {
- //mytest配置项
- ngx_string("mytest"),
- NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS,
- ngx_http_mytest2,
- NGX_HTTP_LOC_CONF_OFFSET,
- 0,
- NULL
- },
- ngx_null_command
- };
- //模块上下文定义
- static ngx_http_module_t ngx_http_mytest2_module_ctx = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- ngx_http_mytest2_create_loc_conf,//创建数据结构存储loc级别的配置项的回调方法
- ngx_http_mytest2_merge_loc_conf//合并loc级别的配置项
- };
- //模块定义
- ngx_module_t ngx_http_mytest2_module = {
- NGX_MODULE_V1,
- &ngx_http_mytest2_module_ctx,
- ngx_http_mytest2_commands,
- NGX_HTTP_MODULE,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NGX_MODULE_V1_PADDING
- };
- //模块的回调方法
- static char *
- ngx_http_mytest2(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
- {
- ngx_http_core_loc_conf_t *clcf;
- clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
- clcf->handler = ngx_http_mytest2_handler;
- //ngx_conf_set_str_slot(cf,cmd,conf);//预设的配置项处理方法
- return NGX_CONF_OK;
- }
- //模块真正完成处理工作的handler
- static ngx_int_t ngx_http_mytest2_handler(ngx_http_request_t *r)
- {
- ngx_http_mytest2_loc_conf_t *elcf;//存储配置项参数的结构体
- elcf = ngx_http_get_module_loc_conf(r,ngx_http_mytest2_module);
- if (!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD | NGX_HTTP_POST))) {
- return NGX_HTTP_NOT_ALLOWED;
- }
- ngx_int_t rc = ngx_http_discard_request_body(r);
- if (rc != NGX_OK) {
- return rc;
- }
- ngx_str_t type = ngx_string("text/plain");
- ngx_str_t str_format = ngx_string("test_str=%V,test_flag=%i,test_num=%i,test_size=%z");
- ngx_str_t test_str = elcf->arg_str;
- ngx_flag_t test_flag = elcf->arg_flag;
- ngx_int_t test_num = elcf->arg_num;
- size_t test_size = elcf->arg_size;
- int data_len = str_format.len + test_str.len + 1;
- r->headers_out.status = NGX_HTTP_OK;
- r->headers_out.content_length_n = data_len;//响应包包体内容长度
- r->headers_out.content_type = type;
- rc = ngx_http_send_header(r);
- if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
- return rc;
- }
- ngx_buf_t *b;
- b = ngx_create_temp_buf(r->pool,data_len);
- if (b == NULL) {
- return NGX_HTTP_INTERNAL_SERVER_ERROR;
- }
- ngx_snprintf(b->pos,data_len,(char *)str_format.data,&test_str,test_flag,test_num,test_size);
- b->last = b->pos + data_len;
- b->last_buf = 1;
- ngx_chain_t out;
- out.buf = b;
- out.next = NULL;
- return ngx_http_output_filter(r, &out);
- }
- static void*
- ngx_http_mytest2_create_loc_conf(ngx_conf_t *cf){
- ngx_http_mytest2_loc_conf_t *conf;
- conf = ngx_pcalloc(cf->pool,sizeof(ngx_http_mytest2_loc_conf_t));
- if(NULL == conf){
- return NGX_CONF_ERROR;
- }
- conf->arg_str.len = 0;
- conf->arg_str.data = NULL;
- //注意一下设定必不可少,否则会出错
- conf->arg_flag = NGX_CONF_UNSET;
- conf->arg_num = NGX_CONF_UNSET;
- conf->arg_str_array = NGX_CONF_UNSET_PTR;
- conf->arg_keyval = NULL;
- conf->arg_off = NGX_CONF_UNSET;
- conf->arg_msec = NGX_CONF_UNSET_MSEC;
- conf->arg_sec = NGX_CONF_UNSET;
- conf->arg_size = NGX_CONF_UNSET_SIZE;
- return conf;
- }
- static char*
- ngx_http_mytest2_merge_loc_conf(ngx_conf_t *cf,void *parent,void *child){
- ngx_http_mytest2_loc_conf_t *prev = parent;
- ngx_http_mytest2_loc_conf_t *conf = child;
- ngx_conf_merge_str_value(conf->arg_str,prev->arg_str,"");
- return NGX_CONF_OK;
- }
结果演示:
Nginx学习之二-配置项解析及编程实现的更多相关文章
- 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...
- Nginx学习系列二Linux下Nginx实现负载均衡
关于在本地虚拟机(VMware 14)下安装Linux同时安装Nginx,请参考Nginx学习系列之搭建环境 1.启动Nginx 在Nginx安装成功的前提下,启动Nginx 已root模式登陆(权限 ...
- nodejs学习笔记二:解析express框架项目文件
上一章介绍了如何去创建一个express框架的工程项目,这章介绍一下express框架下的文件和用法解析,上一张我们创建的工程项目结构图如下: models是不属于原工程项目结构,为了实现数据模型后添 ...
- nginx学习(二):初识配置文件
nginx的配置文件默认在nginx安装目录中的conf子目录中,主配置文件为nginx.conf, root@mgmserver conf]# pwd/usr/local/nginx/conf一.配 ...
- Nginx学习笔记二基本配置
1.Nginx的配置文件默认在Nginx程序安装目录的conf二级目录下,主配置文件为nginx.conf.假设您的Nginx安装 在/usr/local/webserver/nginx/目录下,那么 ...
- nginx学习笔记二
一,nginx架构在Linux系统中以daemon(守护进程)的方式在后台运行,后台进程包含一个master进程和多个worker进程(多进程的工作方式) master进程 | 信号 | | ---- ...
- nginx学习(二)——基础概念之异步非阻塞
上面讲了很多关于nginx的进程模型,接下来,我们来看看nginx是如何处理事件的. 有人可能要问了,nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发 ...
- android 学习随笔二十(多媒体编程 )
1.图片处理 加载大图片 图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 * 单色图:每个像素占用1/8个字节* 16色图:每个像素占用1/2个字节* 256色图:每个像素占用1个 ...
- nginx学习笔记(二)
nginx变量 Nginx 变量值容器的生命期是与当前正在处理的请求绑定的,而与 location 无关. 通过 set 指令隐式创建的 Nginx 变量.这些变量我们一般称为"用户自定义变 ...
随机推荐
- Python中def的用法
def定义了一个模块的变量,或者说是类的变量.它本身是一个函数对象.属于对象的函数,就是对象的属性. def func(): return 2print func() # 1func = 5pr ...
- webservice 技术改进
Webservice 技术改进 1.不同系统不同语言之间的交互 基于http协议进行传输,使用REST服务实现WS 2.不同系统相同语言之间的交互 使用RPC(romate process call) ...
- TFS2013团队使用纪要
Team Foundation Server(TFS)是微软推出的团队项目管理工具,主要包含代码版本控制,工作任务分派,持续集成,测试等一系列管理任务. 由于团队之前人数较少,使用的仅有代码版本控制( ...
- linux vi 中s 替换方法
vi/vim 中可以使用 :s 命令来替换字符:s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :n, ...
- Add and Search Word - Data structure design 解答
Question Design a data structure that supports the following two operations: void addWord(word) bool ...
- POJ 2579 Fiber Network(状态压缩+Floyd)
Fiber Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3328 Accepted: 1532 Des ...
- 什么是FastCGI?
什么是FastCGI? PHP的FastCGI使你的所有php应用软件通过mod_fastci运行,而不是mod_phpsusexec.FastCGI应用速度很快 是因为他们持久稳定.不必对每一个请求 ...
- 格而知之6:我所理解的Runtime(1)
基本简介 1.根据官方文档,OC有一个特性:它会尽可能把一些决定从编译时和链接时推迟到运行时才处理,所以这门语言需要的就不只是一个编译器,它还需要一个runtime系统来处理那些已经被编译过的代码. ...
- RehHat enterprise 5.4 安装git
今天想来研究一下git,就自己安装一个试试,没想到遇到各种问题.经过各种百度和google,终于都解决了,现在来总结一下: 1.安装完redhat 5.4,安装gcc编译器的问题:这个gcc编译器需要 ...
- 修改linux共享内存大小
这是实际linux系统显示的实际数据: beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmax 33554432 beijibing@bjb-deskt ...