在Apache2.4和Amazon EC2上进行Apache模块开发
我在 Apache 2.2 盛行的时代开发过 Apache 模块,但自从升级到 2.4 版本以后就没碰过了。所以为了赶上最新进展,我决定从环境的设置开始学起。
Apache模块是用C语言编写的,它利用Apache提供的APR函数集来构建,并可以访问Web服务器的所有功能。(Apache本身就是Apache模块的集合体。)
当然,它不具备脚本语言的轻便性,而需要编译和构建(因此速度较快)。因此,它适用于编写类似于中间件的常见处理,而不是用作Web内容生成的工具。
例如,我曾听说过很久以前 DeNA 公司使用 Apache 模块实现了基于功能机的表情符号转换。另外,我所在的公司也曾经发布了一个名为 mod_ktai 的模块。
这次,我们希望在最终运行时使用AWS,所以我们将在Amazon EC2上建立环境,并尝试运行生成的模板。
假设或者概念的基础
安装Apache 2.4
由于目前无法在yum上安装,因此需要使用wget获取软件源码并进行编译。
参考:源代码下载页面 ⇒ http://httpd.apache.org/download.cgi#apache24
提前安装编译所需要的东西。
$ sudo yum install -y gcc pcre-devel apr-util-devel
② 下载和安装 Apache 2.4
$ wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.10.tar.gz
$ gunzip -c httpd-2.4.10.tar.gz | tar xvf -
$ cd httpd-2.4.10
$ ./configure
$ make
$ sudo make install
确认动作
创建 Apache 模块
这次我们将同时进行操作确认,将原型直接运行一下。
请参考:http://httpd.apache.org/docs/2.4/programs/apxs.html
创建原型
$ /usr/local/apache2/bin/apxs -g -n hoge
-g:这是生成的雏形。
-n:这是模块的名称。
然后文件将被展开如下。
顺便提一下,这个模板与内容处理程序关联,也就是像 PHP 等脚本一样,挂接到 Apache 的生成内容并返回给客户端的阶段上。
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"
/* The sample content handler */
static int hoge_handler(request_rec *r)
{
if (strcmp(r->handler, "hoge")) {
return DECLINED;
}
r->content_type = "text/html";
if (!r->header_only)
ap_rputs("The sample page from mod_hoge.c\n", r);
return OK;
}
static void hoge_register_hooks(apr_pool_t *p)
{
ap_hook_handler(hoge_handler, NULL, NULL, APR_HOOK_MIDDLE);
}
/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA hoge_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 */
NULL, /* table of config file commands */
hoge_register_hooks /* register hooks */
};
进行编译和安装
确认动作
这个模板是一个内容处理器,所以当访问 http://<域名>/hoge 时会启动处理器。
最后
这次,我给出了一个简单的处理器的例子来解释。个人来说,我觉得在目前的”智能手机时代”里,下面的例子可能是一个很好的选择。
-
- フィルター機能を使ってコンテンツ変換
例えば PHP や Rails等 での レスポンスbody を変換する
用途は 多デバイスへの対応
APIサーバ としての共通処理
認証やキャッシュ
フォーマット変換
他にも 高速化 が求められる処理
最近,使用 mod_mruby 可以在 Ruby 中编写 Apache 模块,所以我也考虑尝试一下这个功能。虽然我使用的是 Apache 2.2,但我之前已经写过如何在 Amazon EC2 上安装 mod_mruby 的步骤。