Proxy de un sitio web con Apache
Introducción
En Apache existe un módulo llamado mod_proxy que es bastante útil para cumplir con varias funciones. Una de ellas es la de que un servidor reciba tráfico web para un sitio que en realidad está hosteado en otro servidor, que será la que explicaré a continuación.
Para el ejemplo, vamos a suponer:
- Sitio web www.mikroways.net.
- Por DNS, la IP que corresponde al dominio www.mikroways.net es la IPA, donde hay un Apache pero no se encuentra el código del sitio de dicho dominio.
- El servidor web para www.mikroways.net tiene la IPB.
El comportamiento básicamente es el siguiente:
- Un cliente abre una conexión HTTP contra el servidor web en IPA, que según su DNS es el servidor web www.mikroways.net.
- El servidor Apache en IPA acepta la conexión para ese dominio pero en el virtual host correspondiente tiene configurado el mod_proxy que le indica que en realidad el sitio web está en el servidor con IPB. Entonces, el Apache en IPA actúa como cliente haciendo el requerimiento del sitio web de www.mikroways.net a IPB.
- El servidor IPB le devuelve el sitio tal como lo hace con cualquier cliente y lo mismo hace el servidor IPA con su cliente.
Notar que el procedimiento anterior es totalmente transparente tanto para el cliente del servidor IPA como para el propio servidor IPB.
Configuración
A continuación se muestra la configuración del servidor IPA. Notar que en la misma, el valor IPB debe ser reemplazado por la IP del servidor donde realmente se encuentra alojado el sitio web.
<VirtualHost *:80>
ServerName www.mikroways.net
ServerAlias mikroways.net
ServerAdmin invalidaddress@mikroways.net
ProxyPreserveHost On
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://IPB/
ProxyPassReverse / http://IPB/
ErrorLog /var/log/apache2/error.log
TransferLog /var/log/apache2/access.log
</VirtualHost>
Lógicamente debe habilitarse el mod_proxy en Apache y luego reiniciar el servicio para que los cambios tomen efecto. Lo primero se hace muy simple en Debian con el comando:
a2enmod proxy a2enmod proxy_http
Memoria consumida en Linux
Muchas veces puede ser necesario encontrar la memoria que un proceso o un usuario consumen en el sistema. Lograr esto es bastante sencillo aunque implica hacer algunas cuentas. Por ello es posible simplificar la tarea utilizando algún script que la haga por nosotros. A continuación puede verse primero cómo calcular la memoria física consumida por el proceso Apache y luego por el usuario www-data. La unidad final está dada en MB.
root@server:~# ps -C apache2 -o rss --no-headers | (tr '\n' +; echo 0) | bc | awk '{print $0 "/1024"}' | bc
267
root@server:~# ps -U www-data -o rss --no-headers | (tr '\n' +; echo 0) | bc | awk '{print $0 "/1024"}' | bc
146
Existe otra forma también de chequearlo que es bastante más sencilla y es utilizando la herramienta smem. El problema es que dicha herramienta es compatible sólo con los kernels 2.6.27 o más nuevos. A continuación se puede ver la consulta de cuánto consume el proceso apache2. En este caso, smem mostrará todos los procesos y, al final, la suma de los consumos (debido a la opción -t suministrada). La opción que nos interesa en este caso es RSS, que se ve que da un total de 16720 bytes. Es para tener en cuenta que smem está sumando a lo consumido por el proceso que se le pidió la propia ejecución del comando; esto debería restarse del total para tener una valor más preciso. Daría finalmente 12020 bytes.
root@server:/home/leandro# smem -t -P "apache2" PID User Command Swap USS PSS RSS 10171 root /usr/sbin/apache2 -k start 348 144 248 1328 7173 root /usr/sbin/apache2 -k start 360 172 276 1476 7171 root /usr/sbin/apache2 -k start 364 200 302 1516 7174 root /usr/sbin/apache2 -k start 364 200 302 1516 7175 root /usr/sbin/apache2 -k start 364 200 302 1516 7731 root /usr/sbin/apache2 -k start 364 200 302 1516 7172 root /usr/sbin/apache2 -k start 352 204 306 1520 1816 root /usr/sbin/apache2 -k start 364 180 319 1632 18189 root /usr/bin/python /usr/bin/sm 0 2944 3119 4700 ------------------------------------------------------------------------------- 183 1 2880 4444 5476 16720
Finalmente, debajo se hace la misma consulta pero esta vez preguntando lo consumido por el usuario leandro.
root@server:/home/leandro# smem -t -U "leandro" PID User Command Swap USS PSS RSS 17381 leandro -bash 36 5312 5459 6880 ------------------------------------------------------------------------------- 183 1 36 5312 5459 6880
Migración del blog
Hace mucho tiempo que el servicio de VPS brindado por Dattatec no termina de rendir como quisiera por lo que he decidido cambiar de proveedor, en este caso a DreamHost. Dicha compañía tiene un excelente servicio a precios realmente muy accesibles, considerando que sus VPS arrancan en los U$S 15 con 300 MB de memoria garantizada y capacidad de almacenamiento ilimitada.
Tienen un panel de control muy completo desde el cuál se pueden administrar casi todos los aspectos que hacen a un hosting, aunque debo reconocer que no es completamente intuitivo. No obstante, la documentación es muy completa y además tienen soporte vía mensajería instantánea que resulta de gran utilidad. La contra es que todo es en inglés.
Ahora bien, en el caso particularmente del blog he contratado un VPS con 300 MB para el web y otro más para el servidor de base de datos, un servicio adicional que también brinda la gente de DreamHost. De esta manera, pretendo que el rendimiento del blog sea mejor que el que tiene hasta el momento.
El cambio no está aún al 100% debido a que hace pocos minutos efectivicé el cambio de DNS en Nic.ar, lo que tardará en propagarse desde unas horas hasta un par de días en algunos casos.
Bonding con Linux
Introducción
En este post se verá cómo configurar bonding en Linux para utilizar más de una placa a la vez con el objetivo de lograr agregación de enlaces y alta disponibilidad. Existen varios modos de funcionamiento de bonding que se listan debajo:
- Modo 0 (balance-rr): en este modo se utiliza una política de round-robin.
- Modo 1 (active-backup): sólo una placa funciona a la vez, el resto actúan como backup si la que está funcionando deja de hacerlo.
- Modo 2 (balance-xor): modo que soporta agregación de enlaces y tolerancia a fallos. Utiliza una política de transmisión basada en un hsh. Dicha política puede modificarse cambiando el valor del atributo xmit_hash_policy.
- Modo 3 (broadcast): envía la misma información por cada placa.
- Modo 4 (802.3ad): estándar que ajusta el bondig de forma dinámica. Requiere soporte del switch y que el mismo sea configurado.
- Modo 5 (balance-tlb): realiza balanceo de carga entre las placas sólo para la transmisión de datos.
- Modo 6 (balance-alb): realiza balanceo de carga entre las placas tanto para transmisión como para recepción de datos.
Información del módulo
Se puede consultar toda la información del módulo con el comando modinfo. Con la salida del comando puede verse el detalle de los modos en los que puede funcionar y los demás parámetros que se le pueden configurar.
root@test:~# modinfo bonding filename: /lib/modules/2.6.32-21-server/kernel/drivers/net/bonding/bonding.ko author: Thomas Davis, tadavis@lbl.gov and many others description: Ethernet Channel Bonding Driver, v3.5.0 version: 3.5.0 license: GPL srcversion: 0D992F3F7BA86233AA29838 depends: vermagic: 2.6.32-21-server SMP mod_unload modversions parm: max_bonds:Max number of bonded devices (int) parm: num_grat_arp:Number of gratuitous ARP packets to send on failover event (int) parm: num_unsol_na:Number of unsolicited IPv6 Neighbor Advertisements packets to send on failover event (int) parm: miimon:Link check interval in milliseconds (int) parm: updelay:Delay before considering link up, in milliseconds (int) parm: downdelay:Delay before considering link down, in milliseconds (int) parm: use_carrier:Use netif_carrier_ok (vs MII ioctls) in miimon; 0 for off, 1 for on (default) (int) parm: mode:Mode of operation : 0 for balance-rr, 1 for active-backup, 2 for balance-xor, 3 for broadcast, 4 for 802.3ad, 5 for balance-tlb, 6 for balance-alb (charp) parm: primary:Primary network device to use (charp) parm: lacp_rate:LACPDU tx rate to request from 802.3ad partner (slow/fast) (charp) parm: ad_select:803.ad aggregation selection logic: stable (0, default), bandwidth (1), count (2) (charp) parm: xmit_hash_policy:XOR hashing method: 0 for layer 2 (default), 1 for layer 3+4 (charp) parm: arp_interval:arp interval in milliseconds (int) parm: arp_ip_target:arp targets in n.n.n.n form (array of charp) parm: arp_validate:validate src/dst of ARP probes: none (default), active, backup or all (charp) parm: fail_over_mac:For active-backup, do not set all slaves to the same MAC. none (default), active or follow (charp)
Configuración en Debian
Ahora bien, después de haber explicado de forma básica la parte teórica y conocer el módulo de bonding, sólo restar configurarlo y ponerlo a funcionar. En Debian esta tarea es absolutamente trivial y se lleva a cabo editando el archivo /etc/network/interfaces, agregando la configuración que se ve a continuación (modificando los parámetros según las necesidades particulares). Las interfaces que intervienen en el bonding no deberían tener una configuración en el archivo mencionado.
auto bond0
iface bond0 inet static
address 192.168.10.2
netmask 255.255.255.0
network 192.168.10.0
gateway 192.168.10.1
slaves eth0 eth1
bond_mode balance-alb
bond_miimon 100
bond_downdelay 200
bond_updelay 200
Conclusión
Como se puede ver, configurar en bonding en Linux es extremadamente sencillo y puede traer grandes ventajas cuando se lo utiliza en un servidor que reciba mucho tráfico o bien que se necesite tenga una alta disponibilidad. Y los requisitos necesarios son muy fáciles de cumplir: a no ser que se quiera utilizar el modo 4, sólo basta con tener al menos dos placas en el servidor y dos puertos libres en uno o más switches.
Levantar un servidor web en menos de 1 segundo
Hoy leí en la columna de Charly Kühnast en Linux Magazine un truco muy simple para iniciar un servidor web teniendo solamente Python instalado. Las ventajas son que Python suele incluirse en todas las distribuciones de Linux, que el servidor se puede ejecutar con cualquier usuario sin privilegios y que el tiempo que toma iniciarlo es menor al que lleva leer este post. Ahora bien, dentro del directorio que se desea publicar por web basta con ejecutar:
python -m SimpleHTTPServer 8080
Si no se especifica el número de puerto por defecto inicia en el 8000.



