首页 »web服务器 » 创建长效机制:Apache中预创建Preforking MPM机制剖析( 2) »正文
创建长效机制:Apache中预创建Preforking MPM机制剖析( 2)
来源: 发布时间:星期三, 2009年9月2日 浏览:4次 评论:0
6.3.3.3主服务进程管理6.3.3.3.1主服务进程概述所有 ![](/icons/75227de.gif) MPM都是从ap_mpm_run ![](/icons/75227kh.gif) ![](/icons/75227hanshu.gif) 开始执行 ![](/icons/75227dou.gif) 对此预创建MPM也不例外 ![](/icons/75227dou2.gif) ap_mpm_run ![](/icons/75227kh.gif) ![](/icons/75227hanshu.gif) 通常由 代码 6.3.3.3.2主服务进程概述 ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s){ index; re ing_children_to_start; apr_status_t rv; ap_log_pid(pconf, ap_pid_fname);对于所有 ![](/icons/75227de.gif) Apache MPM而言 ![](/icons/75227dou.gif) 其应该首先完成 ![](/icons/75227de.gif) 工作就是在文件pidfile中记录进程 ![](/icons/75227de.gif) ID ![](/icons/75227dou2.gif) ![](/icons/75227yinwei.gif) 启动和终止Apache ![](/icons/75227de.gif) 默认脚本通常会读取pidfile文件 ![](/icons/75227dou.gif) 从中查找所有记录 ![](/icons/75227de.gif) 进程然后逐个终止它 ![](/icons/75227dou2.gif) 因此如果不进行记录 ![](/icons/75227de.gif) 话 ![](/icons/75227dou.gif) 启动 ![](/icons/75227de.gif) 这些进程可能无法通过脚本进行终止 ![](/icons/75227dou.gif) 这项操作进行 ![](/icons/75227de.gif) 越快越好 first_server_limit= server_limit; (changed_limit_at_restart) { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, "WARNING: Attempt to change ServerLimit " "ignored during restart"); changed_limit_at_restart = 0; }理解上面这段代码 ![](/icons/75227de.gif) 关键在于理解两个变量first_server_limit和changed_limit_at_restart ![](/icons/75227de.gif) 作用 ![](/icons/75227dou2.gif) server_limit变量用以记录服务器内允许同时存在 ![](/icons/75227de.gif) 子服务进程 ![](/icons/75227de.gif) 数目 ![](/icons/75227dou.gif) 用过通过配置文件中 ![](/icons/75227de.gif) ServerLimit指令可以修改这个值 ![](/icons/75227dou2.gif) 当每次Apache启动 ![](/icons/75227de.gif) 时候 ![](/icons/75227dou.gif) 通过读取配置文件这个指令 ![](/icons/75227de.gif) 参数值最终保存到了server_limit变量中并影响服务器 ![](/icons/75227de.gif) 进程产生 ![](/icons/75227dou2.gif) 由于当Apache重新启动(restart) ![](/icons/75227de.gif) 时候也会读取配置文件 ![](/icons/75227dou.gif) 因此如果服务器重新启动的前修改了配置文件中 ![](/icons/75227de.gif) ServerLimit指令参数 ![](/icons/75227dou.gif) 那么毫无疑问 ![](/icons/75227dou.gif) 这种变化Apache重启 ![](/icons/75227de.gif) 时候肯定会看到 ![](/icons/75227de.gif) ![](/icons/75227dou2.gif) 那么Apache该如何处理这种变化呢?是使用新 ![](/icons/75227de.gif) server_limit还是使用原有 ![](/icons/75227de.gif) server_limit?Apache ![](/icons/75227de.gif) 做法是不允许在重启 ![](/icons/75227de.gif) 时候修改server_limit值 ![](/icons/75227dou.gif) 即使你修改了Apache也会忽略 ![](/icons/75227dou2.gif) 为了能够检查出这种修改 ![](/icons/75227dou.gif) 在Apache第 ![](/icons/75227yi.gif) 次启动 ![](/icons/75227de.gif) 时候 ![](/icons/75227dou.gif) ServerLimit ![](/icons/75227de.gif) 值就被记录在 first_server_limit变量中 ![](/icons/75227dou.gif) 在整个Apache运行期间即使重新启动 ![](/icons/75227dou.gif) 这个值也不会变化 ![](/icons/75227dou2.gif) first_server_limit=server_limit就是保存 ![](/icons/75227chushi.gif) ![](/icons/75227de.gif) 值 ![](/icons/75227dou2.gif) 按正常 ![](/icons/75227de.gif) 处理策略 ![](/icons/75227dou.gif) 对于每次重启后都应该把server_limit和first_server_limit ![](/icons/75227de.gif) 值进行比较判断是否发生变化 ![](/icons/75227dou.gif) 如果发生变化就给出警告 ![](/icons/75227dou.gif) 但是上面 ![](/icons/75227de.gif) 代码中并没有这种比较 ![](/icons/75227dou2.gif) 那么比较在哪儿发生 ![](/icons/75227de.gif) 呢?钥匙在 change_limit_at_restart变量上 ![](/icons/75227dou2.gif) 当重新启动后读取配置文件 ![](/icons/75227de.gif) 时候 ![](/icons/75227dou.gif) 遇到ServerLimit指令会 ![](/icons/75227diaoyong.gif) ![](/icons/75227set.gif) _server_limit处理该指令 ![](/icons/75227dou.gif) 该 ![](/icons/75227hanshu.gif) 中会将指令参数后面 ![](/icons/75227de.gif) 值和first_server_limit进行比较: tmp_server_limit; tmp_server_limit = atoi(arg);//ServerLimit指令后 ![](/icons/75227de.gif) 参数值 (first_server_limit &&tmp_server_limit != server_limit) { changed_limit_at_restart = 1; NULL; } server_limit = tmp_server_limit;从上面 ![](/icons/75227de.gif) 代码中可以看出 ![](/icons/75227dou.gif) changed_limit_at_restart反映了ServerLimit在重启期间是否发生了更改 ![](/icons/75227dou2.gif) 对于这种更改 ![](/icons/75227dou.gif) Apache并不理会 ![](/icons/75227dou.gif) 只是简单 ![](/icons/75227de.gif) 警告 ![](/icons/75227dou.gif) 并将changed_limit_at_restart设置为零 ![](/icons/75227dou.gif) 这样下次重启就不要进行判断了 /* Initialize cross-process accept lock */ ap_lock_fname = apr_pspr f(_pconf, "%s.%" APR_PID_T_FMT, ap_server_root_relative(_pconf, ap_lock_fname), ap_my_pid); rv = apr_proc_mutex_create(&accept_mutex, ap_lock_fname, ap_accept_lock_mech, _pconf); (rv != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, "Couldn't create accept lock (%s) (%d)", ap_lock_fname, ap_accept_lock_mech); mpm_state = AP_MPMQ_STOPPING; 1; } # APR_USE_SYSVSEM_SERIALIZE (ap_accept_lock_mech APR_LOCK_DEFAULT || ap_accept_lock_mech APR_LOCK_SYSVSEM) {# (ap_accept_lock_mech APR_LOCK_SYSVSEM) {#end rv = unixd_ _proc_mutex_perms(accept_mutex); (rv != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, "Couldn't permissions _disibledevent=> "check User and Group directives"); mpm_state = AP_MPMQ_STOPPING; 1; } }
相关文章
读者评论
发表评论
|
|