//转载请注明来源:http://blog.csdn.net/tingya
//版权声明:
//本书是《Apache源代码全景分析》的草稿部分,
//读者可以自由浏览和打印
//未经本文允许,不得以任何形式出现在盈利印刷品中,否则将追究法律责任!!!
6.1.2.2Window平台
相比于Unix下的apr_procattr_t结构,Window下的该结构定义要简单一些,它定义在Unix下的进程属性结构定义在srclib\apr\include\arch\win32\apr_arch_threadproc.h中,如下:
struct apr_procattr_t {
apr_pool_t *pool;
/*Part 1*/
apr_file_t *parent_in;
apr_file_t *child_in;
apr_file_t *parent_out;
apr_file_t *child_out;
apr_file_t *parent_err;
apr_file_t *child_err;
/*Part 2*/
char *currdir;
apr_int32_t cmdtype;
apr_int32_t detached;
apr_child_errfn_t *errfn;
apr_int32_t errchk;
/*Part 3*/
HANDLE user_token;
LPSECURITY_ATTRIBUTES sa;
LPVOID sd;
};
Window中该结构包含三方面的内容:
■ 第一部分
该部分与Unix中的功能相同,描述了父进程和子进程之间通信的三个管道文件:一个管道用于从父进程写入数据,从子进程中读出;一个管道用于从子进程写入数据,从父进程中读出;一个管道负责子进程写入错误信息通知父进程。与Unix类似,Window中的管道创建可以使用apr_procattr_io_set统一创建,也可以使用apr_procattr_child_in_set单独创建。apr_procattr_io_set函数实现如下:
APR_DECLARE(apr_status_t) apr_procattr_io_set(apr_procattr_t *attr,
apr_int32_t in,
apr_int32_t out,
apr_int32_t err)
{
apr_status_t stat = APR_SUCCESS;
if (in) {
if (in == APR_CHILD_BLOCK)
in = APR_READ_BLOCK;
else if (in == APR_PARENT_BLOCK) u
in = APR_WRITE_BLOCK;
stat = apr_create_nt_pipe(&attr->child_in, &attr->parent_in, in,
attr->pool);
if (stat == APR_SUCCESS)
stat = apr_file_inherit_unset(attr->parent_in);
}
if (out && stat == APR_SUCCESS) {
stat = apr_create_nt_pipe(&attr->parent_out, &attr->child_out, out,
attr->pool); v
if (stat == APR_SUCCESS)
stat = apr_file_inherit_unset(attr->parent_out);
}
if (err && stat == APR_SUCCESS) {
stat = apr_create_nt_pipe(&attr->parent_err, &attr->child_err, err,
attr->pool); w
if (stat == APR_SUCCESS)
stat = apr_file_inherit_unset(attr->parent_err);
}
return stat;
}
在Window下,管道的创建通过内部函数apr_create_nt_pipe实现,具体的创建细节我们在第七章的”管道章节”会详细描述。不过在Window管道中,
■ 第二部分
■ 第三部分
第三部分的内容是Window所独有的,主要用于Window的安全性。为了了解这几个成员的真实含义,我们必须对Window 的安全性有一定的了解。

用户将访问令牌交给Windows NT系统,并以此获得对对象的访问。当用户登录系统时,Windows NT/2000 将验证他的密码,如果用户验证成功,系统产生一个访问令牌。该用户启动的任何进程都将附加该令牌,访问令牌代表进程的安全环境,它控制了进程与可保护对象(securable object)的交互。当进程访问一个可保护对象时,系统将该对象的访问控制列表(ACL)中的每个访问控制项(ACE)和访问令牌中的 SID 进行比较以确定进程是否可以访问该对象。由于用户启动的任何进程都将附加该用户的访问令牌,因此任何进程都知道用户的 SID 并且可以访问它。
Window中不同的用户登录所产生的访问令牌是不一样的,因此它们的访问权限也不一样。在Window中大部分服务进程都是以本地系统帐户(local system)运行的,这是一个特殊的帐户,所以以本地系统帐户运行的进程和普通进程不同之处在于:
1) 注册表的 HKEY_CURRENT_USER 键是和缺省用户而不是当前用户相联系的,要访问其他用户的配置文件,需要先模拟该用户,然后再访问 HKEY_CURRENT_USER 。
2) 可以打开 HKEY_LOCAL_MACHINE\SECURITY 注册表键
3) 该进程不能访问网络资源,如共享、管道,因为它不能提供信任凭证,而只能使用空连接。 在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters 处的 NullSessionPipes 和 NullSessionShares 的值指明了可以被空连接访问的管道和共享。
或者也可以设置 RestrictNullSessAccess = 0,以允许空连接的用户访问该计算机上的所有管道和共享。(呵呵,这个是个安全隐患哦,可不要干呀。上边两个值最好也全都设成空)
4) 不能和其他程序共享对象,除非在创建对象时设置 DACL 允许用户访问。
5) 如果启动命令行提示符来运行批处理文件,用户可以按 Ctrl+C 来终止批处理的运行,并且用户就获得了一个 Local System 权限的 shell。
正是由于服务程序运行在权限极大的 Local System 账号下,如果网络客户也使用该账号来访问系统将给系统带来安全隐患,因此 NT/2000 提供了模拟功能 --- 服务程序在处理客户请求时使用一个权限较低的客户身份运行,处理完客户请求再恢复。user_token则用于指定模拟的用户。不过Window中并不是直接使用字符串类型来描述账户。由于每一个账户都对应一个访问令牌,因此,window总是使用访问令牌标记模拟的用户。不过APR中提供了从用户名到访问令牌的转换函数apr_procattr_user_set。apr_proc_attr_user_set的实现细节我们在下一章描述。
如果user_token指定,那么在创建进程的时候,APR将使用该模拟用户创建进程。创建的过程我们在进程创建章节描述。
关于作者
张中庆,目前主要的研究方向是嵌入式浏览器,移动中间件以及大规模服务器设计。目前正在进行Apache的源代码分析,计划出版《Apache源代码全景分析》上下册。Apache系列文章为本书的草案部分,对Apache感兴趣的朋友可以通过flydish1234 at sina.com.cn与之联系!
如果你觉得本文不错,请点击文后的“推荐本文”链接!!
分享到:
相关推荐
这个脚本的主要功能是检测当前系统中 Apache 进程的数量,如果数量超过 60 个,则重启 Apache 服务器,以释放系统资源。同时,如果系统中可用内存小于 20%,则清理系统缓存,释放更多的内存资源。 下面我们来详细...
- **多处理模块(MPM)**:决定Apache如何处理客户端请求,包括使用进程或线程模型来处理并发连接。 - **可移植运行库(APR)**:提供一个平台独立的接口,使得Apache能够在多种操作系统上运行。 #### Apache+...
2. **请求处理**:当一个HTTP请求到达时,Apache服务器会通过多路复用(比如`prefork`或`worker`模型)分配给一个进程或线程来处理。这部分源代码会解释如何解析请求头,如何路由请求到正确的虚拟主机,以及如何执行...
8. **性能优化**:优化Apache2涉及调整工作进程模型(如prefork或event),限制并发连接,缓存静态内容,以及使用负载均衡等技术。理解服务器负载和资源消耗对于提供高效服务至关重要。 9. **故障排查**:当遇到...
6. 查看进程和端口连接:手册中提到了使用ps和netstat命令来查看Apache进程和80端口的TCP连接数。这些命令有助于了解Apache服务的运行状态。 7. 分析日志中的异常行为:比如,通过过滤日志来查看特定IP地址在特定...
- **进程间通信**:在多进程模型中,Apache使用管道、信号和共享内存等机制实现进程间的通信与协调。 - **请求处理流程**:Apache接收到请求后,会经历接收、解析、路由、执行模块、响应等步骤,最后返回结果给...
1. 连接管理(监听):Apache监听指定端口的连接请求,一旦有新的连接到来,它会创建一个新的进程或线程来处理该连接。 2. 请求读取:Apache接收并解析HTTP请求,包括请求行、头和数据。 3. 找到表示形式:根据请求...
2. **模块管理**:Apache通过模块化设计来扩展功能,如mod_rewrite用于URL重写,mod_security提升安全性,mod_proxy实现反向代理等。了解如何启用、禁用和配置这些模块至关重要。 3. **日志管理**:理解如何配置...
1. **主程序(Main Program)**:Apache服务器的启动点,通常在`httpd`或`apache2`可执行文件中。这部分代码负责初始化进程环境,加载配置文件,以及创建并管理子进程。 2. **模块系统(Module System)**:Apache...
在 Apache 0.6.5 版本中,守护进程的创建和管理是非常重要的。 知识点4: Apache 生命周期 Apache 生命周期是指 Apache 服务器从启动到关闭的整个过程。在这个过程中,Apache 服务器会经历多个阶段,包括初始化、...
6. **性能优化**:Apache有多种性能优化策略,如使用MPM(多进程模块)如prefork或worker,设置合适的MaxKeepAliveRequests和KeepAliveTimeout,以及开启缓存模块mod_cache等。 7. **HTTPS与SSL/TLS**:在当前网络...
2. **模块管理**:Apache支持许多可选模块,比如mod_rewrite用于URL重写,mod_security提供安全防护,mod_deflate实现内容压缩等。手册会详细介绍如何启用、禁用和配置这些模块。 3. **安全实践**:安全是任何Web...
5. **日志分析**:如何解读Apache的日志文件,以及如何使用工具进行日志分析,以监控服务器状态、发现潜在问题。 6. **多线程与事件模型**:Apache有 prefork 和 worker 两种多进程/多线程模型,手册会介绍它们的优...
在提供的压缩包文件中,`httpd-2.2.22.tar.gz`是Apache2.22的源代码,通过解压这个文件,我们可以看到Apache的整个源代码结构,包括配置文件、核心代码、模块源代码、文档等。开发者可以通过阅读这些源代码来理解...
2. **多线程支持**:除了传统的进程模型外,Apache2.0引入了多线程工作模式,如`worker`和`event`模型,能够更好地利用系统资源,提高并发处理能力。 3. **配置优化**:配置文件结构更加清晰,通过虚拟主机、目录...
2. **配置文件**:Apache的配置主要通过httpd.conf文件进行,其中包含了服务器的基本设置、虚拟主机定义、目录权限等信息。熟练编辑和理解配置文件是管理Apache服务器的关键。 3. **虚拟主机**:Apache支持在同一台...
2. **多线程支持**:通过MPM(Multi-Processing Module)机制,Apache 2.2 支持多线程和多进程模型,提高了并发处理能力。 3. **更好的性能**:相比之前的版本,Apache 2.2 在性能上有所提升,优化了内存使用,降低...
虚拟主机设置部分定义了 Apache 服务器进程中的不同 IP 地址和主机名。在这个部分,我们可以设置虚拟主机的各种参数,如 ServerName、ServerAdmin 和 DocumentRoot 等。 配置文件命名和路径 配置文件的命名和路径...
2. **核心功能**:介绍Apache的核心特性,如多进程模型(MPM)、请求处理机制、模块加载等。 3. **安全设置**:讲解如何配置SSL/TLS以确保网站通信的安全,以及如何设置防火墙规则和权限控制来防止未授权访问。 4....
Apache 启动不了的解决办法 Apache 服务器是一种流行的 Web 服务器软件,然而,在实际应用中,Apache 服务器的启动问题是非常常见的。...Apache 服务器无法启动的解决办法有多种,需要根据具体情况进行分析和解决。