搭好了apache模块的开发环境
经过几个小时的折腾终于把apache module的开发环境搞好了.其实很简单,但是网上很多过时的资料误导性还是很强.很容易上钩的说.
首先把apache源码下载下来,解包.
wget http://apache.freelamp.com/httpd/httpd-2.2.14.tar.gz
tar xzvf httpd-2.2.14.tar.gz
wget http://apache.freelamp.com/httpd/httpd-2.2.14.tar.gz
然后编译安装,指定了路径和启用了so.
./configure --prefix=/home/easy/dev/apache2 --enable-so
make
make install
安装完apache应该就能用.启动下试试
./bin/apachectl start
Oh yeah . It works.
接下来另起一个目录,存放我们的模块源代码:
mkdir source
vim mod_myvar.c
mod_myvar.c 是一个从网上顺手扒拉下来的示范模块.代码如下:
// 加载头文件
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "http_log.h"
#include "ap_config.h"
// 声明模块
module AP_MODULE_DECLARE_DATA myvar_module;
// API hooks
module AP_MODULE_DECLARE_DATA myvar_module =
{
STANDARD20_MODULE_STUFF,
NULL, /* create per-dir config structures */
NULL, /* merge per-dir config structures */
NULL, /* create per-server config structures */
NULL, /* merge per-server config structures */
myvar_cmds, /* table of config file commands */
myvar_register_hooks /* register hooks */
};
// 对应的回调函数和实现
static const command_rec myvar_cmds[] = {
AP_INIT_FLAG( "MyVarEnable", set_myvar_enable, NULL, OR_FILEINFO, "Turn on mod_myvar"),
{NULL}
};
static void myvar_register_hooks(apr_pool_t *p) {
ap_hook_post_read_request( myvar_post_read_request, NULL, NULL, APR_HOOK_MIDDLE );
ap_hook_child_init( myvar_child_init, NULL, NULL, APR_HOOK_MIDDLE );
}
static apr_status_t myvar_cleanup(void *cfgdata) {
// cleanup code here, if needed
return APR_SUCCESS;
}
// 以下是两个回调接口内用到的函数
static void myvar_child_init(apr_pool_t *p, server_rec *s) {
apr_pool_cleanup_register(p, NULL, myvar_cleanup, myvar_cleanup);
}
static int myvar_post_read_request(request_rec *r) {
char myvar[16] = "CAPTAIN WAS HERE";
apr_table_set(r->notes, "myvar", myvar); // PHP: apache_notes
apr_table_set( r->subprocess_env, "myvar", myvar ); // PHP: HTTP_SERVER_VARS
return OK;
}
static const char *set_myvar_enable(cmd_parms *cmd, void *dummy, int arg) {
ap_get_module_config(cmd->server->module_config, &myvar_module);
return NULL;
}
关于模块文件的结构,这里有详细的教程.
然后直接通过apache的bin目录下apxs就可以直接编译并安装module了.
../apache2/bin/apxs -c -i mod_myvar.c
编译完成后,apxs还会自己帮你把so文件复制到apache的moudle目录下.只需要修改httpd.conf加载模块就可以了.
vim apache2/conf/httpd.conf
添加上模块,并激活它
LoadModule myvar_module modules/mod_myvar.so
MyVarEnable On
然后重启apache.graceful木有用,先stop再start
./bin/apachectl stop
./bin/apachectl start
然后就可以从环境变量里边看到myvar的值了.
不过我们还没安装PHP呢.还是装一个吧.php本身也是一个apache module,php的安装过程和上边差异并不大.
下载PHP源代码,解压
wget http://cn2.php.net/get/php-5.3.1.tar.gz/from/cn.php.net/mirror
tar xzvf php-5.3.1.tar.gz
安装PHP的时候也用到了apxs.
cd php-5.3.1
./configure --with-apxs2=/home/easy/dev/apache2/bin/apxs --with-mysql
kao,报错了.原来是没装libxml2,通过apt-get装一个.
sudo apt-get install libxml2-dev
再配置
./configure --with-apxs2=/home/easy/dev/apache2/bin/apxs --with-mysql
安装
make
sudo make install
安装完成后,发现apache的httpd中,php已经自动帮我们加上了
LoadModule php5_module modules/libphp5.so
接下来添加.php文件的handle.这里有个需要注意的地方,之前我们习惯用的addType方式是存在安全问题的.会让apache把ftqq.php.jpg的文件当成php执行.这里改用filesMatch来搞定
SetHandler application/x-httpd-php
然后重启apache,仍然不要graceful.
./bin/apachectl stop
./bin/apachectl start
写一个php
print_r( $_SERVER );
模块已经生效了
Array
(
[myvar] => CAPTAIN WAS HERE
)
今天就先搞到这里.明天看看如何加载其他的lib,时间多的话,再试试编译mod_myvhost.
建议继续学习:
- 在Apache2.2.XX下安装Mod-myvhost模块 (阅读:11818)
- Nginx模块开发入门 (阅读:9997)
- nginx模块开发 (阅读:4707)
- CommonJS 的模块系统,AMD 和 Wrappings, 以及 RequireJS (阅读:4235)
- PHP 模块编写需要注意的一个问题---- php模块及函数名都定义成小写吧 (阅读:3421)
- 使用 Perl 来开发 Nginx 的模块 (阅读:3353)
- FarmVille(美版开心农场)谈架构:所有模块都是一个可降级的服务 (阅读:3336)
- php无法加载pcre.so的解决办法 (阅读:3070)
- mysql 的模块不能安装的解决方法 (阅读:2606)
- Perl的English模块 (阅读:2512)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Easy 来源: 方糖气球
- 标签: 模块
- 发布时间:2010-03-10 16:27:59
- [71] IOS安全–浅谈关于IOS加固的几种方法
- [70] Twitter/微博客的学习摘要
- [65] 如何拿下简短的域名
- [64] android 开发入门
- [63] Go Reflect 性能
- [62] find命令的一点注意事项
- [60] 流程管理与用户研究
- [59] 图书馆的世界纪录
- [59] 读书笔记-壹百度:百度十年千倍的29条法则
- [58] Oracle MTS模式下 进程地址与会话信