nginx里ngx_http_compile_complex_value和ngx_http_complex_value的初步使用

        location /wyx {
             sean 1 2 3 4 $arg_keyA;
        }

以上面的配置块为例,我们要在nginx运行时获取内置变量$arg_keyA的值,$arg_keyA内置变量表示在http的get请求时的参数名为keyA的参数,比如请求http://127.0.0.1:8881/wyx?keyA=42,我们要通过ngx_http_compile_complex_value和ngx_http_complex_value来获取keyA的值42。

我们可以这样来做,首先我们在配置阶段使用ngx_http_compile_complex_value来关联(编译)我们需要的变量

//获取复杂的值,就是带变量的值
static void ngx_sean_compile_complex_value_test(ngx_conf_t *cf, ngx_sean_conf_t* sean_cf)
{
	//sean 1 2 3 4 $arg_keyA;   这里取变量$arg_keyA
	ngx_str_t                         *value;

	//args是一个数组,他保存了配指令的名字及参数,这里就是sean 1 2 3 4 $arg_keyA
	value = (ngx_str_t*)cf->args->elts;   

	if(cf->args->nelts>=5)
	{
		ngx_http_compile_complex_value_t   ccv;
		ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
		
		ccv.cf = cf;
		
		//value[5]既是$arg_keyA
		ccv.value = &value[5];
		ccv.complex_value = &sean_cf->complex_value;

		//编译$arg_keyA
		if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {

			ngx_log_error(NGX_LOG_ALERT, cf->log, 0
					, "ngx_http_compile_complex_value error");

			return;
			//return NGX_CONF_ERROR;
		}
	}

	ngx_log_error(NGX_LOG_ALERT, cf->log, 0
			, "ngx_sean_compile_complex_value_test cf->args->nelts %d", cf->args->nelts);
	
}

这里我是在配置阶段的ngx_sean_block函数里处理的,

static ngx_command_t  ngx_sean_commands[] = {

    { ngx_string("sean"),         //               name
      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE4|NGX_CONF_TAKE5,   //type NGX_CONF_NOARGS 标识后面不带参数 NGX_CONF_TAKE4 标识后面可以带4个参数
      ngx_sean_block,             //  char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
      NGX_HTTP_LOC_CONF_OFFSET,                       //   conf
      0,                          //   offset 
      NULL },                     //   post

     ngx_null_command
};

当请求http://127.0.0.1:8881/wyx?keyA=42到来时,我们来获取这个参数的值

static void ngx_sean_complex_value_test(ngx_http_request_t *r, ngx_sean_conf_t* sean_cf)
{
	ngx_str_t keyA;
	//sean_cf->complex_value是我们上面ngx_http_compile_complex_value编译处理好的结果
	//ngx_http_complex_value的结果会保存到ngx_str_t keyA里
	if (ngx_http_complex_value(r, &sean_cf->complex_value, &keyA) != NGX_OK) {
		return;
		//return NGX_HTTP_INTERNAL_SERVER_ERROR;
	}

	ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0
		, "ngx_sean_complex_value_test complex_value %V, sean_cf %p", &keyA, sean_cf);
}

运行得到结果

2021/11/03 16:54:23 [alert] 11804#0: *1 ngx_sean_complex_value_test keyA 42, sean_cf 0000560AF31E6FD8, client: 127.0.0.1, server: localhost, request: "GET /wyx?key=42 HTTP/1.1", host: "127.0.0.1:8881"

这时你可能有个疑问,上面的通过ccv.value = &value[5];来找到这个参数的方式不太友好,这时,有一个比较好的方式来做这个,就是使用自定义变量,如下

location /wyx {
             set $wwyyxx $arg_keyA;
        }

这里的意思是,我们定义一个自定义变量wwyyxx,把第一个参数的值赋给他。这样我们就在模块里定义一下这个自定义变量来取得这个值了,如何在nginx里定义一个自定义变量呢?

请看这篇文章了​​​​​​nginx里使用ngx_http_add_variable和ngx_http_get_indexed_variable来创建自定义变量并使用_wwyyxx26的专栏-CSDN博客

要在 Nginx 中安装 ngx_http_mp4_module 模块,需要按照以下步骤进行操作: 1. 确认 Nginx 是否支持 ngx_http_mp4_module 模块 首先需要确认 Nginx 是否支持 ngx_http_mp4_module 模块,可以使用以下命令查看 Nginx 是否已经编译了该模块: ``` nginx -V 2>&1 | grep -o with-http_mp4_module ``` 如果输出结果为 with-http_mp4_module,则说明 Nginx 已经编译了 ngx_http_mp4_module 模块;如果输出结果为空,则说明 Nginx 没有编译该模块。 2. 下载 ngx_http_mp4_module 模块 如果 Nginx 没有编译 ngx_http_mp4_module 模块,需要下载该模块并添加到 Nginx 中。可以从 Github 上下载该模块,链接为:https://github.com/kaltura/nginx-vod-module。 可以使用以下命令将 ngx_http_mp4_module 模块下载到 /opt 目录下: ``` cd /opt git clone https://github.com/kaltura/nginx-vod-module.git ``` 3. 编译 Nginx 并添加 ngx_http_mp4_module 模块 在编译 Nginx 时需要添加 --add-module=/opt/nginx-vod-module 参数来指定 ngx_http_mp4_module 模块所在的目录,具体命令如下: ``` ./configure --prefix=/usr/local/nginx --add-module=/opt/nginx-vod-module make make install ``` 4. 配置 NginxNginx 的配置文件中添加以下内容,即可使用 ngx_http_mp4_module 模块: ``` location /video/ { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; } ``` 其中,/video/ 是视频文件所在的目录。mp4 是 ngx_http_mp4_module 模块提供的指令,表示该目录下的文件都是 MP4 格式的视频文件。 mp4_buffer_size 和 mp4_max_buffer_size 是 ngx_http_mp4_module 模块提供的两个参数,用于控制视频文件的缓存大小。 5. 重启 Nginx 完成以上步骤后,需要重启 Nginx 使配置生效: ``` nginx -s reload ``` 至此,ngx_http_mp4_module 模块安装完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值