Linux下Apache模块开发


环境:Linux RedHat

首先来介绍下apache的一个工具apxs。apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。

安装好Apache服务器后,安装目录的bin目录下包含apxs工具。

模块开发代码 mod_jump_filter.c 如下:

/******************************************************************************
				版权所有 (C),     2018-2019		
******************************************************************************
	文 件 名 : mod_jump_filter.c
	版 本 号 : V1.0
	作    者 : lijd
	生成日期 : 2018年12月07日
	功能描述 : 服务器被访问时获取请求头和请求数据
	修改历史 :
*****************************************************************************/
 #include 
 #include 
 #include 

/*****************************************************************************
    函 数 名 : gethead_handler
    功能描述 : 回掉函数获取请求体请求体
    输入参数 : 无
    输出参数 : 无
    返 回 值 : 无
    作    者 : lijd
    日    期 : 2018年12月07日
******************************************************************************/
 static int gethead_handler(request_rec *r)
 {
 	if (!r->handler) {
 		return DECLINED;
 	}

	char *pInfo1 = NULL;
 	char *pInfo2 = NULL;

 	ap_set_content_type(r, "text/html;charset=ascii");
	
	/* 获取Host头信息 */
 	pInfo1 = apr_table_get(r->headers_in, "Host");
 	printf("Host :%s\n",pInfo1);
	
	/* User-Agent */
 	pInfo2 = apr_table_get(r->headers_in, "User-Agent");
	printf("User-Agent :%s\n",pInfo2);
	
	/* 获取Post请求体数据 */
	apr_bucket_brigade *input_brigade = apr_brigade_create(r->pool, r->connection->bucket_alloc);
	apr_status_t status;

	apr_bucket *bucket;

	status = ap_get_brigade(r->input_filters, input_brigade, AP_MODE_READBYTES, APR_BLOCK_READ, HUGE_STRING_LEN);
	if (status != APR_SUCCESS)
	{
		return HTTP_BAD_REQUEST;
	}
	for (bucket = APR_BRIGADE_FIRST(input_brigade);
         bucket != APR_BRIGADE_SENTINEL(input_brigade);
         bucket = APR_BUCKET_NEXT(bucket))
        {
            const char *data;
            apr_size_t len;
			if (APR_BUCKET_IS_EOS(bucket)) {
                break;
            }
			if (bucket->length == 0) {
                continue;
            }
			status = apr_bucket_read(bucket, &data, &len, APR_BLOCK_READ);
            if (status != APR_SUCCESS) {
                apr_brigade_destroy(input_brigade);
                return HTTP_BAD_REQUEST;
            }
			printf("Body : %s \n",data);
	}
 	return DECLINED;
 }

/*****************************************************************************
    函 数 名 : JumpFilterRegisterHooks
    功能描述 : 注册钩子函数
    输入参数 : 无
    输出参数 : 无
    返 回 值 : 无
    作    者 : lijd
    日    期 : 2018年12月07日
*****************************************************************************/
static void JumpFilterRegisterHooks(apr_pool_t *pool)
 {
 	ap_hook_handler(gethead_handler, NULL, NULL, APR_HOOK_MIDDLE);
 }

/*****************************************************************************
    函 数 名 : jump_filter_module
    功能描述 : 模块注册
    输入参数 : 无
    输出参数 : 无
    返 回 值 : 无
    作    者 : lijd
    日    期 : 2018年12月07日
*****************************************************************************/
 module AP_MODULE_DECLARE_DATA jump_filter_module = {
	STANDARD20_MODULE_STUFF, 	//用于编译后的模块产生版本信息
	NULL, 						/* 创建目录配置结构*/
	NULL, 						/* 合并目录配置结构 */
	NULL, 						/* 创建主机配置结构 */
	NULL, 						/* 合并主机配置结构 */
	NULL, 						/* 为模块配置相关指令 */
	JumpFilterRegisterHooks 	/* 注册模块的钩子函数 */
 };

编译命令:apxs -i -c -a mod_jump_filter.c

运行结果如下:Linux下Apache模块开发_第1张图片

该模块已编译成功并且已被动态加载至Apache运行模块中,查看Apache的配置文件如下:

Linux下Apache模块开发_第2张图片

重启Apache并将其运行至前台(参数为:-X),查看打印信息如下:

Linux下Apache模块开发_第3张图片

这样一来一个简单的apache模块已经开发好了。

你可能感兴趣的:(服务器开发)