nginx的http模块开发--一个验证url参数的例子

简介:

本文开发一个nginx http模块基本的开发步骤和前篇http://www.cnblogs.com/yjf512/archive/2013/06/10/3130890.html 说的一样,按照开发的六个步骤写。

配置文件及功能

该模块的功能是验证请求url中的secret参数的值是否是约定的秘钥。

它的nginx配置文件是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
worker_processes  1;
 
error_log  logs/error.log debug;
master_process off;
daemon off;
 
events {
     worker_connections  1024;
}
 
 
http {
     default_type  application/octet-stream;
 
     sendfile        on;
 
     keepalive_timeout  65;
 
     server {
         listen       8001;
         server_name  localhost;
 
         access_log  /tmp/access.log;
         error_log   /tmp/error.log debug;
 
         location / {
             root   html;
             index  index.html index.htm;
         }
 
         error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
         }
 
         location = /mysecert {
             # 只有传递的secret参数值为secretpassword的时候才通过验证
             # 1 通过验证页面显示“secret right”
             # 2 不通过验证页面显示“secret wrong”
             # 比如
             # http: //abc.com:8001?secret=secretpassword通过
             # http: //abc.com:8001?secret=123不通过
             mysecret secretpassword;
         }
     }
 
}

 

location为/mysecret的时候,需要传递值为secretpassword的mysecret参数。页面会返回200并显示secret right,否则页面返回200并显示secret wrong。

配置文件这里有几个地方注意下:

为了调试方便,调整了几个地方:

1
2
3
4
5
6
worker_processes  1;
master_process off;
daemon off;
access_log  /tmp/access.log;
error_log   /tmp/error.log debug;

而且在configure的时候我也加上了--with-debug参数

1
./configure --add-module=/home/yejianfeng/nginx/nginx_module/mysecret2/ --prefix=/home/yejianfeng/nginx/nginx/ --with-debug

这样让调试更加方便

具体代码

完整的代码可以看:https://github.com/jianfengye/MyWorks/tree/master/nginx_module_mysecret

有几个地方要说明:

1 这个模块由于有从配置文件中读取的信息,所以它是有属于自己模块的配置文件结构的

1
2
3
4
5
typedef struct {
 
      ngx_str_t secret;
 
} ngx_http_mysecret_conf_t;

所以有自己的配置文件,那么在模块构造模块上下文的时候create_loc_conf的阶段就多一个功能是初始化配置文件结构

// 定义上下文, 只会在location中出现,所以都为null

static ngx_http_module_t ngx_http_mysecret_module_ctx = {

     NULL,

     NULL,

     NULL,

     NULL,

     NULL,

     NULL,

     ngx_http_mysecret_create_loc_conf,  //这里有使用自己的配置结构

     NULL

};

其中ngx_http_mysecret_create_loc_conf只要做的事情是初始化配置文件

2 如何将配置文件nginx.conf中的mysecret的一个参数放在配置文件结构中呢?

在ngx_http_mysecret这个命令回调函数中,有个ngx_conf_set_str_slot,这个是nginx预设的14个读取配置文件的函数之一,调用它就可以把nginx.conf中的secrect秘钥读取到配置文件结构中了。

3 在handler中怎么获取配置文件结构呢?

现在读取配置文件结束了,也构造了配置文件结构,到具体的处理http请求的阶段,如何获取这个结构呢?

1
2
3
ngx_http_mysecret_conf_t *mycf;
 
mycf = ngx_http_get_module_loc_conf(r, ngx_http_mysecret_module);

使用这个方法就能在handler中获取到自定义的配置文件结构了。

获取配置结构后,后面的问题就是如何获取请求参数呢

ngx_http_request_t中的args参数就是获取请求参数的

比如http://abc.com?a=s&b=2 那么args就是ngx_string("a=s&b=2")

后面就可以使用nginx自定义的ngx_strncasecmp进行字符比较等操作了。

好了,完整的一个验证请求参数的模块就写完了。

模块变种

有人会对nginx.conf文件有点不舒服,可能希望设置验证秘钥是分为两个步骤:

设置秘钥和验证秘钥

即配置文件大致变成现在的样子:

1
2
3
4
5
6
7
8
9
10
location = /mysecert {
             # 只有传递的secret参数值为secretpassword的时候才通过验证
             # 1 通过验证页面显示“secret right”
             # 2 不通过验证页面显示“secret wrong”
             # 比如
             # http: //abc.com:8001?secret=secretpassword通过
             # http: //abc.com:8001?secret=123不通过
             setmysecret secretpassword;
             checksecret;
  }

原来的mysecret被两个命令setmysecret和checksecret替换了

这两个命令的功能其实是不一样的,setmysecret只是读取配置文件,并不会对请求做任何操作,而checksecret是直接修改请求的。

其实上一个例子稍微改一改就可以达到这样的目的:

https://github.com/jianfengye/MyWorks/tree/master/nginx_module_mysecret2

定义模块命令的结构就变成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static  ngx_command_t ngx_http_mysecret_commands[] = {
      {
           ngx_string( "setmysecret" ),
           NGX_HTTP_LOC_CONF | NGX_CONF_TAKE1,
           ngx_conf_set_str_slot,
           NGX_HTTP_LOC_CONF_OFFSET,
           offsetof(ngx_http_mysecret_conf_t, secret),
           NULL,
      },
      {
           ngx_string( "checksecret" ),
           NGX_HTTP_LOC_CONF | NGX_CONF_NOARGS,
           ngx_http_mysecret,
           NGX_HTTP_LOC_CONF_OFFSET,
           0,
           NULL,
      },
 
      ngx_null_command
};

这里的setmysecret直接使用nginx预设的ngx_conf_set_str_slot方法,它就不需要有任何定义handler的操作了。事实上,nginx很多模块的像setmysecret这样的读取配置文件的命令(不做任何http请求的操作)都是直接使用nginx预设的14种方法的。具体的使用在《深入理解Nginx》第四章中有详细说明了。

自然在checksecret命令中就不需要再读取参数了(也没有参数了,所以要注意这个命令中的命令类型要设置上NGX_CONF_NOARGS)




本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2013/06/13/3133569.html,如需转载请自行联系原作者

相关文章
|
4月前
|
安全 应用服务中间件 Linux
Debian操作系统如何安装Nginx并开启HTTP2
本指南介绍了在Linux系统中通过源码编译安装Nginx的完整流程。首先更新软件包列表并安装必要的编译依赖,接着下载指定版本的Nginx源码包(如1.24.0),检查文件完整性后解压。随后通过配置脚本指定安装路径与模块(如HTTP SSL模块),执行编译和安装命令。最后创建软链接以便全局调用,并提供启动、停止及重载Nginx的命令,同时提醒注意安全组设置以确保正常访问。
|
5月前
|
域名解析 网络协议 网络安全
SSL证书验证全攻略:DNS/HTTP/手动解析怎么选?
SSL证书在网络安全中至关重要,1Panel提供三种验证方式:DNS验证、HTTP验证和手动解析。DNS验证便捷,适合CDN网站;HTTP验证快速,需服务器在线;手动解析灵活,但操作复杂。根据需求选择合适确认方式,定期检查证书状态。
622 2
|
7月前
|
API Kotlin
动态URL构建与HTTP请求的Kotlin实现
动态URL构建与HTTP请求的Kotlin实现
|
9月前
|
缓存 负载均衡 应用服务中间件
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇
通过使用Nginx的反向代理功能,可以有效地提高Web应用的性能、安全性和可扩展性。配置过程中需要注意不同场景下的具体需求,如负载均衡、SSL终止和缓存策略等。正确配置和优化Nginx反向代理可以显著提升系统的整体表现。
1366 20
|
9月前
|
存储 应用服务中间件 Linux
nginx配置证书和私钥进行SSL通信验证
nginx配置证书和私钥进行SSL通信验证
410 4
|
10月前
|
应用服务中间件 Linux 网络安全
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
3028 8
|
11月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
12月前
url重写重定向所有http网址到https网址
url重写重定向所有http网址到https网址
138 4
|
12月前
|
关系型数据库 MySQL 数据库
vertx 的http服务表单提交与mysql验证
本文介绍了如何使用Vert.x处理HTTP服务中的表单提交,并通过集成MySQL数据库进行验证,包括项目依赖配置、表单HTML代码和完整的Vert.x服务代码。
104 2
|
12月前
|
安全 Java 程序员
【HTTP】认识 URL 和 URL encode
【HTTP】认识 URL 和 URL encode
157 0