summaryrefslogtreecommitdiff
path: root/docs/manual/howto/reverse_proxy.xml.es
blob: 9075783472eda11707a052e51730f8d0a41ff38c (plain)
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
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.es.xsl"?>
<!-- English Revision: 1784674:1874148 (outdated) -->
<!-- Spanish translation : Daniel Ferradal -->
<!-- Reviewed by Luis Gil de Bernabé Pfeiffer -->

<!--
 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.
-->

<manualpage metafile="reverse_proxy.xml.meta">
<parentdocument href="./">How-To / Tutoriales</parentdocument>

  <title>Guía de Proxy Inverso</title>

  <summary>
    <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>

  </summary>


  <section id="related">
  <title>Proxy Inverso</title>
  <related>
    <modulelist>
      <module>mod_proxy</module>
      <module>mod_proxy_balancer</module>
      <module>mod_proxy_hcheck</module>
    </modulelist>
    <directivelist>
      <directive module="mod_proxy">ProxyPass</directive>
      <directive module="mod_proxy">BalancerMember</directive>
    </directivelist>
  </related>
  </section>

  <section id="simple">
    <title>Proxy inverso sencillo</title>

    <p>
      La directiva <directive module="mod_proxy">ProxyPass</directive>
      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>

    <highlight language="config">
ProxyPass "/"  "http://www.example.com/"
    </highlight>

    <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 <directive module="mod_proxy">
      ProxyPassReverse</directive> suele ser necesaria a menudo:
    </p>

    <highlight language="config">
ProxyPass "/"  "http://www.example.com/"
ProxyPassReverse "/"  "http://www.example.com/"
    </highlight>

    <p>Sólo se hará proxy de ciertas URIs, como se muestra en este ejemplo:</p>

    <highlight language="config">
ProxyPass "/images/"  "http://www.example.com/"
ProxyPassReverse "/images/"  "http://www.example.com/"
    </highlight>

    <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>
  </section>

  <section id="cluster">
    <title>Clusters y Balanceadores</title>

    <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
      <directive module="mod_proxy" type="section">Proxy</directive> and
      <directive module="mod_proxy">BalancerMember</directive> como se muestra 
      a continuación:
    </p>

    <highlight language="config">
&lt;Proxy balancer://myset&gt;
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080
    ProxySet lbmethod=bytraffic
&lt;/Proxy&gt;

ProxyPass "/images/"  "balancer://myset/"
ProxyPassReverse "/images/"  "balancer://myset/"
    </highlight>

    <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 <directive module="mod_proxy">ProxySet</directive> especifica que 
      el Balanceador <em>myset</em> usa un algoritmo que balancea basado en los 
      bytes de entrada/salida (I/O).
    </p>

    <note type="hint"><title>Información adicional</title>
      <p>
      	También se refiere a los Miembros del Balanceador <em>BalancerMember</em> 
        como <em>workers</em> (trabajadores).
      </p>
   </note>

  </section>

  <section id="config">
    <title>Configuración de Balanceador y BalancerMember</title>

    <p>
      Puede ajustar numerosos parámetros de los <em>balanceadores</em>
      y los <em>workers</em> definiéndolos a través de la directiva
      <directive module="mod_proxy">ProxyPass</directive>. 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>

    <highlight language="config">
&lt;Proxy balancer://myset&gt;
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    ProxySet lbmethod=bytraffic
&lt;/Proxy&gt;

ProxyPass "/images/"  "balancer://myset/"
ProxyPassReverse "/images/"  "balancer://myset/"
    </highlight>

  </section>

  <section id="failover">
    <title>Tolerancia a fallos</title>

    <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>

    <highlight language="config">
&lt;Proxy balancer://myset&gt;
    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
&lt;/Proxy&gt;

ProxyPass "/images/"  "balancer://myset/"
ProxyPassReverse "/images/"  "balancer://myset/"
    </highlight>

    <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>

  </section>

  <section id="manager">
    <title>Gestor del Balanceador</title>

    <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 <module>mod_status</module>, <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>

    <highlight language="config">
&lt;Location "/balancer-manager"&gt;
    SetHandler balancer-manager
    Require host localhost
&lt;/Location&gt;
    </highlight>

    <note type="warning"><title>Atención</title>
      <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>
    </note>

    <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 <directive module="mod_proxy">BalancerPersist</directive> está activado.
    </p>

  </section>

  <section id="health-check">
    <title>Comprobaciones de estado dinámicas</title>

    <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 <directive module="mod_proxy">ProxyPass</directive>. 
      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 <module>mod_proxy_hcheck</module>.
    </p>

  </section>

  <section id="status">
    <title>Marcas de estado de los Miembros del Balanceador</title>

    <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 border="1">
      	<tr><th>Marca</th><th>Cadena</th><th>Descripción</th></tr>
      	<tr><td>&nbsp;</td><td><em>Ok</em></td><td>El Worker está disponible</td></tr>
      	<tr><td>&nbsp;</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>
  </section>

</manualpage>