upload apache
[bottlenecks.git] / rubbos / app / apache2 / manual / dso.html.es
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"><head><!--
4         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5               This file is generated from xml source: DO NOT EDIT
6         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7       -->
8 <title>Soporte de Objetos Dinamicos Compartidos (DSO) - Servidor HTTP Apache</title>
9 <link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
10 <link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
11 <link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
12 <link href="./images/favicon.ico" rel="shortcut icon" /></head>
13 <body id="manual-page"><div id="page-header">
14 <p class="menu"><a href="./mod/">Módulos</a> | <a href="./mod/directives.html">Directivas</a> | <a href="./faq/">Preguntas Frecuentes</a> | <a href="./glossary.html">Glosario</a> | <a href="./sitemap.html">Mapa de este sitio web</a></p>
15 <p class="apache">Versión 2.0 del Servidor HTTP Apache</p>
16 <img alt="" src="./images/feather.gif" /></div>
17 <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
18 <div id="path">
19 <a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">Servidor HTTP</a> &gt; <a href="http://httpd.apache.org/docs/">Documentación</a> &gt; <a href="./">Versión 2.0</a></div><div id="page-content"><div id="preamble"><h1>Soporte de Objetos Dinamicos Compartidos (DSO)</h1>
20 <div class="toplang">
21 <p><span>Idiomas disponibles: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
22 <a href="./es/dso.html" title="Español">&nbsp;es&nbsp;</a> |
23 <a href="./fr/dso.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
24 <a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
25 <a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
26 <a href="./tr/dso.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
27 </div>
28 <div class="outofdate">Esta traducción podría estar
29             obsoleta. Consulte la versión en inglés de la
30             documentación para comprobar si se han producido cambios
31             recientemente.</div>
32
33     <p>El servidor HTTP Apache es un programa modular en el que el
34     administrador puede elegir qué funcionalidades se incluyen
35     mediante la selección de un conjunto de módulos. En
36     primer lugar, los módulos pueden compilarse de manera
37     estática en el binario <code class="program"><a href="./programs/httpd.html">httpd</a></code>. De forma
38     alternativa, los módulos también pueden compilarse como
39     Objetos Dinamicos Compartidos (DSOs) que existen de forma
40     independiente del archivo binario <code class="program"><a href="./programs/httpd.html">httpd</a></code>. Los
41     módulos que se deseen usar como objetos dinámicos
42     compartidos pueden compilarse al mismo tiempo que el servidor, o
43     pueden compilarse en otro momento y ser añadidos después
44     usando la Herramienta de Extensión de Apache
45     (<code class="program"><a href="./programs/apxs.html">apxs</a></code>).</p>
46
47     <p>Este documento describe cómo usar los módulos en
48     forma de objeto dinámico compartido (DSO) así como los
49     fundamentos teóricos que hay detrás para explicar su
50     funcionamiento.</p>
51   </div>
52 <div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#implementation">Implementación</a></li>
53 <li><img alt="" src="./images/down.gif" /> <a href="#usage">Resumen de uso</a></li>
54 <li><img alt="" src="./images/down.gif" /> <a href="#background">Fundamentos teoróricos
55 detrás de los objetos dinámicos compartidos</a></li>
56 <li><img alt="" src="./images/down.gif" /> <a href="#advantages">Ventajas e Inconvenientes</a></li>
57 </ul></div>
58 <div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
59 <div class="section">
60 <h2><a name="implementation" id="implementation">Implementación</a></h2>
61
62 <table class="related"><tr><th>Módulos Relacionados</th><th>Directivas Relacionadas</th></tr><tr><td><ul><li><code class="module"><a href="./mod/mod_so.html">mod_so</a></code></li></ul></td><td><ul><li><code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code></li></ul></td></tr></table>
63
64     <p>Cargar módulos de Apache individualmente como objetos
65     dinámicos compartidos (DSO) es posible gracias a un
66     módulo llamado <code class="module"><a href="./mod/mod_so.html">mod_so</a></code> que debe compilarse
67     estáticamente en el núcleo (kernel) de Apache. Es el
68     único módulo junto con el módulo
69     <code class="module"><a href="./mod/core.html">core</a></code> que no se puede usar como objeto
70     dinámico compartido. Prácticamente todos los demás
71     módulos distribuidos con Apache se pueden usar como objetos
72     dinámicos compartidos individualmente siempre y cuando se
73     haya activado la posibilidad de usarlos con la opción de
74     <code class="program"><a href="./programs/configure.html">configure</a></code>
75     <code>--enable-<em>module</em>=shared</code> tal y como se
76     explicó en la <a href="install.html">documentación de
77     instalación</a>. Una vez que haya compilado un módulo
78     como objeto dinámico compartido y le haya puesto un nombre
79     del tipo <code>mod_foo.so</code>, puede cargarlo al iniciar o
80     reiniciar el servidor usando el comando <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> de <code class="module"><a href="./mod/mod_so.html">mod_so</a></code>
81     en el fichero <code>httpd.conf</code>.</p>
82
83     <p>Para simplificar la creación de objetos dinámicos
84     compartidos para Apache (especialmente módulos de terceras
85     partes) está disponible un nuevo programa de soporte llamado
86     <code class="program"><a href="./programs/apxs.html">apxs</a></code> (<em>APache eXtenSion</em>). Puede usar
87     este programa para crear módulos como objetos dinámicos
88     compartidos <em>sin tener que</em> crearlos al mismo tiempo que
89     compila su servidor Apache. La idea es simple: cuando se instala
90     Apache el procedimiento <code>make install</code> de
91     <code class="program"><a href="./programs/configure.html">configure</a></code> @@@ installs the Apache C header
92     files and puts the platform-dependent compiler and linker flags
93     for building DSO files into the apxs program / instala los
94     ficheros de cabecera de C de Apache y especifica las opciones de
95     compilación y enlace dependientes de la plataforma para
96     generar objetos dinámicos compartidos con
97     <code class="program"><a href="./programs/apxs.html">apxs</a></code>. De esta manera el usuario puede usar
98     <code class="program"><a href="./programs/apxs.html">apxs</a></code> para compilar el código fuente de
99     módulos de Apache de manera independiente y sin tener que
100     preocuparse por las opciones de compilación y enlace
101     dependientes de la plataforma que soportan objetos dinámicos
102     compartidos.</p>
103
104 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
105 <div class="section">
106 <h2><a name="usage" id="usage">Resumen de uso</a></h2>
107
108     <p>Para que se haga una idea de lo que permite el soporte de
109     objetos dinámicos compartidos en Apache 2.0, aquí tiene
110     un resumen breve pero conciso:</p>
111
112     <ol>
113       <li>
114         Construir e instalar un módulo <em>incluido en la
115         distribución</em> de Apache, digamos
116         <code>mod_foo.c</code>, como un objeto dinámico
117         compartido de nombre <code>mod_foo.so</code>:
118
119 <div class="example"><p><code>
120 $ ./configure --prefix=/path/to/install --enable-foo=shared<br />
121 $ make install
122 </code></p></div>
123       </li>
124
125       <li>
126         Construir e instalar un módulo de Apache de una
127         <em>tercera parte</em>, digamos <code>mod_foo.c</code>, como
128         un objeto dinámico compartido de nombre
129         <code>mod_foo.so</code>:
130
131 <div class="example"><p><code>
132 $ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c --enable-foo=shared<br />
133 $ make install
134 </code></p></div>
135       </li>
136
137       <li>
138         Configurar Apache para poder <em>instalar después</em>
139         objetos dinámicos compartidos:
140
141 <div class="example"><p><code>
142 $ ./configure --enable-so<br />
143 $ make install
144 </code></p></div>
145       </li>
146
147       <li>
148         Construir e instalar un módulo de Apache de una
149         <em>tercera parte</em>, digamos <code>mod_foo.c</code>, como
150         un objeto dinámico compartido de nombre
151         <code>mod_foo.so</code> <em>fuera</em> de la estructura de
152         directorios de Apache usando <code class="program"><a href="./programs/apxs.html">apxs</a></code>:
153
154 <div class="example"><p><code>
155 $ cd /path/to/3rdparty<br />
156 $ apxs -c mod_foo.c<br />
157 $ apxs -i -a -n foo mod_foo.la
158 </code></p></div>
159       </li>
160     </ol>
161
162     <p>En todos los casos, una vez que se compila el objeto
163         dinámico compartido, debe usar una directiva <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> en
164         <code>httpd.conf</code> para activar dicho módulo.</p>
165 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
166 <div class="section">
167 <h2><a name="background" id="background">Fundamentos teoróricos
168 detrás de los objetos dinámicos compartidos</a></h2>
169
170     <p>En las versiones modernas de Unix, existe un mecanismo
171     especialmente útil normalmente llamado enlazado/carga de
172     <em>Objetos Dinámicos Compartidos</em> (DSO). Este mecanismo
173     ofrece una forma de construir trozos de código de programa en
174     un formato especial para cargarlo en tiempo de ejecución en
175     el espacio de direcciones de memoria de un programa
176     ejecutable.</p>
177
178     <p>Esta carga puede hacerse de dos maneras: automáticamente
179     con un programa de sistema llamado <code>ld.so</code> al inicio de
180     un programa ejecutable o manualmente desde dentro del programa en
181     ejecución con una interfaz programática del sistema al
182     cargador de Unix mediante llamadas al sistema
183     <code>dlopen()/dlsym()</code>.</p>
184
185     <p>Si se usa el primer método, los objetos dinámicos
186         compartidos se llaman normalmente <em>librerías
187         compartidas</em> ó <em>librerías DSO</em> y se
188         nombran como <code>libfoo.so</code> o
189         <code>libfoo.so.1.2</code>. Residen en un directorio de
190         sistema (normalmente <code>/usr/lib</code>) y el enlace con el
191         programa ejecutable se establece al construir la librería
192         especificando la opción<code>-lfoo</code> al comando de
193         enlace. Esto incluye las referencias literales a las
194         librerías en el programa ejecutable de manera que cuando
195         se inicie, el cargador de Unix será capaz de localizar
196         <code>libfoo.so</code> en <code>/usr/lib</code>, en rutas
197         referenciadas literalmente mediante opciones del linker como
198         <code>-R</code> o en rutas configuradas mediante la variable
199         de entorno <code>LD_LIBRARY_PATH</code>. Entonces se resuelven
200         los símbolos (todavía no resueltos) en el programa
201         ejecutable que están presentes en el objeto dinámico
202         compartido.</p>
203
204     <p>Los símbolos en el programa ejecutable no están
205     referenciados normalmente en el objeto dinámico compartido
206     (porque son librerías reusables de propósito general) y
207     por tanto, no se producen más resoluciones. El programa
208     ejecutable no tiene que hacer nada por sí mismo para usar los
209     símbolos del objeto dinámico compartido porque todo el
210     trabajo de resolución lo hace @@@ Unix loader / el cargador
211     de Unix @@@. (De hecho, el código para invocar
212     <code>ld.so</code> es parte del código que se ejecuta al
213     iniciar, y que hay en cualquier programa ejecutable que haya sido
214     construido de forma no estática). La ventaja de cargar
215     dinámicamente el código de las librerías comunes es
216     obvia: el código de las librerías necesita ser almacenado
217     solamente una vez, en una librería de sistema como
218     <code>libc.so</code>, ahorrando así espacio en disco.</p>
219
220     <p>Por otro lado, los objetos dinámicos compartidos
221         también suelen llamarse <em>objetos compatidos</em> o
222         <em>ficheros DSO</em> y se les puede nombrar con cualquier
223         extensión (aunque su nombre canónico es
224         <code>foo.so</code>). Estos archivos normalmente permanecen
225         dentro de un directorio específico del programa y no se
226         establecen enlaces automáticamente con los programas
227         ejecutables con los que se usan.  En lugar de esto, el
228         programa ejecutable carga manualmente el objeto dinámico
229         compartido en tiempo de ejecución en su espacio de
230         direcciones de memoria con <code>dlopen()</code>. En ese
231         momento no se resuelven los símbolos del objeto
232         dinámico compartido para el programa ejecutable. En lugar
233         de esto, el cargador de Unix resuelve automáticamente los
234         símbolos (aún no resueltos en el objeto
235         dinámico compartido del conjunto de símbolos
236         exportados por el programa ejecutable y de las librerías
237         DSO que tenga ya cargadas (especialmente todos los
238         símbolos de la omnipresente <code>libc.so</code>). De
239         esta manera el objeto dinámico compartido puede conocer
240         el conjunto de símbolos del programa ejecutable como si
241         hubiera sido enlazado estáticamente en un primer
242         momento.</p>
243
244     <p>Finalmente, para beneficiarse de la API de las DSOs, el
245     programa ejecutable tiene que resolver los símbolos
246     particulares de la DSO con <code>dlsym()</code> para ser usado
247     más tarde dentro de tablas de direccionamiento (dispatch
248     tables) <em>etc.</em> En otras palabras: El programa ejecutable
249     tiene que resolver manualmente cada uno de los símbolos que
250     necesita para poder usarlo después. La ventaja de ese
251     mecanismo es que las partes opcionales del programa no necesitan
252     ser cargadas (y por tanto no consumen memoria) hasta que se
253     necesitan por el programa en cuestión. Cuando es necesario,
254     estas partes del programa pueden cargarse dinámicamente para
255     expandir las funcionalidades básicas del programa.</p>
256
257     <p>Aunque este mecanismo DSO parece muy claro, hay al menos un
258     paso de cierta dificultad: la resolución de los símbolos
259     que usa el programa ejecutable por la DSO cuando se usa una DSO
260     para extender la funcionalidad de una programa (segundo caso). Por
261     qué? Porque la resolución inversa de símbolos de
262     DSOs del conjunto de símbolos del programa ejecutable se hace
263     en contra del diseño de la librería (donde la
264     librería no tiene conocimiento sobre los programas que la
265     usan) y tampoco está disponible en todas las plataformas no
266     estandarizadas. En la práctica los símbolos globales del
267     programa ejecutable están disponibles para su uso en una
268     DSO. El mayor problema que hay que resolver cuando se usan DSOs
269     para extender un programa en tiempo de ejecución es encontrar
270     un modo de forzar al enlazador a exportar todos los símbolos
271     globales.</p>
272
273     <p>El enfoque de las librerías compartidas es bastante
274     típico, porque es para lo que se diseño el mecanismo
275     DSO, por tanto se usa para casi todos los tipos de librerías
276     que incluye el sistema operativo. Por otro lado, no muchos
277     programas usan objetos compartidos para expandir sus
278     funcionalidades.</p>
279
280     <p>En 1998, había solamente unos pocos programas disponibles
281     que usaban el mecanismo DSO para extender su funcionalidad en
282     tiempo de ejecucion: Perl 5 (por medio de su mecanismo XS y el
283     módulo DynaLoader), Netscape Server, <em>etc.</em> A partir
284     de la version 1.3, Apache se unió a este grupo, Apache usa
285     desde entonces una concepción modular para extender su
286     funcionalidad e internamente usa un enfoque de tablas de
287     direccionamiento (dispatch-list-based) para enlazar módulos
288     externos con las funcionalidades propias del servidor. De esta
289     manera, Apache puede usar el mecanismo DSO para cargar sus
290     módulos en tiempo de ejecución.</p>
291 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
292 <div class="section">
293 <h2><a name="advantages" id="advantages">Ventajas e Inconvenientes</a></h2>
294
295     <p>Las características de las librerías dinámicas
296     compartidas arriba explicadas tienen las siguientes ventajas:</p>
297
298     <ul>
299       <li>El servidor es mucho más flexible en tiempo de
300       ejecución porque pueden añadirse módulos mediante
301       comandos de configuración <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> en
302       <code>httpd.conf</code> en lugar de tener que hacerlo con las
303       opciones de <code class="program"><a href="./programs/configure.html">configure</a></code> al compilar. Por
304       ejemplo, de esta manera uno puede ejecutar diferentes instancias
305       del servidor (estándar &amp; SSL, mínima &amp; super
306       potente [mod_perl, PHP3], <em>etc.</em>) con una única
307       instalación de Apache.</li>
308
309       <li>El servidor puede ser extendido fácilmente con
310       módulos de terceras partes después de la
311       instalación. Esto es un gran beneficio al menos para los
312       mantenedores de paquetes de distribuciones, que pueden crear un
313       paquete básico de Apache y paquetes adicionales que
314       contengan extensiones tales como PHP3, mod_perl, mod_fastcgi,
315       <em>etc.</em></li>
316
317       <li>Facilita la labor de hacer prototipos de módulos de
318       Apache porque con el dúo DSO/<code class="program"><a href="./programs/apxs.html">apxs</a></code> se
319       puede trabajar fuera de la estructura de directorios de Apache y
320       únicamente es necesario el comando <code>apxs -i</code>
321       seguido del comando <code>apachectl restart</code> para probar
322       la nueva versión del módulo que se está
323       desarrollando.</li>
324     </ul>
325
326     <p>DSO presenta los siguientes inconvenientes:</p>
327
328     <ul>
329       <li>El mecanismo DSO no puede ser usado en todas las plataformas
330       porque no todos los sistemas operativos soportan la carga
331       dinámica de código en el espacio de direcciones de
332       memoria de un programa.</li>
333
334       <li>El servidor es aproximadamente un 20% más lento
335       iniciándose por la sobrecarga que implica la
336       resolución de símbolos por parte del cargador de Unix.</li>
337
338       <li>El servidor es aproximadamente un 5% más lento
339       ejecutándose en algunas plataformas porque el código
340       posicionado independientemente (PIC) necesita algunas veces
341       procesos bastante complicados para calcular direcciones
342       relativas que no son en principio tan rápidos como los que
343       se usan para calcular direcciones absolutas.</li>
344
345       <li>Como los módulos DSO no pueden enlazarse a otras
346       librerías basadas en DSO (<code>ld -lfoo</code>) en todas
347       las plataformas (por ejemplo en las plataformas basadas en a.out
348       normalmente no puede ser usada esta funcionalidad, mientras que
349       sí puede ser usada en las plataformas basadas en ELF) no se
350       puede usar el mecanismo DSO para todos los tipos de
351       módulos. En otras palabras, los módulos compilados
352       como ficheros DSO solamente pueden usar símbolos del
353       núcleo (kernel) de Apache, los de las librerías de C
354       (<code>libc</code>) y de todas las demas librerías
355       dinámicas o estáticas usadas por el núcleo de
356       Apache, o de archivos de librerías estáticas
357       (<code>libfoo.a</code>) que contengan código independiente
358       de su posición. Las únicas posibilidades para usar
359       otro código es asegurarse de que el núcleo de Apache
360       contiene una referencia a él o cargar el código por
361       medio de <code>dlopen()</code>.</li>
362     </ul>
363
364 </div></div>
365 <div class="bottomlang">
366 <p><span>Idiomas disponibles: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
367 <a href="./es/dso.html" title="Español">&nbsp;es&nbsp;</a> |
368 <a href="./fr/dso.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
369 <a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
370 <a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
371 <a href="./tr/dso.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
372 </div><div id="footer">
373 <p class="apache">Copyright 2009 The Apache Software Foundation.<br />Licencia bajo los términos de la <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
374 <p class="menu"><a href="./mod/">Módulos</a> | <a href="./mod/directives.html">Directivas</a> | <a href="./faq/">Preguntas Frecuentes</a> | <a href="./glossary.html">Glosario</a> | <a href="./sitemap.html">Mapa de este sitio web</a></p></div>
375 </body></html>