<-
Apache HTTP 服务器 2.4 > Apache HTTPD 2.4中的API更新

从2.2开始的Apache HTTP Server 2.4中的API更改

本文档介绍了Apache HTTPD API从2.2版到2.4版的更改,这些更改可能是模块/应用程序开发人员和核心黑客所感兴趣的。从2.4分支的第一个GA版本开始,API的兼容性在2.4分支的生命期内一直保留。( 2.4版的 VERSIONING说明提供了有关API兼容性的更多信息。)

API更改分为两类:全新的API和已扩展或更改的现有API。后者又分为所有更改都是向后兼容的(因此现有模块可以忽略它们),以及可能需要维护人员注意的更改。与从HTTPD 2.0到2.2的过渡一样,现有的模块和应用程序将需要重新编译,并且可能需要引起注意,但是大多数模块和应用程序都不需要进行任何实质性的更新(尽管某些组件和应用程序可以利用API的更改来进行重大改进)。

就本文档而言,API是根据公共头文件拆分的。这些标头本身就是参考文档,可用于通过生成可浏览的HTML参考make docs

支持Apache!

也可以看看

最佳

更改的API

ap_expr(新!)

引入了一种新的API,用于解析和评估布尔表达式和代数表达式,包括提供标准语法和自定义变体。

ap_listen(已更改;向后兼容)

引入了一个新的API,以使httpd子进程能够满足不同的目的。

ap_mpm(已更改)

ap_mpm_run被一个新的mpm钩子代替。也ap_graceful_stop_signalled丢失了, ap_mpm_register_timed_callback是新的。

ap_regex(已更改)

除了现有的regexp包装器之外,ap_rxplus现在还提供了新的更高级别的API 。这提供了编译像Perl样式的表达式s/regexp/replacement/flags 并针对任意字符串执行它们的功能。还添加了对正则表达式反向引用的支持。

ap_slotmem(新!)

为模块分配和管理内存插槽(最常见的是共享内存)引入API。

ap_socache(新!)

用于管理共享对象缓存的API。

心跳(新!)

心跳模块的通用结构

ap_parse_htaccess(已更改)

的功能签名ap_parse_htaccess已更改。apr_table_t现在必须传递允许替代的单个指令中的一个(替代仍然存在)。

http_config(已更改)

http_core(已更改)

httpd(已更改)

http_log(已更改)

http_request(已更改)

如果可能的话,AP_AUTH_INTERNAL_PER_CONF 建议使用来注册所有访问控制挂钩(包括身份验证和授权挂钩)。如果所有模块的访问控制钩都使用此标志注册,则每当服务器处理与初始请求相同的访问控制配置指令集匹配的内部子请求时(这是常见的情况),都可以避免调用访问控制钩另一个时间。

如果您的模块要求使用旧的行为,并且必须使用与初始请求不同的URI对每个子请求执行访问控制检查,即使该URI与相同的访问控制配置指令集匹配,也请使用 AP_AUTH_INTERNAL_PER_URI

mod_auth(新!)

介绍用于authn和authz的新提供程序框架

mod_cache(已更改)

commit_entity()向缓存提供程序接口引入一个功能,允许对缓存进行原子写入。添加一个cache_status() 钩子以报告缓存决策。所有私有结构和功能均被删除。

mod_core(新!)

这引入了低级API来发送任意标头,并公开了用于处理HTTP OPTIONS和TRACE的函数。

mod_cache_disk(已更改)

更改磁盘缓存的磁盘格式以支持原子缓存更新而不进行锁定。主体文件的设备/节点对嵌入在头文件中,从而允许确认头和主体属于彼此。

mod_disk_cache(重命名)

为了与服务器中其他模块的命名保持一致,mod_disk_cache模块已重命名为mod_cache_disk。

mod_request(新!)

的API mod_request,可在需要时使输入数据可用于多个应用程序/处理程序模块,并解析HTML表单数据。

mpm_common(已更改)

计分板(已更改)

ap_get_scoreboard_worker引入了向后兼容版本后,该版本不向后兼容。额外的proxy_balancer支持。儿童状态的东西进行了修改。

util_cookies(新!)

引入了用于管理HTTP Cookies的新API。

util_ldap(已更改)

没有可用的描述

util_mutex(新!)

httpd中APR proc和全局互斥的包装,为底层机制和锁定文件位置提供通用配置。

util_script(已更改)

新: ap_args_to_table

util_time(已更改)

新: ap_recent_ctime_ex

最佳

有关从2.2升级模块的特定信息

记录中

为了利用按模块日志级别的配置,任何调用ap_log_*函数的源文件都应声明其属于哪个模块。如果调用了模块的module_struct foo_module,则可以使用以下代码保持与HTTPD 2.0和2.2的向后兼容性:

#include <http_log.h>

#ifdef APLOG_USE_MODULE
APLOG_USE_MODULE(foo);
#endif

注意:这对于C ++语言模块是绝对必需的。可以跳过C语言模块,尽管这样会破坏没有该模块的文件的特定于日志级别的支持。

ap_log_*函数的参数数量和的定义APLOG_MARK已更改。通常,更改是完全透明的。但是,如果模块将其APLOG_MARK用作自己函数的参数,或者模块调用时ap_log_*未传递 ,则需要进行更改APLOG_MARK。使用包装器的模块ap_log_*通常使用这两种构造。

更改传递APLOG_MARK给其自身函数的代码的最简单方法是定义并使用另一个宏,该宏扩展为那些函数所需的参数,APLOG_MARK 仅应在ap_log_* 直接调用时使用。这样,代码将保持与HTTPD 2.0和2.2的兼容性。

在2.4与早期版本之间,ap_log_*未通过 调用的代码APLOG_MARK必然有所不同,因为2.4需要新的第三个参数 APLOG_MODULE_INDEX

/* code for httpd 2.0/2.2 */
ap_log_perror(file, line, APLOG_ERR, 0, p, "Failed to allocate dynamic lock structure");

/* code for httpd 2.4 */
ap_log_perror(file, line, APLOG_MODULE_INDEX, APLOG_ERR, 0, p, "Failed to allocate dynamic lock structure");

ap_log_*error现在实现为宏。这意味着不再可以#ifdef在的参数列表内使用ap_log_*error,因为这将导致根据C99的不确定行为。

启动后调用时server_rec必须将指针传递给该指针 ap_log_error()。这总是很合适,但是NULL server_rec2.4中的限制比以前的版本还要多。从2.3.12开始,全局变量 ap_server_conf始终可以用作server_rec参数,因为 NULL只有在传递NULL 给时才有效ap_log_error()ap_server_conf 仅在没有更合适的选项时才server_rec 使用。

考虑以下更改以利用新的 APLOG_TRACE1..8日志级别:

模块有时会在其日志消息中添加进程ID和/或线程ID。现在默认情况下会记录这些ID,因此模块可能无需显式记录它们。(用户可以将它们从错误日志格式中删除,但是如果需要进行问题诊断,可以指示他们将其重新添加。)

如果您的模块使用这些现有的API ...

ap_default_type()
不再可用;Content-Type必须显式配置或由应用程序添加。
ap_get_server_name()
如果在URL中使用了返回的服务器名称,请ap_get_server_name_for_url()改用。此新功能处理服务器名称是IPv6文字地址的奇怪情况。
ap_get_server_version()
为了进行记录,在需要详细信息的地方,请使用ap_get_server_description()。生成输出时,应该由ServerTokens配置信息量,请使用 ap_get_server_banner()
ap_graceful_stop_signalled()
替换ap_mpm_query(AP_MPMQ_MPM_STATE)为对状态的调用并检查状态AP_MPMQ_STOPPING
ap_max_daemons_limitap_my_generationap_threads_per_child
分别使用ap_mpm_query()查询代码 AP_MPMQ_MAX_DAEMON_USEDAP_MPMQ_GENERATIONAP_MPMQ_MAX_THREADS
ap_mpm_query()
确保在完成注册钩之后才使用它。否则,作为DSO构建的MPM将没有机会启用对此功能的支持。
ap_requires()
现在,核心服务器为处理Require配置提供了更好的基础 结构。使用来为每个受支持的实体注册一个身份验证提供程序功能 ap_register_auth_provider()。在Require 处理过程中将根据需要调用该函数。(有关详细示例,请咨询捆绑的模块。)
ap_server_conf->process->pool 用户数据
可选的:
  • 如果您的模块使用它来确定正在运行哪个启动挂钩,请使用ap_state_query(AP_SQ_MAIN_STATE)
  • 如果您的模块使用它来维护模块卸载和重新加载期间的数据,请使用 ap_retained_data_create()ap_retained_data_get()
apr_global_mutex_create()apr_proc_mutex_create()
可选:参见ap_mutex_register()ap_global_mutex_create()ap_proc_mutex_create(); 这些允许您使用Mutex指令配置互斥体;您还可以在模块中删除此类互斥锁的任何配置机制
CORE_PRIVATE
现在这是不必要的,可以忽略。
dav_new_error()dav_new_error_tag()
以前,这些工具假定errno包含描述故障的信息。现在,apr_status_t必须提供一个参数。如果没有此类错误信息,则传递0 / APR_SUCCESS,否则传递一个有效值 apr_status_t
mpm_default.hDEFAULT_LOCKFILEDEFAULT_THREAD_LIMITDEFAULT_PIDLOG,等。
头文件和其中设置的大多数默认配置值不再对模块可见。(大多数仍然可以在编译的时候被覆盖。) DEFAULT_PIDLOGDEFAULT_REL_RUNTIMEDIR现在可以通过普遍适用ap_config.h
unixd_config
该名称已重命名为ap_unixd_config。
unixd_setup_child()
它已重命名为ap_unixd_setup_child(),但是大多数调用者应调用添加的ap_run_drop_privileges()挂钩。
conn_rec->remote_ipconn_rec->remote_addr
这些字段已重命名,以便区分连接的客户端IP地址和请求的用户代理IP地址(可能被负载平衡器或代理覆盖)。必须使用适合于模块的以下选项之一来更新对这些字段之一的引用:
  • 当您需要用户代理的IP地址时,可以直接连接到服务器,也可以选择通过透明的负载均衡器或代理将其request_rec->useragent_ip与服务器分开,请使用和 request_rec->useragent_addr
  • 当您需要直接连接到服务器的客户端的IP地址(可能是用户代理,也可能是负载平衡器或代理本身)时,请使用 conn_rec->client_ipconn_rec->client_addr

如果您的模块与此功能接口...

suEXEC
可选:如果模块将错误记录ap_unixd_config.suexec_enabled为0,则还记录新字段的值suexec_disabled_reason,其中包含不可用原因的说明。
计分板上的扩展状态数据
在以前的版本中,ExtendedStatus必须将设置为On,这又需要加载mod_status。在2.4中,只需在预配置挂钩中将设置ap_extended_status1,即可使用扩展状态数据。

你的模块...

解析查询参数
考虑是否ap_args_to_table()会有所帮助。
解析表单数据...
使用ap_parse_form_data()
检查请求标头字段Content-LengthTransfer-Encoding查看是否指定了正文
使用ap_request_has_body()
实现清除指针变量的清理
使用ap_pool_cleanup_set_null()
创建运行时文件,例如共享内存文件,PID文件等。
使用ap_runtime_dir_relative()以便遵循DEFAULT_REL_RUNTIMEDIR编译设置或 DefaultRuntimeDir指令对此类文件位置的全局配置 。 Apache httpd 2.4.2及更高版本。

可用语言: zh 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。