Cómo configurar HAProxy en Ubuntu 16.04
HAProxy es una herramienta de servicios proxy y de equilibrio de carga de alta disponibilidad de código abierto para aplicaciones de red basadas en TCP y HTTP. Es fácil de usar, se adapta a sitios web de gran volumen y se integra perfectamente en arquitecturas existentes. Ofrece conexiones transparentes, descarga de servidores, aplicación de políticas y conexiones limitadas, además de su función principal de servicio proxy. En este artículo explicamos cómo configurar haproxy en Ubuntu 16.04.
1. Configurar la red
Agregaremos tres servidores web que se ejecutan con Apache2 y un servidor HAPROXY que transmitirá todas las solicitudes / respuestas de los tres servicios web en nuestra red.
A continuación, se enumeran los detalles del servidor web en nuestra red.
Server 1: site1.local 10.0.1.116 Server 2: site2.local 10.0.1.117 Server 3: site3.local 10.0.1.119
Servidor HAProxy:
load-balancer.local 10.0.1.118
También adjuntaremos una IP pública a load-balancer.local para poder acceder a ella desde el dominio público (opcional). Si no desea acceder a él desde el dominio público, puede omitir adjuntar la IP pública asumiendo que accederá al servidor proxy dentro de su red.
2. Configurar el nombre de host
Dado que vamos a acceder al balanceador de carga y al servidor web por su nombre (no por IPADDRESS), configuraremos el nombre de host de tres servidores web y un servidor proxy. Configuraremos el nombre de host de tres servidores web y el servidor proxy como site1.local, site2.local, site3.local y load-balancer.local respectivamente.
Configuraremos el nombre de host de 10.0.1.116 como site1.local en / etc / hosts y / etc / hostname
root@site1:~# vi /etc/hosts 127.0.0.1 localhost 10.0.1.116 site1.local root@site1:~# vi /etc/hostname site1.local
Reiniciar la red
root@site1:~# service networking restart
Instale apache y habilítelo.
root@site1:~# apt-get install apache2 root@site1:~# service apache2 enable root@site1:~# service apache2 start
Cree un archivo de índice para site1.local
root@site1:~# vi /var/www/html/index.html <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h1> Hi, This is 10.0.1.116 </h1> </body> </html>
Agregar regla de firewall para http
# ufw allow 80/tcp # ufw reload
Ahora compruebe si puede acceder a site1
root@site1:~# curl -I site1.local HTTP/1.1 200 OK Date: Sun, 14 Aug 2016 14:30:29 GMT Server: Apache/2.4.18 (Ubuntu) Last-Modified: Sun, 14 Aug 2016 03:50:35 GMT ETag: "ec-53a0004a26c6d" Accept-Ranges: bytes Content-Length: 236 Vary: Accept-Encoding Content-Type: text/html
O
root@site1:~# curl site1.local <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h1> Hi, This is 10.0.1.116 </h1> </body> </html>
Repita el paso 2 para site2 (10.0.1.117) y site3 (10.0.1.119).
En el servidor proxy, agregue la entrada de los tres servidores web (IPADDRESS HOSTNAME) además de su propio nombre de host como load-balancer.local
root@load-balancer:~# vi /etc/hosts 127.0.0.1 localhost 10.0.1.118 load-balancer.local 10.0.1.116 site1.local 10.0.1.117 site2.local 10.0.1.119 site3.local
Configurar el nombre de host del servidor proxy
root@load-balancer:~# vi /etc/hostname load-balancer.local
3. Instale HAProxy
Antes de instalarlo, actualice Ubuntu. Ejecute el siguiente comando como root o use sudo para actualizar ubuntu.
root@load-balancer:~# apt-get update
Ahora actualice los paquetes en el sistema.
root@load-balancer:~# apt-get upgrade
Instálelo ejecutando el siguiente comando en la terminal.
root@load-balancer:~# apt-get install haproxy
Para habilitar el servicio como demonio, edite / etc / defaults / haproxy y agregue la siguiente línea.
HABILITADO = 1
root@load-balancer:~# vi /etc/defaults/haproxy ENABLED=1 # Add extra flags here #EXTRAOPTS="-de -m 16"
Poner en marcha el servicio
root@load-balancer:~# service haproxy start
4. Configurar HAProxy
El archivo de configuración ubicado en /etc/haproxy/haproxy.cfg y tiene dos partes global y proxies, la sección Global establece los parámetros de todo el proceso y la sección proxy consta de las secciones por defecto, escucha, front-end y back-end.
Edite el archivo de configuración con el editor de texto vi
root@load-balancer:~# vi /etc/haproxy/haproxy.cfg
El archivo de configuración predeterminado tendrá un aspecto similar al siguiente. Mantenga la sección global y predeterminada como está.
Sección global
global log 127.0.0.1 local0 log 127.0.0.1 local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # Default ciphers to use on SSL-enabled listening sockets. # For more information, see ciphers(1SSL). This list is from: # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH +3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS ssl-default-bind-options no-sslv3
Sección predeterminada
defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http
Añadiendo oyente:
Una sección de «interfaz» describe un conjunto de sockets de escucha que aceptan conexiones de cliente. El front-end define cómo deben manejarse y enviarse las solicitudes al servidor back-end:
frontend Local_Server bind 10.0.1.118:80 mode http default_backend My_Web_Servers
Adición de servidores web back-end:
Una sección «back-end» describe un conjunto de servidores a los que se conectará el proxy para reenviar las conexiones entrantes. Según la configuración anterior, el equilibrador de carga ahora está escuchando en el puerto 80. Ahora defina los servidores web back-end donde enviará la solicitud.
backend My_Web_Servers mode http balance roundrobin option forwardfor http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } option httpchk HEAD / HTTP/1.1rnHost:localhost server site1.local 10.0.1.116:80 server site2.local 10.0.1.117:80 server site3.local 10.0.1.119:80
Puede agregar el parámetro «verificar» al final de las tres líneas anteriores para verificar el parámetro de salud de sus servidores web.
Puede utilizar otro algoritmo de equilibrio según sus necesidades.
Leastconn
Selecciona el servidor con la menor cantidad de conexiones; se recomienda para sesiones más largas. Los servidores del mismo backend también se rotan de forma rotatoria.
Fuente
Esto selecciona qué servidor usar basándose en un hash de la IP de origen, es decir, la dirección IP de su usuario. Este es un método para garantizar que un usuario se conecte al mismo servidor.
Habilitar estadísticas (opcional)
Ahora, si lo desea, puede habilitar las estadísticas agregando lo siguiente en el archivo de configuración.
listen stats bind :9000 stats enable stats hide-version stats refresh 20s stats show-node stats uri /stats
5. Reinicie HAProxy
Como ha terminado con todas las configuraciones necesarias para el servidor proxy, verifique el archivo de configuración antes de reiniciar el servicio usando el siguiente comando.
root@load-balancer:~# haproxy -c -f /etc/haproxy/haproxy.cfg
Si el comando anterior devolvió un resultado como «el archivo de configuración es válido», reinicie el servicio HAProxy
root@load-balancer:~# service haproxy restart
Ahora verifique el estado del servidor HAProxy.
root@load-balancer:~# service haproxy status
6. Prueba HAProxy
Antes de realizar la prueba, asegúrese de poder hacer ping al servidor web (site1.local, site2.local, site3.local) desde load-balancer.local
root@load-balancer:~# ping site1.local PING site1.local (10.0.1.116) 56(84) bytes of data. 64 bytes from site1.local (10.0.1.116): icmp_seq=1 ttl=64 time=0.906 ms 64 bytes from site1.local (10.0.1.116): icmp_seq=2 ttl=64 time=0.906 ms 64 bytes from site1.local (10.0.1.116): icmp_seq=3 ttl=64 time=0.648 ms root@load-balancer:~# ping site2.local PING site2.local (10.0.1.117) 56(84) bytes of data. 64 bytes from site2.local (10.0.1.117): icmp_seq=1 ttl=64 time=3.02 ms 64 bytes from site2.local (10.0.1.117): icmp_seq=2 ttl=64 time=0.687 ms 64 bytes from site2.local (10.0.1.117): icmp_seq=3 ttl=64 time=0.778 ms root@load-balancer:~# ping site3.local PING site3.local (10.0.1.119) 56(84) bytes of data. 64 bytes from site3.local (10.0.1.119): icmp_seq=1 ttl=64 time=0.830 ms 64 bytes from site3.local (10.0.1.119): icmp_seq=2 ttl=64 time=0.631 ms 64 bytes from site3.local (10.0.1.119): icmp_seq=3 ttl=64 time=0.771 ms
Prueba HAPROXY usando CURL
Para probar la ejecución del siguiente script desde la terminal, encontrará que el equilibrador de carga está enviando una solicitud a tres servidores web en un método de operación por turnos.
root@load-balancer:~# while true; do curl http://10.0.1.118; sleep 1; done <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h1> Hi, This is 10.0.1.119 </h1> </body> </html> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h1> Hi, This is 10.0.1.116 </h1> </body> </html> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h1> Hi, This is 10.0.1.117 </h1> </body> </html> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h1> Hi, This is 10.0.1.119 </h1> </body> </html> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h1> Hi, This is 10.0.1.116 </h1> </body> </html> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h1> Hi, This is 10.0.1.117 </h1> </body> </html> ............................... ............................... ...............................
Prueba en el navegador:
Apunte su navegador a http: //load-balancer.local o http: // Server-Public-IP. Obtendrá una respuesta de tres servidores web de forma circular confirmando que está funcionando con nuestras expectativas. Con cada actualización, el servidor proxy envía una solicitud al servidor web back-end una por una.
También puede visitar la URL de estadísticas que está configurada en la última sección del archivo de configuración para confirmar que los puertos están abiertos al tráfico. Simplemente navegue a IP pública o http: //load-balancer.local en el puerto 9000.
Por ejemplo, vaya a http: //load-balancer.local: 9000 / stats
También puede monitorear el estado del servidor desde la terminal usando HATOP. HATOP es una herramienta de terceros que extrae las estadísticas de un archivo de socket creado por el equilibrador de carga. Instale HATOP ejecutando el siguiente comando desde la terminal.
root@load-balancer:~# apt-get install hatop
Normalmente, al ejecutar HATOP, debe utilizar el parámetro -s con el comando sudo hatop -s /var/run/haproxy.sock. Para evitar tener que ingresar el parámetro -s al llamar a HATOP, puede insertar la siguiente línea en su archivo ~ / .bashrc:
exportar unix-socket = / var / run / haproxy.sock
7. Registro de HAProxy
Edite /etc/rsyslog.d/haproxy.conf y agregue las siguientes líneas en él.
local0.* -/var/log/haproxy_0.log local1.* -/var/log/haproxy_1.log
Reinicie rsyslog
root@load-balancer:~# service rsyslog restart
Ahora verifique los registros usando el siguiente comando
root@load-balancer:~# tail -f /var/log/haproxy*.log
También agregue la línea «debug» en la sección global del archivo de configuración para el registro detallado.
Conclusión
Con HAProxy, puede aumentar el rendimiento y la disponibilidad de su aplicación web. Este tutorial es solo una introducción al equilibrio de carga, aunque es capaz de hacer mucho más de lo que se describe en este tutorial. Puede mejorar la alta disponibilidad configurando una IP flotante entre varios balanceadores de carga para proteger contra fallas en un solo balanceador de carga.