使用Perl来扩展Apache
首先
在本文中,我将讨论被广泛用作强大扩展模块的Apache模块mod_perl。
此次根据某个请求在PHP中设置的会话需要在经过Apache的mod_perl扩展的逻辑中进行会话是否存在的判断。理想情况下,应该在目标网站的PHP中插入会话判断的逻辑,但由于其本来没有以外部公开的规格创建,需要对大量页面逐个进行分析并引入该机制,同时还需要相当长的时间进行操作确认。因此,考虑到在到达内容之前在Apache中执行这种方法既可靠又简单,同时能够节省时间成本,因此采用了本种方式。
1. 检查用户访问的IP地址。如果用户来自受信任的网络,则返回[200 OK];否则,检查会话。
2. 从数据库中提取会话信息,并将其转换为Perl可反序列化和读取的状态,因为它是由PHP存储的会话。
3. 如果会话信息正确,则返回[200 OK];如果会话信息不正确,则使用[302 redirect]将其重定向到登录页面。
除了错误处理之外,还有在发生错误时发送电子邮件的处理。另外,为了避免电子邮件的拥堵,还实现了通过读取标志文件,在上一次错误发送时间的一小时内不发送电子邮件的机制。作为一名基础设施工程师,我认为与电子邮件传递等故障排除的时间有所贡献的逻辑部分是与主要程序一样重要的逻辑。
关于程序的详细内容将在下次及以后的文章中详述。
mod_perl是一个在Apache Web服务器上运行的模块,可以让Perl脚本在服务器端直接解释和执行。
這是一個內建的解釋器,用於在Apache上運行Perl程序。
在Apache上,有一些模塊可以運行各種腳本語言,但根據使用情況而定,這個模塊具有豐富的可鉤住階段(※後述)以及可以嵌入到Apache中的豐富庫。此外,它還具有CGI的行為,每次調用時不需要編譯,而是在編譯的狀態下保留在內存中,這樣可以高效運行。因此,我認為它是最有潛力的模塊,可以充分利用。
关于hook
Apache的主要部分是由大约25,000行的C语言编写的代码。在Apache请求处理的每个阶段都存在称为“钩子点”的模块的介入余地,通过将处理注册到每个钩子点,可以在Apache的每个阶段执行Perl、Python等程序。然而,要确定可以在哪个钩子点注册处理取决于目标模块(如mod_perl,mod_lua等),因此需要注意。
以下是根据Apache请求处理流程,在mod_perl中可以挂钩的12个挂钩点的详细说明。
1. 请求阅读更新
这个阶段是在分析头部后首先被调用的。在这个钩子点上,在将每个阶段传递之前进行初始化等处理非常有用。如果加载Apache::StatINC模块,则可以检测到Perl文件的差异并在有更新时自动加载。
2.转变了他原先的想法和观点。
这是将URI与实际文件关联的阶段。
作为Apache的一个强大功能之一,可以灵活地细分改变URI。通过在此处设置钩子点,可以通过模块来更改URI。
在这个阶段,常常使用mod_rewrite等模块作为URL转换模块。
3. 映射到存储
处理已连接文件中设置的类似于Directory或Files的配置指令的阶段。同时,.htaccess文件的内容也会在此阶段进行解释。设置这些钩子点的模块相对较少。
4.标题解析器
检查请求头并在操作头信息的阶段。在这个实现中,可以通过在这里定义处理来扩展和适应除了GET、HEAD、POST等标准方法之外的实现。
5.进入
这个阶段通常与两个后续处理过程配套,被广泛地称为AAA(访问控制、认证、访问权限)。这个阶段主要用于控制访问,不包括使用基本认证的用户ID。例如,检查IP限制、请求的访问日期等,并设置与处理结果相关的状态码。我们创建的逻辑是使用perl来判断会话并返回状态码的逻辑,因此我们将其挂钩在这个阶段。
6. 鉴真
这是一个使用用户ID进行认证的阶段。它负责处理基本认证和摘要认证等处理。通过挑战/响应方式,使用“Authorization Required”要求用户进行认证。用户需要附加“Authorization”字段并重新发送响应。还可以使用智能卡和数字证书等其他认证方法。
7. 权限授权
在这个阶段,根据输入在Authen阶段中提供的信息来判断用户是否被允许访问所尝试访问的资源。
8. 输入
在这个阶段,将执行判断请求文档的MIME类型和文档类型的处理。判断主要通过文件名的扩展名来进行。通过mod_mime模块将mime.type文件中存储的信息与AddTYPE和AddEncoding目录中的信息进行组合,进行MIME类型/文档类型的映射。
修复 (xiū fù)
在调用内容处理程序之前,此阶段旨在为模块提供微调机会。mod_env在此阶段用于向CGI和SSI页面传递环境变量。
10.回应
在这个阶段,将执行创建响应的处理。可以说,这个处理是最重要的阶段。许多在CPAN注册的与Apache相关的模块都专注于这个阶段,如动态内容创建和内容修改等。
11.记录
在这个阶段,可以通过各种方式将上述阶段积累的状态码信息以及服务器发送给用户的字节数等访问相关信息导出。例如,可以导出到文件或数据库等。在这个阶段,可以灵活地定制日志的格式。
12. 清理
在Apache中,没有清理阶段,而是只存在于mod_perl的内部。这个过程利用了C API提供的内存池在被破坏之前调用的回调函数。在这个阶段中,用于关闭数据库连接和关闭文件等。
关于挂钩点的种类
每个挂钩点可以分为以下三种类型。
无效
无论返回码如何,都将执行所有已注册的钩子点处理。预期所有注册为void类型的钩子点处理都会返回OK。
-
- 該当のフックポイント(上記記載内)
なし
先跑
根据注册顺序执行钩子点处理。只要每个钩子点处理的返回代码不是DECLINED,就按顺序执行。如果返回了DECLINED,则中断该钩子点处理并转到下一个钩子点。
-
- 該当のフックポイント(上記記載内)
Trans
MapToStorage
Authen
Authz
Type
Response
全力运行
按照已注册的顺序执行钩子点处理。如果每个钩子点的处理返回的值不是OK或DECLINED,则中断该钩子点的处理并转移到下一个钩子点。
-
- 該当のフックポイント(上記記載内)
PostReadRequest
HeaderParser
Access
Fixup
Log
Cleanup
結論
mod_perl是一个非常强大的模块,可以扩展Apache,在实现上可以实现负载均衡和排除恶意用户等各种功能。
关于mod_perl的实现,以下页面提供了文档和丰富的示例,对创建非常有用。
明天是@a_tamura先生。请多关照。