| <?xml version="1.0"?> |
| <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd"> |
| <?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?> |
| <!-- English Revision: 106090:421174 (outdated) --> |
| |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <modulesynopsis metafile="worker.xml.meta"> |
| <name>worker</name> |
| <description>Módulo de MultiProcesamiento que implementa un |
| servidor web híbrido multihebra-multiproceso</description> |
| <status>MPM</status> |
| <sourcefile>worker.c</sourcefile> |
| <identifier>mpm_worker_module</identifier> |
| |
| <summary> |
| <p>Este Módulo de MultiProcesamiento (MPM) implementa un |
| servidor híbrido multiproceso-multihebra. Usando hebras para |
| atender peticiones, el servidor puede servir un mayor número |
| de peticiones con menos recursos de sistema que un servidor basado |
| únicamente en procesos. No obtante, se mantiene casi por |
| completo la estabilidad de un servidor basado en procesos |
| manteniendo la capacidad multiproceso, pudiendo cada proceso tener |
| muchas hebras.</p> |
| |
| <p>Las directivas más importantes que se usan para controlar |
| este MPM son <directive |
| module="mpm_common">ThreadsPerChild</directive>, que controla el |
| número de hebras que tiene cada proceso hijo y <directive |
| module="mpm_common">MaxClients</directive>, que controla el |
| número máximo de hebras que pueden crearse.</p> |
| </summary> |
| <seealso><a href="../bind.html">Especificar las direcciones y los |
| puertos que usa Apache</a></seealso> |
| |
| <section id="how-it-works"><title>Cómo funciona</title> <p>Un |
| solo proceso de control (el padre) es el responsable de crear los |
| procesos hijo. Cada proceso hijo crea un número fijo de |
| hebras del servidor de la forma que se especifica en la directiva |
| <directive module="mpm_common">ThreadsPerChild</directive>, |
| así como una hebra de escucha que escuchará si se |
| producen peticiones y las pasará a una hebra del servidor |
| para que la procese.</p> |
| |
| <p>Apache siempre intenta mantener en reserva cierto número |
| de hebras <dfn>de sobra</dfn> o en espera, que están |
| preparadas para servir peticiones en el momento en que |
| lleguen. Así, los clientes no tienen que esperar a que se |
| creen nuevas hebras o procesos para que sean atendidas sus |
| peticiones. El número de procesos que se crean al principio |
| está determinado por la directiva <directive |
| module="mpm_common">StartServers</directive>. Después durante |
| el funcionamiento del servidor, Apache calcula el número |
| total de hebras en espera entre todos los procesos, y crea o |
| elimina procesos para mantener ese número dentro de los |
| límites especificados en las directivas <directive |
| module="mpm_common">MinSpareThreads</directive> y <directive |
| module="mpm_common">MaxSpareThreads</directive>. Como este proceso |
| está bastante autorregulado, no es muy habitual que sea |
| necesario modificar los valores que estas directivas traen por |
| defecto. El número máximo de clientes que pueden ser |
| servidos simultáneamente (por ejemplo, el número |
| máximo de hebras entre todos los procesos) está |
| determinado por la directiva <directive |
| module="mpm_common">MaxClients</directive>. El número |
| máximo de procesos hijo activos está determinado por el |
| valor especificado en la directiva <directive |
| module="mpm_common">MaxClients</directive> dividido por el valor |
| especificado en la directiva <directive module="mpm_common"> |
| ThreadsPerChild</directive>.</p> |
| |
| <p>Hay dos directivas que establecen límites estrictos al |
| número de procesos hijo activos y al número de hebras |
| del servidor en un proceso hijo, y puede cambiarse solo parando |
| completamente el servidor y volviendo a iniciarlo. La directiva |
| <directive module="mpm_common">ServerLimit </directive> marca el |
| límite estricto de procesos hijo activos posibles, y debe ser |
| mayor o igual al valor de la directiva <directive |
| module="mpm_common">MaxClients</directive> dividido por el valor |
| de la directiva <directive module="mpm_common"> |
| ThreadsPerChild</directive>. El valor de la directiva <directive |
| module="mpm_common">ThreadLimit</directive> es el límite |
| estricto del número de hebras del servidor, y debe ser mayor |
| o igual al valor de la directiva <directive |
| module="mpm_common">ThreadsPerChild</directive>. Si los valores |
| de esas directivas no son los que vienen por defecto, deben |
| aparecer antes que el resto de directivas del módulo |
| <module>worker</module>.</p> |
| |
| <p>Además del conjunto de procesos hijo activos, puede haber |
| otros procesos hijo que están terminando pero en los que al |
| menos una hebra del servidor está todavía tratando una |
| conexión con un cliente. Puede haber hasta <directive |
| module="mpm_common">MaxClients</directive> procesos terminando, |
| aunque el número real de estos procesos que puede esperarse |
| es mucho menor. Este comportamiento puede evitarse desactivando la |
| eliminación individual de procesos hijo, lo que se hace de la |
| siguiente manera:</p> |
| |
| <ul> |
| <li>fijar el valor de la directiva <directive module="mpm_common"> |
| MaxRequestsPerChild</directive> a cero</li> |
| |
| <li>fijar el valor de la directiva <directive |
| module="mpm_common"> MaxSpareThreads</directive> al mismo valor |
| que la directiva <directive |
| module="mpm_common">MaxClients</directive></li> |
| </ul> |
| |
| <p>Una configuración típica del sistema de control de |
| procesos y hebras del módulo de MPM <module>worker</module> |
| prodría ser como sigue:</p> |
| |
| <example> |
| ServerLimit 16<br /> |
| StartServers 2<br /> |
| MaxClients 150<br /> |
| MinSpareThreads 25<br /> |
| MaxSpareThreads 75<br /> |
| ThreadsPerChild 25 |
| </example> |
| |
| <p>Mientras que el proceso padre se inicia con privilegios de |
| usuario <code>root</code> en Unix para usar el puerto de escucha |
| 80, los procesos hijo y las hebras se inician con menores |
| privilegios de usuario. Las directivas <directive |
| module="mpm_common">User</directive> y <directive |
| module="mpm_common">Group</directive> se usan para determinar los |
| privilegios con los que se iniciarán los procesos hijo. Los |
| procesos hijo deben ser capaces de leer los contenidos que van a |
| servir, pero solo los permisos extrictamente necesarios para |
| cumplir su tarea. Además. a menos que se use <a |
| href="../suexec.html">suexec</a>, los privilegios fijados en estas |
| directivas son los que que van a heredar los scripts CGI.</p> |
| |
| <p>La directiva <directive |
| module="mpm_common">MaxRequestsPerChild</directive> controla con |
| qué frecuencia el servidor recicla los procesos eliminando |
| los antiguos y creando nuevos.</p> |
| </section> |
| |
| <directivesynopsis location="mpm_common"><name>AcceptMutex</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>CoreDumpDirectory</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>EnableExceptionHook</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>Group</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>PidFile</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>Listen</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>ListenBacklog</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>LockFile</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>MaxClients</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>MaxMemFree</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>MaxRequestsPerChild</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>MaxSpareThreads</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>MinSpareThreads</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>ScoreBoardFile</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>SendBufferSize</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>ServerLimit</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>StartServers</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>ThreadLimit</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>ThreadsPerChild</name> |
| </directivesynopsis> |
| <directivesynopsis location="mpm_common"><name>User</name> |
| </directivesynopsis> |
| |
| </modulesynopsis> |
| |
| |
| |
| |
| |