1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"><head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
<!--
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
This file is generated from xml source: DO NOT EDIT
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-->
<title>Guía de Proxy Inverso - Servidor HTTP Apache Versión 2.5</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
<script src="../style/scripts/prettify.min.js" type="text/javascript">
</script>
<link href="../images/favicon.ico" rel="shortcut icon" /></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="../mod/">Módulos</a> | <a href="../mod/quickreference.html">Directivas</a> | <a href="http://wiki.apache.org/httpd/FAQ">Preguntas Frecuentes</a> | <a href="../glossary.html">Glosario</a> | <a href="../sitemap.html">Mapa del sitio web</a></p>
<p class="apache">Versión 2.5 del Servidor HTTP Apache</p>
<img alt="" src="../images/feather.png" /></div>
<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">Servidor HTTP</a> > <a href="http://httpd.apache.org/docs/">Documentación</a> > <a href="../">Versión 2.5</a> > <a href="./">How-To / Tutoriales</a></div><div id="page-content"><div id="preamble"><h1>Guía de Proxy Inverso</h1>
<div class="toplang">
<p><span>Idiomas disponibles: </span><a href="../en/howto/reverse_proxy.html" hreflang="en" rel="alternate" title="English"> en </a> |
<a href="../es/howto/reverse_proxy.html" title="Español"> es </a> |
<a href="../fr/howto/reverse_proxy.html" hreflang="fr" rel="alternate" title="Français"> fr </a></p>
</div>
<div class="outofdate">Esta traducción podría estar
obsoleta. Consulte la versión en inglés de la
documentación para comprobar si se han producido cambios
recientemente.</div>
<p>Además de ser un servidor web "básico", y proveer contenido estático y
dinámico a los usuarios finales, Apache HTTPD (al igual que la mayoría de
servidores http) puede también actuar como proxy inverso, también conocido
como "servidor de paso" o gateway.
</p>
<p>En tales escenarios, el propio httpd no genera contenido o aloja datos,
en su lugar el contenido se obtiene de uno o varios servidores backend, que
normalmente no tienen conexión directa con redes externas. Cuando httpd
recibe una petición de un cliente, se hace <em>proxy</em> de esta petición
a uno de estos servidores backend, que gestiona la petición, genera el
contenido y entonces envía este contenido de vuelta a httpd, que
entonces genera la respuesta HTTP definitiva que se envía de vuelta al cliente.
</p>
<p>Existen muchas razones para usar esta implementación, pero generalmente
las razones típicas se deben a seguridad, alta disponibilidad, balanceo
de carga, y centralización de autenticación/autorización. Es crítico en
estas implementaciones que la arquitectura y el diseño de la infraestructura
de los backend (esos servidores que son los que acaban gestionando las peticiones)
estén aislados y protegidos del exterior; en cuanto al cliente se refiere,
el proxy inverso <em>és</em> la única fuente de todo el contenido.</p>
<p>Ejemplo de implementación típica:</p>
<p class="centered"><img src="../images/reverse-proxy-arch.png" alt="reverse-proxy-arch" /></p>
</div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#related">Proxy Inverso</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#simple">Proxy inverso sencillo</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#cluster">Clusters y Balanceadores</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#config">Configuración de Balanceador y BalancerMember</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#failover">Tolerancia a fallos</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#manager">Gestor del Balanceador</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#health-check">Comprobaciones de estado dinámicas</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#status">Marcas de estado de los Miembros del Balanceador</a></li>
</ul><h3>Consulte también</h3><ul class="seealso"><li><a href="#comments_section">Comentarios</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="related" id="related">Proxy Inverso</a> <a title="Enlace permanente" href="#related" class="permalink">¶</a></h2>
<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_proxy.html">mod_proxy</a></code></li><li><code class="module"><a href="../mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code></li><li><code class="module"><a href="../mod/mod_proxy_hcheck.html">mod_proxy_hcheck</a></code></li></ul></td><td><ul><li><code class="directive"><a href="../mod/mod_proxy.html#proxypass">ProxyPass</a></code></li><li><code class="directive"><a href="../mod/mod_proxy.html#balancermember">BalancerMember</a></code></li></ul></td></tr></table>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="simple" id="simple">Proxy inverso sencillo</a> <a title="Enlace permanente" href="#simple" class="permalink">¶</a></h2>
<p>
La directiva <code class="directive"><a href="../mod/mod_proxy.html#proxypass">ProxyPass</a></code>
especifica el mapeo de peticiones entrantes al servidor backend (o un cluster
de servidores conocido como grupo de <code>Balanceo</code>). El ejemplo
más sencillo hace proxy de todas las solicitudes (<code>"/"</code>) a un solo backend:
</p>
<pre class="prettyprint lang-config">ProxyPass "/" "http://www.example.com/"</pre>
<p>
Para asegurarse de ello y que las cabeceras <code>Location:</code>
generadas en el backend se modifican para apuntar al proxy inverso,
en lugar del propio backend, la directiva <code class="directive"><a href="../mod/mod_proxy.html#proxypassreverse">
ProxyPassReverse</a></code> suele ser necesaria a menudo:
</p>
<pre class="prettyprint lang-config">ProxyPass "/" "http://www.example.com/"
ProxyPassReverse "/" "http://www.example.com/"</pre>
<p>Sólo se hará proxy de ciertas URIs, como se muestra en este ejemplo:</p>
<pre class="prettyprint lang-config">ProxyPass "/images/" "http://www.example.com/"
ProxyPassReverse "/images/" "http://www.example.com/"</pre>
<p>En este ejemplo, se hará proxy al backend especificado,
de cualquier solicitud que comience con la ruta <code>/images/</code>, si
no se gestionarán localmente.
</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="cluster" id="cluster">Clusters y Balanceadores</a> <a title="Enlace permanente" href="#cluster" class="permalink">¶</a></h2>
<p>
Aunque los ejemplos de más arriba son útiles, tienen la deficiencia en la
que si el backend se cae, o recibe mucha carga, hacer proxy de esas solicitudes
no aporta grandes beneficios. Lo que se necesita es la habilidad de definir un
grupo de servidores backend que puedan gestionar esas peticiones y que el proxy
inverso pueda balancear la carga y aplicar la tolerancia a fallos entre los backend.
A veces a este grupo se le llama <em>cluster</em>, pero el término para Apache httpd
es <em>balanceador</em>. Se puede definir un balanceador usando las directivas
<code class="directive"><a href="../mod/mod_proxy.html#proxy"><Proxy></a></code> and
<code class="directive"><a href="../mod/mod_proxy.html#balancermember">BalancerMember</a></code> como se muestra
a continuación:
</p>
<pre class="prettyprint lang-config"><Proxy balancer://myset>
BalancerMember http://www2.example.com:8080
BalancerMember http://www3.example.com:8080
ProxySet lbmethod=bytraffic
</Proxy>
ProxyPass "/images/" "balancer://myset/"
ProxyPassReverse "/images/" "balancer://myset/"</pre>
<p>
El esquema <code>balancer://</code> es lo que le dice a httpd que estamos
generando un grupo de balanceo, con el nombre <em>myset</em>. Incluye 2
servidores backend, que httpd llama <em>BalancerMember</em>. En este caso,
se hará proxy inverso de cualquier petición para <code>/images/</code>
hacia <em>uno</em> de los dos backend.
La directiva <code class="directive"><a href="../mod/mod_proxy.html#proxyset">ProxySet</a></code> especifica que
el Balanceador <em>myset</em> usa un algoritmo que balancea basado en los
bytes de entrada/salida (I/O).
</p>
<div class="note"><h3>Información adicional</h3>
<p>
También se refiere a los Miembros del Balanceador <em>BalancerMember</em>
como <em>workers</em> (trabajadores).
</p>
</div>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="config" id="config">Configuración de Balanceador y BalancerMember</a> <a title="Enlace permanente" href="#config" class="permalink">¶</a></h2>
<p>
Puede ajustar numerosos parámetros de los <em>balanceadores</em>
y los <em>workers</em> definiéndolos a través de la directiva
<code class="directive"><a href="../mod/mod_proxy.html#proxypass">ProxyPass</a></code>. Por ejemplo,
asumiendo que quisiéramos que <code>http://www3.example.com:8080</code> gestionara
3 veces más tráfico con un "timeout" de 1 segundo, ajustaríamos la configuración como sigue:
</p>
<pre class="prettyprint lang-config"><Proxy balancer://myset>
BalancerMember http://www2.example.com:8080
BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
ProxySet lbmethod=bytraffic
</Proxy>
ProxyPass "/images/" "balancer://myset/"
ProxyPassReverse "/images/" "balancer://myset/"</pre>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="failover" id="failover">Tolerancia a fallos</a> <a title="Enlace permanente" href="#failover" class="permalink">¶</a></h2>
<p>
Puede también ajustar varios escenarios de tolerancia a fallos, detallando
qué workers, e incluso balanceadores, deberían usarse en tales casos.
Por ejemplo, la siguiente configuración implementa dos casos de tolerancia
a fallos: En el primero, sólo se envía tráfico a
<code>http://hstandby.example.com:8080</code> si todos los demás workers en
el balanceador <em>myset</em> no están disponibles. Si ese worker tampoco está
disponible, sólo entonces los workers de <code>http://bkup1.example.com:8080</code>
y <code>http://bkup2.example.com:8080</code> serán incluidos en la rotación:
</p>
<pre class="prettyprint lang-config"><Proxy balancer://myset>
BalancerMember http://www2.example.com:8080
BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
BalancerMember http://hstandby.example.com:8080 status=+H
BalancerMember http://bkup1.example.com:8080 lbset=1
BalancerMember http://bkup2.example.com:8080 lbset=1
ProxySet lbmethod=byrequests
</Proxy>
ProxyPass "/images/" "balancer://myset/"
ProxyPassReverse "/images/" "balancer://myset/"</pre>
<p>
La "magia" de ésta configuración de tolerancia a fallos es configurar
<code>http://hstandby.example.com:8080</code> con la marca de estado
<code>+H</code>, que lo pone en modo <em>hot standby</em> (en reserva),
y hacen que los 2 servidores <code>bkup#</code> sean parte del set nº 1 del balanceo de carga (el valor por defecto es 0); para tolerancia a fallos, los "hot standby" (si existen) se usan primero cuando todos los workers estándar no están disponibles; los set de balanceo con el número inferior se intentan usar siempre primero.
</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="manager" id="manager">Gestor del Balanceador</a> <a title="Enlace permanente" href="#manager" class="permalink">¶</a></h2>
<p>
Una de las características más útiles y única del proxy inverso de Apache
httpd es la aplicación embebida <em>balancer-manager</em> (gestor de balanceo).
wSimilar a <code class="module"><a href="../mod/mod_status.html">mod_status</a></code>, <em>balancer-manager</em> muestra
la configuración actual que está funcionando, el estado de los balanceadores
activados y workers que están en uso en ese momento. Aun así, no sólo muestra
estos parámetros, también permite reconfiguración dinámica, en tiempo real, de
prácticamente todos ellos, incluido añadir nuevos <em>BalancerMember</em> (workers)
a un balanceo existente. Para activar esta prestación, se tiene que añadir lo siguiente a la configuración:
</p>
<pre class="prettyprint lang-config"><Location "/balancer-manager">
SetHandler balancer-manager
Require host localhost
</Location></pre>
<div class="warning"><h3>Atención</h3>
<p>No active el <em>balancer-manager</em> hasta que haya <a href="../mod/mod_proxy.html#access">securizado su servidor</a>. En particular,
asegúrese de que el acceso a ésta URL (la de configuración del balanceador)
esté altamente restringido.</p>
</div>
<p>
Cuando se accede al proxy inverso en la url
(p.e: <code>http://rproxy.example.com/balancer-manager/</code>, verá una
página similar a la siguiente:
</p>
<p class="centered"><img src="../images/bal-man.png" alt="balancer-manager page" /></p>
<p>
Este formulario permite al administrador ajustar varios parámetros, desactivar
workers, cambiar los métodos de balanceo de carga y añadir nuevos workers.
Por ejemplo, haciendo clic en el balanceador, verá la siguiente página:
</p>
<p class="centered"><img src="../images/bal-man-b.png" alt="balancer-manager page" /></p>
<p>
Y haciendo clic en el worker, mostrará esta página:
</p>
<p class="centered"><img src="../images/bal-man-w.png" alt="balancer-manager page" /></p>
<p>
Para hacer que estos cambios sean persistentes en los reinicios del proxy
inverso, asegúrese de que <code class="directive"><a href="../mod/mod_proxy.html#balancerpersist">BalancerPersist</a></code> está activado.
</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="health-check" id="health-check">Comprobaciones de estado dinámicas</a> <a title="Enlace permanente" href="#health-check" class="permalink">¶</a></h2>
<p>
Antes de que httpd haga proxy de una petición a un worker, puede <em>"comprobar"</em>
si ese worker está disponible mediante el parámetro de configuración <code>ping</code>
para ese worker usando <code class="directive"><a href="../mod/mod_proxy.html#proxypass">ProxyPass</a></code>.
A menudo es más útil comprobar el estado de los workers <em>no disponibles</em>,
con un método dinámico. Esto se consigue con el módulo <code class="module"><a href="../mod/mod_proxy_hcheck.html">mod_proxy_hcheck</a></code>.
</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="status" id="status">Marcas de estado de los Miembros del Balanceador</a> <a title="Enlace permanente" href="#status" class="permalink">¶</a></h2>
<p>
En el <em>balancer-manager</em> el estado actual, o <em>status</em>, de un worker
se muestra y puede ser configurado/reseteado. El significado de estos estados es el siguiente:
</p>
<table class="bordered">
<tr><th>Marca</th><th>Cadena</th><th>Descripción</th></tr>
<tr><td> </td><td><em>Ok</em></td><td>El Worker está disponible</td></tr>
<tr><td> </td><td><em>Init</em></td><td>El Worker ha sido inicializado</td></tr>
<tr><td><code>D</code></td><td><em>Dis</em></td><td>El Worker está
desactivado y no aceptará peticiones; se intentará reutilizar automáticamente.</td></tr>
<tr><td><code>S</code></td><td><em>Stop</em></td><td>El Worker ha sido desactivado por el
administrador; no aceptará peticiones y no se reintentará utilizar automáticamente</td></tr>
<tr><td><code>I</code></td><td><em>Ign</em></td><td>El Worker está en modo "ignore-errors" (obviar-errores) y estará siempre en modo disponible.</td></tr>
<tr><td><code>H</code></td><td><em>Stby</em></td><td>El Worker está en modo "hot-standby" y sólo se usará si no hay otros workers disponibles.</td></tr>
<tr><td><code>E</code></td><td><em>Err</em></td><td>El Worker está en estado de error,
generalmente debido a fallos de comprobación antes de enviar peticiones; no se hará
proxy de peticiones a este worker, pero se reintentará el uso de este worker
dependiendo de la configuración del parámetro <code>retry</code>.</td></tr>
<tr><td><code>N</code></td><td><em>Drn</em></td><td>El Worker está en modo vaciado y sólo aceptará
sesiones activas previamente destinadas a él mismo y obviará el resto de peticiones.</td></tr>
<tr><td><code>C</code></td><td><em>HcFl</em></td><td>La comprobación dinámica del estado del Worker
ha fallado y no se usará hasta que pase las comprobaciones de estado posteriores.</td></tr>
</table>
</div></div>
<div class="bottomlang">
<p><span>Idiomas disponibles: </span><a href="../en/howto/reverse_proxy.html" hreflang="en" rel="alternate" title="English"> en </a> |
<a href="../es/howto/reverse_proxy.html" title="Español"> es </a> |
<a href="../fr/howto/reverse_proxy.html" hreflang="fr" rel="alternate" title="Français"> fr </a></p>
</div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comentarios</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="https://httpd.apache.org/lists.html">mailing lists</a>.</div>
<script type="text/javascript"><!--//--><![CDATA[//><!--
var comments_shortname = 'httpd';
var comments_identifier = 'http://httpd.apache.org/docs/trunk/howto/reverse_proxy.html';
(function(w, d) {
if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
d.write('<div id="comments_thread"><\/div>');
var s = d.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
(d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
}
else {
d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
}
})(window, document);
//--><!]]></script></div><div id="footer">
<p class="apache">Copyright 2021 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>
<p class="menu"><a href="../mod/">Módulos</a> | <a href="../mod/quickreference.html">Directivas</a> | <a href="http://wiki.apache.org/httpd/FAQ">Preguntas Frecuentes</a> | <a href="../glossary.html">Glosario</a> | <a href="../sitemap.html">Mapa del sitio web</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
prettyPrint();
}
//--><!]]></script>
</body></html>
|