Servicios Avanzados

Ansible

Introducción al Ansible

Ansible es una herramienta de administración remota que permite definir estados ( está instalado un software o que exista una interfaz de red concreta) y que es capaz de llevar a los equipos a dichos estados realizando las operaciones necesarias.

Ficheros Ansible

Dentro de ansible tenemos varios ficheros que debemos controlar, para saber en qué máquina o grupo de máquinas vamos a ejecutar las diferentes operaciones, que operaciones vamos a realizar y cómo las vamos a realizar.

/etc/ansible/hosts

En este fichero tenemos los grupos de trabajo y sus máquinas dentro. Cuando queramos introducir una máquina nueva, primero deberemos introducirla en un grupo, aunque esta operación no está del todo necesaria ya que también podemos ejecutar una acción sobre una máquina en concreto.
Ejemplo:
[grupo_uno]
1.1.1.1.
1.1.1.2
1.1.1.3
[grupo_dos]
10.20.11.10

/etc/ansible/host_vars/fichero máquina

Cada vez que queramos añadir una máquina a ansible, aparte de añadirla al archivo “hosts” debemos crear su propio archivo y guardarlo en /host_vars. El contenido de este fichero es simple:
ansible_host: 85.91.25.41
ansible_hostname: hostWeb11
master: yes #De momento Solo en cool-ad11,el resto: no


/etc/ansible/config_files/ Dentro de esta carpeta tenemos todos los ficheros preparados para las instalaciones. Los tenemos separados por grupos. Por ejemplo en su interior tenemos el fichero nginx.tar.gz que usaremos para la instalación de nginx.

/etc/ansible/groups_vars/fichero_grupo

Variables de grupo. En este fichero guardamos las variables generales para ese grupo, es decir, en un grupo algunas instalaciones serán las mismas para todas las máquinas (nrpe - nginx - o lo que sea), aquí tenemos definidas estas  opciones generales. Por ejemplo para la instalación de nginx en el grupo definimos las siguientes variables:

ariables Nginx

nginx_version: 1.14.0
nginx_configure: --prefix=/usr/local/nginx-Plantilla:Nginx version --user=devel --group=devel --with-http_ssl_module --with-http_realip_module --with-http_stub_status_module --with-http_perl_module
config_nginx: nginx.tar.gz
server_origen_nginx: ad05
dominio_nginx: xjh37.com
Definimos la versión a instalar.
Definimos los parámetros del configure
server_origen_nginx. Esta variable define el nombre de donde se sacó el fichero de configuración, se crea para a posteriori utilizarla para reemplazar el nombre del fichero de configuración.
Dominio_nginx. Igual que la anterior, tenemos el nombre del dominio del archivo original.


/etc/ansible/roles Podemos definir un rol como un listado de acciones que debe hacer. Ahora mismo en nuestro caso tenemos los siguientes roles identificados:

cassandra  
initInstall  
nginx  
nodejs  
personalizar  
redis  
spark

Cada uno en su interior tiene las opciones para proceder con la instalación (en este caso) de los diferentes servicios. En nuestro caso principalmente solo hemos tenido que utilizar la carpeta tasks, que es donde se define todo el proceso. Vamos a ver el ejemplo de nginx:

Para la instalación de nginx seguiríamos los siguientes pasos: verificar - descargar - descomprimir - instalar - configurar. Vamos a entender uno de estos procesos, el de instalación estará bien.

        1. Instalacion NGINX
 - name: Instalar Nginx
   command: chdir=/usr/local/src/nginx-Plantilla:Nginx version Plantilla:Item
   with_items:
     - ./configure Plantilla:Nginx configure
     - make
     - make install
   when: verif_nginx_inst.stat.isdir is not defined
-  name : Nombre del proceso que vamos a ejecutar
   command: En esta caso cambia al directorio especificado.

Las variables nginx-version y nginx_configure las coje del fichero creado en groups_vars, en cambio la variable item la coje de la propia tarea. Esta variables item siempre tendrá que ser generada dentro de la propia tarea, en este caso no son más que las acciones a realizar:

Para entender el parámetro when primero debemos ver el proceso de verificación, lanzado el primero en este archivo task

- name: Verificamos si hay alguna instalación anterior NGINX vPlantilla:Nginx version.
   stat:
     path: /usr/local/src/nginx-Plantilla:Nginx version
   register: verif_nginx_inst

Este proceso comprueba un path en concreto y guarda el estado en la variable o objeto stat.

Posteriormente podemos ver que en el parámetro when se le pregunta al objeto stat si dicho directorio no existe. Le estamos diciendo a ansible que haga la acción siempre y cuando la carpeta no exista ya.

Otro ejemplo del parámetro when:

 - name: Copiamos fichero de configuracion local para Master
   copy:
     src: "rc.local.master"
     dest: /etc/rc.d/rc.local
   when: master == "yes"

Dentro de cada fichero de máquina, el en directorio hosts_vars, tenemos declarada la variable master, esta variable puede contenter un “yes” o un “no”.... Dependiendo de su valor haremos o no una copia de fichero. Esto lo hacemos porque tenemos ficheros que van al mismo directorio en cada instalación pero su valor cambia en función si es un server maestro (Node y Spark) o es un esclavo

/etc/ansible/yamls-varios Bien ya sabemos cómo generamos máquinas nuevas, como crear tareas nuevas, pero ¿como las lanzamos o como llamamos a los diferentes procesos que queremos realizar en nuestra red de máquinas?

Para la acción final tenemos el fichero install.yml dentro de la carpeta yamls-varios: - hosts: host_webINicial

 become: yes
 become_method: sudo
 vars:
   - nagios_server: 45.65.25.145
 roles:
     - initInstall
     - nginx
     - nodejs
     - cassandra
     - redis
   - spark


Explicación:

Comandos útiles

Usando el ejemplo anterior inicializará la instalación de spark en el grupo de máquinas cool_ads_us
Lanzaría el comando ls en la carpeta /etc/ de todas las máquinas del grupo imp_rtb_bcn
Copia el contenido de la carpeta scripts_init en /root de la máquina cool-ad11
Inserta un trozo de texto en el fichero especificado de la máquina o grupos especificados.

Let'encrypt

Combinaciones Let's encrypt

Para obtener un certificado SSL tenemos varias opciones, tanto como para la forma de obtenerlo, el tipo de certificado que queremos obtener o los dominios que abarcará este certificado.

Tenemos tres modos de ejecucción por defecto:

Certificado para uno o más dominios

letsencrypt-auto certonly -d dominio1.com -d pepe.dominio1.com -d dominio2.como

Certificado según la vía

letsencrypt-auto certonly --preferred-challenges dns -d dominio1.com
letsencrypt-auto certonly --preferred-challenges http -d dominio1.com
letsencrypt-auto certonly --preferred-challenges tls-sni -d dominio1.com (https)

Certificado via fichero de texto

letsencrypt-auto certonly --manual -d dominio1.com

Certificado indicando webroot

letsencrypt-auto  certonly --webroot -w /tmp -d www.pepe.com -d pepe.com

WildCard

letsencrypt-auto certonly --server https://acme-v02.api.letsencrypt.org/directory --manual  -d "*.dominio.com"

Nota: Para obtener el wildcard necesitaremos acceso al servidor de nombres DNS.

Renovación simple

letsencrypt-auto renew

Renovación apagando servicios

letsencrypt-auto renew --renew-hook="/etc/rc.d/init.d/nginx restart"

Revocar un certificado

letsencrypt-auto revoke --cert-path /etc/letsencrypt/archive/${YOUR_DOMAIN}/cert1.pem

Comprobar certificado sin letsencrypt

openssl x509 -in <certificat> -noout -dates

Averiguar Dominios de un certificado

openssl x509 fichero -nouout -text

Apache / Varnish / Wordpress

Apache - Varnish - Wordpress

Que es Varnish

VArnish es un acelerador HTTP, el cual almacena en caché los recursos de un servidor web y poder
crear la misma página una y otra vez cuando el usuario lo solicite. Se ejecuta frente a un servidor Web y
sirve las páginas mucho más rápido.

Funcionalidades

  • Equilibrio de Carga
  • Reescritura de URL
  • Comprobación de Backends
  • Manejo elegante de backend muertos
  • Soporte parcial para ESI(Edge Side Includes)

Arquitectura

  • Caché monolítica mapeada a memoria virtual
  • Archivos configuración compilados en C
  • Trata todo el ciclo de vida de una petición
  • Cambios de configuración en caliente
  • Logs escritos en memoria compartida

Comandos

  • varnishtop ->Lista ocurrencias de los log más comunes
  • varnishstat ->Estadísticas en tiempo de real
  • varnishhist ->Hits y misses en tiempo real
  • varnishlog / varnishncsa ->Generan logs tradicionales
  • varnishreplay ->Parsea logs y reduce el tráfico
  • como validar la configuración -> varnishd -C -f /etc/varnish/default.vcl
Funciones Varnish - Rutinas

Cuando una petición HTTP llega a Varnish, éste la procesa llamando a las diferentes rutinas en un orden concreto, y se ejecuta el código que hay dentro de dichas subrutinas. Ese código puede ser el código por defecto de Varnish o bien código personalizado por nosotros.

De estas rutinas las que más vamos a usar son: vcl_recv() y vcl_fetch(), aunque vamos a ver todas las opciones disponibles:*

vcl_recv() >Cuando se recibe una petición HTTP Varnish lanza esta subrutina. Nos permite decidir si la aceptamos o no, cómo hacerlo y que backend usar.
  • vcl_fecth() >Se ejecuta después de haber obtenido del backend HTTP los datos solicitados, después de haberse acepta la petición de vcl_recv().


En todas las funciones podemos realizar diferentes acciones, para ello tenemos la función return() con las diferentes acciones dentro de ella:


Compilación de Varnish 4.1

Para poder compilar sin problemas debemos tener instalados los siguientes paquetes:

pygpgme
yum-utils
epel-release-n

Para instalar epel-release-6 (Servidor de pruebas 6.9)
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

Vamos al directorio de repositorios y creamos el nuestro para Varnish

/etc/yum.repos.d/

Creamos el archivo varnishcache_varnish41.repo con el siguiente contenido:

[varnishcache_varnish41]

  name=varnishcache_varnish41
  baseurl=https://packagecloud.io/varnishcache/varnish41/el/6/$basearch
  repo_gpgcheck=1
  gpgcheck=0
  enabled=1
  gpgkey=https://packagecloud.io/varnishcache/varnish41/gpgkey
  sslverify=1
  sslcacert=/etc/pki/tls/certs/ca-bundle.crt
  metadata_expire=300

[varnishcache_varnish41-source]

  name=varnishcache_varnish41-source
  baseurl=https://packagecloud.io/varnishcache/varnish41/el/6/SRPMS
  repo_gpgcheck=1
  gpgcheck=0
  enabled=1
  gpgkey=https://packagecloud.io/varnishcache/varnish41/gpgkey
  sslverify=1
  sslcacert=/etc/pki/tls/certs/ca-bundle.crt
  metadata_expire=300

Procedemos a la instalación:

sudo yum -q makecache -y --disablerepo='*' --enablerepo='varnishcache_varnish41'

Configuración Varnish

Parámetros de Arranque

Parámetros de arranque de Varnish, archivos de configuración:
/etc/sysconfig/varnish ->RedHat, CentOS, etc
/etc/default/varnish ->Debian, Ubuntu


# cat /etc/sysconfig/varnish
# Maximum number of open files (for ulimit -n)
NFILES=131072
# Locked shared memory (for ulimit -l)
# Default log size is 82MB + header
MEMLOCK=82000
# Maximum number of threads (for ulimit -u)
NPROCS="unlimited"
# Maximum size of corefile (for ulimit -c). Default in Fedora is 0
# DAEMON_COREFILE_LIMIT="unlimited"
# Init script support to reload/switch vcl without restart.
# To make this work, you need to set the following variables
# explicit: VARNISH_VCL_CONF, VARNISH_ADMIN_LISTEN_ADDRESS,
# VARNISH_ADMIN_LISTEN_PORT, VARNISH_SECRET_FILE.
RELOAD_VCL=1
# Set WARMUP_TIME to force a delay in reload-vcl between vcl.load and vcl.use
# This is useful when backend probe definitions need some time before declaring
# configured backends healthy, to avoid routing traffic to a non-healthy backend.
#WARMUP_TIME=0
# Main configuration file.
VARNISH_VCL_CONF=/etc/varnish/default.vc
# Default address and port to bind to
# Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
VARNISH_LISTEN_PORT=80
# Telnet admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
# Shared secret file for admin interface
VARNISH_SECRET_FILE=/etc/varnish/secret
# The minimum number of worker threads to start
VARNISH_MIN_THREADS=50
# The Maximum number of worker threads to start
VARNISH_MAX_THREADS=1000
# Cache file size: in bytes, optionally using k / M / G / T suffix.
VARNISH_STORAGE_SIZE=256M
# Backend storage specification
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}"
# Default TTL used when the backend does not specify one
VARNISH_TTL=120
# DAEMON_OPTS is used by the init script.
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
-f ${VARNISH_VCL_CONF} \
-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
-p thread_pool_min=${VARNISH_MIN_THREADS} \
-p thread_pool_max=${VARNISH_MAX_THREADS} \
-S ${VARNISH_SECRET_FILE} \
-s ${VARNISH_STORAGE}"
Las opciones más importantes son VARNISH_PORT Y VARNISH_VLC_CONF, sin estas dos parámetros no funcionará.
Configuración Caché

Tenemos el fichero /etc/varnish/default.vlc


Archivo de ejemplo:
# This is a basic VCL configuration file for varnish. See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition. Set this to point to your content
# server.
#
backend default {
.host = "127.0.0.1";
.port = "8080";


sub vcl_recv {
# Happens before we check if we have this in cache already.
# Typically you clean up the request here, removing cookies you don't need,
# rewriting the request, etc.
#Capamos las cookies de wordpress para wp-login y wp-admin
if (!(req.url ~ "wp-(login|admin)")) {
unset req.http.cookie;
}
#Capamos para el de cookies que podrían afectar al administrador
set req.http.cookie = regsuball(req.http.cookie, "wp-settings-\d+=[^;]+(; )?", "");
set req.http.cookie = regsuball(req.http.cookie, "wp-settings-time-\d+=[^;]+(; )?", "");
set req.http.cookie = regsuball(req.http.cookie, "wordpress_test_cookie=[^;]+(; )?", "");
if (req.http.cookie == "") {
unset req.http.cookie;
}
#No se cachea todo lo que acabe con wp-admin o wp-login
if (req.url ~ "wp-admin|wp-login") {
return (pass);
}
}
sub vcl_backend_response {
# Happens after we have read the response headers from the backend.
# Here you clean the response headers, removing silly Set-Cookie headers
# and other mistakes your backend does.
}
sub vcl_deliver {
# Happens when we have all the pieces we need, and are about to send the
# response to the client.
# You can do accounting or modifying the final object here.
}
El lenguaje de configuración de Varnish llamado VCL(Varnish Configuration Language). En esta configuración debemos definir una serie de subrutinas y código dentro de las mismas. Varnish llamará a cada una de esta subrutinas en algún punto de la petición.
Este lenguaje soporta estructuras "tipo if, include, comentarios de como //, /* */ y , salida de funciones con return(), asignaciones con =, comparaciones con ==, negaciÃşn con !, and y or lógico con y ||, matche o contra expresiones regulares con y establecer/eliminar atributos con set y unset. También tenemos funciones como regsub y regsuball (sustituciÃşn por expresiones regulares de una o todas las ocurrencias).


Varnish y Wordpress

Varnish y el contenido dinámico de Wordpress (prácticamente todo) no se llevan muy bien, para ello debemos configurar varnish para que ciertos contenidos los muestre estáticamente.
Ejemplo default.vcl para Wordpress
vcl 4.0;

import std;

# Default backend definition. Set this to point to your content server.

backend default {

.host = "127.0.0.1";

.port = "8080";

}

#Backend net-lz.com

backend netlz {

.host = "127.0.0.1";

.port = "8080";

}

#Backend gamesranking.info

backend gamesranking {

.host = "127.0.0.1";

.port = "8080";

}

#Backend trailersdecine.com

backend trailersdecine {

.host = "127.0.0.1";

.port = "8080";

}

sub vcl_recv {

#Control para ver que backend utilizar

if (req.http.host == "www.net-lz.com" || req.http.host == "net-lz.com"){
set req.backend_hint = netlz;

} elseif (req.http.host == "www.gamesranking.net" || req.http.host == "gamesranking.net"){
set req.backend_hint = gamesranking;

} elseif (req.http.host == "www.trailersdecine.com" || req.http.host == "trailersdecine.com"){
set req.backend_hint = trailersdecine;

}else {
set req.backend_hint = default;

}

#Si la petición es para 443 nos aseguramos que lo marqué en las cabeceras HTML

if (std.port(server.ip) == 443){
set req.http.X-Proto = "https";

}

#Tipos de codificaciones aceptadas

if (req.http.Accept-Encoding) {
if (req.url ~ "\.(gif|jpg|jpeg|swf|flv|mp3|mp4|pdf|ico|png|gz|tgz|bz2)(\?.*|)$") {

# remove req.http.Accept-Encoding;

} elsif (req.http.Accept-Encoding ~ "gzip") {

set req.http.Accept-Encoding = "gzip";

} elsif (req.http.Accept-Encoding ~ "deflate") {

set req.http.Accept-Encoding = "deflate";
} else {

#remove req.http.Accept-Encoding;

}

}

#Consultas archivos multimedia

if (req.url ~ "wp-content/themes/" && req.url ~ "\.(gif|jpg|jpeg|swf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {

unset req.http.cookie;

set req.url = regsub(req.url, "\?.*$", "");

}

#Consultas a otro tipos de archivos

if (req.url ~ "\?(utm_(campaign|medium|source|term)|adParams|client|cx|eid|fbid|feed|ref(id|src)?|v(er|iew))=") {

set req.url = regsub(req.url, "\?.*$", "");

}

# no cacheamos las cookies de administrador

# soluciona la redirección que se generaba al querer entrar como administrador

if (req.http.cookie) {

if (req.http.cookie ~ "(wordpress_|wp-settings-)") {

return(pass);

} else {

unset req.http.cookie;

}

}

#Desactivamos la cache para esta url

if (!(req.url ~ "wp-(login|admin)")) {

unset req.http.cookie;

}

#No cacheamos cookies específicas de wordpress

set req.http.cookie = regsuball(req.http.cookie, "wp-settings-\d+=[^;]+(; )?", "");

set req.http.cookie = regsuball(req.http.cookie, "wp-settings-time-\d+=[^;]+(; )?", "");

set req.http.cookie = regsuball(req.http.cookie, "wordpress_test_cookie=[^;]+(; )?", "");

#No cacheamos cookies en general

if (req.http.cookie == "") {

unset req.http.cookie;

}

#Pasamos sin cacheo las url con wp-admin y wp-login

if (req.url ~ "wp-admin|wp-login") {

return (pass);

}

}

#fin vcl_recv


sub vcl_backend_response {

set beresp.ttl = 10s;

set beresp.grace = 1h;

}

#Marcamos que debemos guardar cómo estadísticas

sub vcl_deliver {

if (obj.hits > 0) {

set resp.http.X-Cache = "HIT";

} else {

set resp.http.X-Cache = "MISS";

}

return (deliver);

} 



Podríamos añadir una configuración para permitir la opción purge desde diferentes sitios, este no se ha hecho debido a que tenemos instalado un plugin en la red multisite de worpdress que nos ofrece esta funcionalidad y la configuración Varnish ha sido diseñada con esta objetivo. Ver: https://varnish-cache.org/trac/wiki/VCLExamples

Configuración Varnish especiales

REMOTE ADDRESS PHP

Para que PHP pueda capturar las Ip de los usuarios que se conectan debemos añadir algunos cambios al archivo default.vcl de varnish.


Añadimos la siguiente configuración dentro del la subrutina vcl_recv:

#Control Varnish para que PHP puede devolver las IP de los usuarios que se conectan

if (req.restarts == 0) {
  if (req.http.x-forwarded-for) {
    set req.http.X-Forwarded-For =
    req.http.X-Forwarded-For + ", " + client.ip;
  } else {
    set req.http.X-Forwarded-For = client.ip;
  }
}

Ahora nos faltará 2 procesos, añadir unas líneas al Vhost de correspondiente y crear un fichero php que se encargará de asegurarnos que cojamos la ip buena.

Vhost de ejemplo:

<VirtualHost *:8080>
  DocumentRoot "/web/wordpress/static/trailersdecine"
  ServerName trailersdecine.com
  ServerAlias www.trailersdecine.com

  <Directory /web/wordpress/static/trailersdecine>
    #Linea para Varnish  
    php_value auto_prepend_file "/www/conf/sites/varnish_client_ip.php"
    AllowOverride All
    Order deny,allow
    Allow from all
  </Directory>
  
  
  CustomLog logs/common.trailersdecine combined
  ErrorLog logs/error.trailersdecine
  
  #Linea y log para varnish
  LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" varnish
  
</VirtualHost>

Como podéis observar dentro de Directory podemos ver como se hace una llamada al archivo varnish_client_ip.php, vamos a crearlo con el siguiente cotenido:

<?php
if( isset( $_SERVER[ 'HTTP_X_FORWARDED_FOR' ] ) ) {

  $_SERVER[ 'REMOTE_ADDR' ] = $_SERVER[ 'HTTP_X_FORWARDED_FOR' ];

} 

Con tal de no parar el servicio vamos a recargar ambos


Ya tenemos nuestro servicio ce cacheo listo

MOD HEADERS

Con tal de controlar las cabeceras que viene de http y https y permitir el trasposo de archivos multimedia entre estos dos protocolos debemos añadir configuración tanto a Varnish como en Apache.

Varnish mod_headers.


sub vcl_recv {
  # Save Origin in a custom header
  set req.http.X-Saved-Origin = req.http.Origin;
  # Remove Origin from the request so that backend
  # doesn't add CORS headers.
  unset req.http.Origin;
  ...
}




sub vcl_deliver {
  if (req.http.X-Saved-Origin == "https://www.trailersdecine.com"
  || req.http.X-Saved-Origin == "http://www.trailersdecine.com"
  || req.http.X-Saved-Origin == "https://trailersdecine.com"
  || req.http.X-Saved-Origin == "http://trailersdecine.com") {
    set resp.http.Access-Control-Allow-Origin =
    req.http.X-Saved-Origin;
  }
  if (resp.http.Vary) {
    set resp.http.Vary = resp.http.Vary + ",Origin";
  } else {
    set resp.http.Vary = "Origin";
  }
  ...
}
Apache mod_headers.
Para compilar el módulo si este no esta instalado:
/www/bin/apxs -i -c ./modules/metadata/mod_headers.c
Activación del módulo en Apache
En httpd.conf añadir al final

LoadModule headers_module /www/modules/mod_headers.so
En los Vhost de los dominios a controlar las cabeceras añadimos las línea:

Header set Access-Control-Allow-Origin "*"
Reiniciamos apache y Varnish y ya esta listo

Configuración Apache para Varnish

Como Varnish está a la escucha en el puerto 80, debemos indicarle a Apache que escuche en otro puerto, en este caso el 8080.

#Puertos de escucha
Listen *:8080
Listen *:443

#Módulos necesarios
LoadModule proxy_modulemodules/mod_proxy.so
LoadModule proxy_balancer_modulemodules/mod_proxy_balancer.so
LoadModule proxy_http_modulemodules/mod_proxy_http.so
LoadModulos mod_ssl

#NameVirtualHost
#!!Este paso no es estrictamente necesario!!
NameVirtualHost *:8080NameVirtualHost 217.13.124.73:443

Virtualhost para sitios sin SSL

<VirtualHost *:8080> 
  DocumentRoot "/web/wordpress/static/trailersdecine" 
  ServerName trailersdecine.com 
  ServerAlias www.trailersdecine.com 
  <Directory /web/wordpress/static/trailersdecine> 
    AllowOverride 
    All Order deny,allow 
    Allow from all 
  </Directory> 
  CustomLog logs/common.trailersdecine combined 
  ErrorLog logs/error.trailersdecine # Other directives here
</VirtualHost>


Es una configuración típica excepto con los puertos de escucha y con el puerto de escucha a la hora de configurar el Vhost: 8080.

Varnish y HTTPS

Varnish no soporta HTTPS, no podemos configurar Varnish para que escuche el puerto 443 simplemente.


Para solucionar este problema debemos configurar el virtualhost de la siguiente manera:

Virtualhost 443
<VirtualHost 217.13.124.73:443>
  ServerName trailersdecine.com
  ServerAlias www.trailersdecine.com
  ErrorLog logs/error_https.trailersdecine.com.log
  CustomLog logs/access_https.trailersdecine.com.log combined
  
  
  
  
  SSLEngine on
  SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
  SSLCertificateFile "/etc/letsencrypt/live/trailersdecine.com/fullchain.pem"
  SSLCertificateKeyFile "/etc/letsencrypt/live/trailersdecine.com/privkey.pem"
  ProxyPreserveHost On
  ProxyPass/ http://127.0.0.1:8080/
  ProxypassReverse/ http://127.0.0.1:8080/
</VirtualHost>


Podemos apreciar varias cosas en este fichero:
  1. No tiene la sentencia DocumentRoot
  2. Creamos la contestación a partir de la dirección interna y el puerto del escucha de Apache2

Una vez creado el VirtualHost para el puerto 443, reiniciamos los servicios y ya tenemos Varnish - Apache - HTTPS funcionando.

En la configuración de apache deberemos añadir:


  • NameVirtualHost 217.13.124.73:443

Enlaces de referencia

Squid3. Servidor Proxy

Servidor Proxy. Squid3

Ir a la navegación Ir a la búsqueda

Servidor proxy o intermediario

Es un programa o dispositivo que lleva a cabo tareas de acceso a Internet en el lugar de otro ordenador. Es un punto intermedio entre un ordenador conectado a Internet y el servidor al cuál esta accediendo.

Hay miles de servidores proxy repartidos por el mundo, muchos de ellos gratuitos. Es importante tener en cuenta que este tipo de servidor intermedio lo podemos utilizar para ocultar nuestra propia dirección IP, deberíamos cruzar varios servidores introduciendo en cada server nuevo la dirección obtenida por el anterior. Cabe decir, que tu camino seguido en la red quedará registrado igualmente, aunque tu auténtica dirección ip estará tras los servidores  proxy o pasarela.

Servidor-proxy.png

Ventajas

  1. Las pasarelas permiten únicamente aquellos servicios para los cuales hay un servidor intermedio habilitado.
  2. El protocolo tambíen puede ser filtrado, por ejemplo, filtrando el protocolo  FTP, seria posible prohibir el uso de la orden "put".
  3. Podemos filtrar direcciones IP.
  4. El acceso a las páginas web es mucho más rápido.
  5. Los usuarios no tienen acceso al encaminador, comunicación bajo control.
  6. Filtración de web y palabras.
  7. Guarda informe de las conexiones
  8. Más protección delante de ataques externos.

Desventajas

  1. Hace falta configurar todas las aplicaciones para que tengan acceso a internet.
  2. Si el servidor proxy falla, la red se quedará sin internet.
  3. Requiere mantenimiento.

Hay miles de servidores proxy repartidos por el mundo, muchos de ellos gratuitos. Es importante tener en cuenta que este tipo de servidor intermedio lo podemos utilizar para ocultar nuestra propia dirección IP, deberíamos cruzar varios servidores introduciendo en cada server nuevo la dirección obtenida por el anterior. Cabe decir, que tu camino seguido en la red quedará registrado igualmente, aunque tu auténtica dirección ip estará tras los servidores  proxy o pasarela.

Squid para Linux

A Continuación el comando para la instalación y la ubicación del archivo de configuración de Squid en Debian o Ubuntu.

  • apt-get install squid
  • /etc/squid/squid.conf

Algunas de las configuraciones que encontraremos dentro del archivo squid.conf son:

http_port. Sirve para indicar el puerto donde trabaja este servidor, así como la dirección ip que tiene asignada.

  • http_port 3128
  • http_port 192.168.10.50:8080

cache_mem. Indicaremos la capacidad de memoria de nuestro caché en el servidor proxy. Hay que tener en cuenta que ponemos un 16MB para 128 MB de RAM.

  • cache_mem 16MB

cache_dir. El tamaño que le queremos dar una nuestra memoria proxy que, sera la encargada de almacenar nuestras páginas favoritas entre otras cosas.

  • cache_dir ufs /var/spool/squid 1024  1  256. Siendo 1024 al capacidad otorgada.

cache_mgr. Opción en la configuración para enviar un correo electrónico en caso de fallida.

  • cache_mgr 12345@gmail.com

cache_replacement-policy. Podemos utilizar direrentes algoritmos para gestionar la memoria proxy.

  • LRU Least Recently Used
  • LFUDA Least Frequently Used with Dynamic Aging
  • GDSF GreedyDual size Frequency

Una muestra de un archivo de configuración:

Servidor-squid.png Como podéis ver, primero se crean la reglas (acl). Podemos crear reglas tanto como para horarios, palabras, direcciones web, subredes... A continuación os comento algunas de ellas.

Para prohibir palabras,direcciones web o subredes deberemos crear un archivo alternativo al de configuración de Squid para cada objetivo, es decir, uno para palabras prohibidas o admitidas, otro para las subredes prohibidas o admitidas y otro para las direcciones web exactamente igual.

Para los horarios basta con conocer el código internacional de los días... M-Monday, T-Tuesday, W-Wednesday, H-Thursday, F-Friday, A-Saturday y S-Sunday.

El cache de nuestro servidor proxy se encuentra en /var/spool/squid3

Si instalamos calamaris, podemos generar informes listos para impresión de los diferentes accesos a nuestro proxy,

  • apt-get install calamaris
  • sudo cat /var/log/squid3/access.log | calamaris

Errores Plesk

Error: Conflicto con el paquete DB4 al instalar

Si al instalar da un problema de conflicto similar a este:

The following could cause the installation failure:

1)Packages
"db4-4.6.21-2.fc8.i386 (u 0x2ec2b20 source=0x18dc800 P:7 R:17)" and
"db4-4.6.21-3.fc8.x86_64 (s 0x187a230 source=0x17d9800 P:7 R:11)"
cannot be installed at the same time
because of the conflict on the file "/usr/share/doc/db4-4.6.21/LICENSE"

2)Packages

"db4-4.6.21-2.fc8.x86_64 (u 0x2ec33d0 source=0x18dc800 P:7 R:11)" and
"db4-4.6.21-3.fc8.x86_64 (s 0x187a230 source=0x17d9800 P:7 R:11)"
cannot be installed at the same time
because of the conflict on the file "/lib64/libdb-4.6.so"

simplemente instalar entonces a mano con el yum

yum install db4-utils.x86_64

Error: Bad HTTP answer code. [Transport] Bad HTTP

Para solucionar esto se ha de desactivar la opción "offline_management" que permite gestionar el container por su IP, por ejemplo el host109 se podría acceder al host109.iw.dtic.es:4643, esto en algunas puede producir errores en el Plesk.

Para desactivar esta opción, desde el nodo central mirar el id de la máquina (abrir la pestaña del container "Container configuration" la opción Container ID) y ejecutar el siguiente comando en el virtuzzo .

vzctl set container_id --offline_management=yes --save

Si se quisiera volver a activar la opción:

vzctl set container_id --offline_management=no --save

Error: Could not activate firewall configuration o (Anorther admin is editing)

Dos posibilidades,

Error: El boton de continuar que no continua

Desactivar el servicio Single Sign On enabled de la siguiente manera:

/usr/local/psa/bin/sso -d

Error: Iptables esta dropeando todo

Si se realiza un iptables -F pierdes la máquina, así que se tiene que hacer un "service iptables stop" para parar el iptables.


Instalación Plesk en máquinas IWH

Al instalar el plesk se queja de varios paquetes y versiones, para solucionarlo realizar los siguientes pasos:

A partir de de este momento ya deberíamos poder instalar el plesk con la opción de "Full installation"

Error: Problemas con el open_basedir

Para desactivar el openbase_dir editar o crear el siguiente fichero

/var/www/vhost/dominio/conf/vhost.conf

y editarlo de la siguiente manera (ejemplo de smsplubli.com)

<Directory /var/www/vhosts/smspubli.com/httpdocs>
php_admin_value open_basedir none
</Directory>

Si el fichero vhost se crea de nuevo ejecutar el comando


/usr/local/psa/admin/bin/websrvmng -av (en el caso de para todos)
/usr/local/psa/admin/bin/websrvmng --reconfigure-vhost --vhost-name=dominio.com
/etc/init.d/httpd reload

EN caso del plesk 10:

/usr/local/psa/admin/bin/httpdmng --reconfigure-domain escalofrio.com

Añadir ServerAlias manualmente

Añadir la instrucción serveralias al vhost.conf en /var/www/dominio/conf (si no existe crearlo) y ejecutar

/usr/local/psa/admin/bin/websrvmng -av
/etc/rc.d/init.d/httpd reload

El fichero de configuración del apache para el plesk esta en:

/etc/httpd/conf.d/zz010_psa_httpd.conf

Error: Al iniciar apache en plesk

En caso de encontrarse que el apache no arranca y que en el log salta "Unable to open logs", revisar la variable ulimit

   #echo $ulimit

Si sale en blanco meter un limite

   #ulimit -n 524288

Y volver a arrancar el apache.

ActulizacióN:

En Plesk 8.X existe una limitación a 300 dominios, a partir de la cual habría que recompilar apache para dar soporte a más dominios sin problemas. Cuando un servidor con Plesk llega a este volumen, puede ocasionar problemas como “Too many open files” y no arraca el servicio. Este problema puede ser solucionado de varias formas. Una es ampliar el numero de ficheros que se pueden abrir usando:

ulimit -n 2048
/etc/init.d/apache restart

Para configurar estos parámetros se usa el fichero /etc/security/limits.conf o ficheros de configuracion en /etc/security/limits.d Por ejemplo para todos los usuarios poner un limite de ficheros abiertos 1024 y 65535 sería:

O directamente por consola:

ulimit -nH 65535
ulimit -nS 1024

La opción que recomienda Plesk para no tener que reiniciar apache y que está disponible desde la version 8.2 es esta:

http://kb.parallels.com/en/2066
mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa -e "replace into misc (param,val) values ('apache_pipelog', 'true');"
/usr/local/psa/admin/sbin/websrvmng -v -a
/etc/init.d/apache restart

Otra opción alternativa es mirar los limites del kernel con sysctl Se podría forzar de las siguientes formas:

echo 65535 > /proc/sys/fs/file-max

O bien agregar en /etc/sysctl.conf la linea

fs.file-max=65535

Si el error no es aplicable a Plesk, se puede intentar eliminar los semaforos que usa apache con esta linea :

ipcs -s | grep apache | awk '{print $2}' | xargs ipcrm -s


Error: Too Many filescon el plesk 10

En el /etc/rc.d/init.d/httpd han puesto un ulimit de 2048, pero se queda corto. Editar el fichero y hacerlo de : ulimit -n 524288

Error: al arrancar el http de sistema en lugar del plesk

Si salta la pagina de inicio de la centos, es que se ha arrancado el http del centos. Arrancar el httpd del plesk:

/usr/sbin/httpd -k stop
/usr/sbin/httpd -k start

Actualización de los Templates para las máquinas virtuales

En caso que al crear la máquina diera conflicto de paquetes, actualizar los paquetes de los templates (que no es lo mismo que actualizar el sistema).

vzup2date -z

Seleccionar las versiones de Centos y Redhat Actual o directamente:

vzup2date -z -m batch install centos-5-x86_64

Una vez haya bajado aplicar las actualizaciones que haya metido en cache.

vzpkg update iwh-hosting

Configuración del password para el Panel de Control de Plesk

El panel de control de plesk es independiente al servidor web del plesk, este es un lighttpd que arrancar automáticamente con el servicio psa y que contiene la configuración en el siguiente fichero:

/etc/sw-cp-server/applications.d/plesk.conf

Añadir el modulo mod_auth en caso que no este en la lista de modulos a cargar:

server.modules += ("mod_expire", "mod_fastcgi", "mod_rewrite", "mod_accesslog", "mod_alias", "mod_compress", "mod_auth")

Al final de cada sección server añadir la configuración de la autentificación:

auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/etc/htpasswd"
auth.require = ( "/" =>
(
"method" => "basic",
"realm" => "Directorio protegido",
"require" => "user=carlost"
)
)

Crear el fichero pertinente en el usuario y el password:

htpasswd -c /etc/htpasswd carlost

Reiniciar el servicio psa:

/etc/rc.d/init.d/psa stop
/etc/rc.d/init.d/psa start

Al acceder a https://direccion_servidor:8443 ya debería solicitar el usuario y el password.

En el Plesk10: añadir el mod_auth al plesk.conf y en el fichero plesk.socket.sh añadir la parte de auth despues de la parte de url.rewrite-once (está al final). Tener cuidado con el cierre de "}"


Autorización en Plesk 11

Editar el fichero //etc/sw-cp-server

{
               listen 8443 ssl;
               listen 8880;
               include conf.d/*ipv6_ports.inc;
               allow 217.13.124.0/24;
               auth_basic "Restricted";
               auth_basic_user_file /etc/psa/psa.htpasswd;
               deny all;
               ssl_certificate /usr/local/psa/admin/conf/httpsd.pem;
               ssl_certificate_key /usr/local/psa/admin/conf/httpsd.pem;
               include conf.d/*plesk.inc;
               include conf.d/*wpb.inc;
               include conf.d/*cbm.inc;
               include conf.d/*sso.inc;
}

server/conf.d/plesk.conf

reiniciar el servicio 
buscar el proceso 
netstat -a -n -p | grep 8443 
ps -Af | grep sw-cp-server
ejemplo: 
root     20012     1  0 19:30 ?        00:00:00 sw-cp-server: master process /usr/sbin/sw-
cp-serverd -c /etc/sw-cp-server/config
502      20013 20012  0 19:30 ?        00:00:00 sw-cp-server: worker process 

Matarlos sin compasión! Seguidamente cuando ya no haya nada escuchando en el 8443 reiniciar el proceso:

/usr/sbin/sw-cp-serverd -c /etc/sw-cp-server/config

Configuración e instalación del certificado de impresiones web

El certificado se tiene que instalar en el dominio secure.impresionesweb.com que es un plesk. Generar la clave .key y si al añadir al plesk este se queja con el siguiente error “Format invalid” entonces tener en cuenta lo siguiente:

.- There is one thing to watch out when setting up a SSL certificate with Plesk, it may say “Unable to set the private key: Probably, the private key format is invalid.” That is most probably if you used something like: openssl genrsa -des3 -out server.key 1024 to generate your SSL key. To fix the “problem”, all you have to do is: openssl rsa -in server.key -out apache.key

Por otro lado el certificado no está asociado al dominio si no que esta asociado a la IP, En la configuración de Ips, desasociar el certificado indicando que no use ninguno, en este punto ya podemos borrar el certificado antiguo y añadir el nuevo. En cuanto lo haya aceptado ir al menu de Ips y volver a asociar el certificado a la IP.


Generación del key:

Generación de algo de basura para el la key

head -25 /usr/bin/* > rand.dat
cat rand.dat 

Generación del certificado

openssl genrsa  -rand rand.dat -out impresiones.key 2048 
openssl req  -new  -key impresiones.key > impresiones.csr 


Respuestas para secure.impresionesweb.com

Country Name (2 letter code) [GB]:ES
State or Province Name (full name) [Berkshire]:Madrid
Locality Name (eg, city) [Newbury]:Madrid
Organization Name (eg, company) [My Company Ltd]:Impresionesweb
Organizational Unit Name (eg, section) []:Programacion
Common Name (eg, your name or your server's hostname) []:secure.impresionesweb.com
Email Address []:info@impresionesweb.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:ImpresionesWeb rules
An optional company name []:Impresionesweb

Con esto generamos el .key y el .csr

Error: Falta de espacio en Host102

En ocasiones al hacer backup deja archivos temporales en la siguiente ubicación /usr/local/psa/PMM/tmp/ del tipo backupXXXXXX ... se pueden borrar

Error: No se puede arrancar el panel de control del plesk

Al actualizar el sistema, como el plesk es una basura, no es compatible con las nuevas versiones de ssl. El error se puede ver mirando el fichero:

tail /var/log/sw-cp-server/error_log

Donde apareceran errores del tipo:

2010-04-07 02:13:38: (network.c.336) SSL: error:00000000:lib(0):func(0):reason(0)

Si se tiene el humor y valor suficiente probar de meter una versión anterior del ssl (borrar el rpm e instalar una versión anterior, arriesgado, pero no sería la primera vez). Lo mejor es meter los parches del propio plesk que se encuentran en la siguiente página http://kb.parallels.com/8338, bajar la versión correspondiente del paquete y hacer un:

rpm -Uvh sw-.....

Error: Al actualizar el sistema con el zzz_atmail_vhost.conf

Después de hacer un yum update y reiniciar el plesk, puede dar el problema:

httpd: Syntax error on line 211 of /etc/httpd/conf/httpd.conf: Syntax error on line 6 of  /etc/httpd/conf.d/zzz_atmail_vhost.conf: Include directory '/etc/psa/webmail/atmail/conf.d'  not found...

Este sucede porque los ficheros del paquete no están en psa-webmail, simplemente copiarlos a la carpeta de la siguiente manera:

cp -a /etc/psa-webmail/atmail /etc/psa/webmail/

Y reiniciar

Instalación JSON

instalar repositorio atomic

wget -q -O - http://www.atomicorp.com/installers/atomic.sh |sh (como se tenía que hacer un update del php y daba problemas por tema versiones)

Probar de instalar el json a mano ...

instalar php-pear 
pecl json

si da problemas de memoria editar fichero /usr/share/pear/

ini_set('memory_limit', '32M');

instalación de paquetes para php-devel:

http://autoinstall.plesk.com/PSA_9.2.1/update-rpm-CentOS-5-x86_64/) -> repasar 

si no encuentra el phpsize se tendrá que instalar el php-devel probar si el yum install php-devel (si tiene que instalar el php cancelar!!!)


Cambio del directorio por defecto de plesk

El directorio por defecto que carga el plesk es /var/www/vhosts/default/htpdocs.

Si no se quiere modificar la configuración del apache hacer un mount -o bind del dominio que se quiere en el htdocs

mount -o /var/www/vhost/midominio/httpdocs /var/www/vhosts/default/htdocs


GENERACIÓN CERTIFICADO PLESK para un dominio

1.- Ingresar al panel de plesk y vaya al dominio que quiere que tenga el certificado.

2.- Una vez dentro del dominio aprete sobre el icono denominado ‘certificados’, una vez dentro pulsar ‘Añadir certificado ‘

3.- Introduzca El nombre de referencia del certificado y rellene los datos que corresponde al grupo ‘preferencias’ de manera correcta, luego pulse el boton ‘Solicitar’.

4.-Una vez creado, plesk le mostrara el nombre de referencia del certificado. Pulsar sobre el nombre de referencia del certificado para que pueda ver el código CSR y la LLAVE PRIMARIA; antes de estos estan sus datos, los cuales no se pueden editar. Copie ambos en un archivo de texto,incluyendo los titulos que se encuentran entre guiones.

5.-Vaya a su proveedor de certificados e ingrese el CSR que guardo en el anterior paso. El proveedor le dara parte cuando el certificado este listo.

6.-Una vez enviado al proveedor el CSR trate de no borrar el que genero en plesk, por que por más que sean los mismos datos que ingrese el CSR no coincidira con el que tiene(el que envio a su proveedor)

7.-Una vez que tenga el certificado, copielo en un archivo de texto (incluyendo los titulos entre guiones) y guardelo.

8.- Entrar al panel de plesk y vaya al dominio donde creo el certificado. En la opcion ‘certificado’ (campo examinar) seleccione el archivo donde se encuentra el certificado y luego pulse subir archivo. Si todo marcha bien el certificado se agregara sin problemas.

9.-Despues de lo anterior ir a configuración del dominio ‘Configurar’, en donde despues del desplegable de la dirección IP se muestra otro desplegable de los certificados, seleccionar el certificado creado. Luego verificar la casilla ‘Soporte SSL´

Modificación de la configuración apache de un dominio

Igual que en el caso de querer añadir cualquier alias a un dominio de forma manual, cualquier configuración "añadida a mano" a la configuración del dominio se tiene que hacer añadiendo un fichero vhost.conf o vhost_ssl.conf en caso que se quiera aplicar a https. Una vez hechos los cambios, lanzar la siguiente instrucción

/opt/psa/admin/bin/websrvmng --reconfigure-vhost --vhost-name=dominio.com -a -v 

Comprobar que la configuración del apache es correcta

apachectl -t 

Y por último reiniciar el servicio del apache

service httpd restart

Si la configuración se quiere añadir al directorio por defecto, en este caso editar únicamente el fichero /etc/httpd/conf.d/z010_psa_httpd.conf

Dominio por defecto en PLESK

Si queremos cambiar el dominio default por alguno de los dominios configurados en el plesk podemos de dos formas:

- Con un mount -o bind httpdocs /var/www/vhost/domion_que_quremos/httpdocs 
- Modificando en el plesk, en el menu principal la gestión de IPs  y en la opción "default domain" 


phpMyAdmin file not found /domains/databases/phpMyAdmin/export.php

En caso de encontrar este error, aumentar la memoria del php en el fichero /usr/local/psa/admin/conf/php.ini

Problemas al añadir dominios en el servidor de Hugo(104)

Antes de añadir un dominio realizar la copia del fichero /etc/httpd/conf.d/zz010_psa_httpd.conf a /etc/httpd/conf.d/zz010_psa_httpd.conf.actual, ya que el Plesk modificará el fichero y en caso de error se podrá usar este fichero.

Una vez añadido el nuevo dominio, dentro del fichero /etc/httpd/conf.d/zz010_psa_httpd.conf el Plesk dejará los siguientes cambios:

<Directory "/var/www/vhosts">
       AllowOverride All
       Options SymLinksIfOwnerMatch     
       Order allow,deny
       Allow from all
       <IfModule sapi_apache2.c>
       php_admin_flag engine off
       </IfModule>
       <IfModule mod_php5.c> 
       php_admin_flag engine off
       </IfModule>
</Directory>

Los cambios que se tienen que realizar son:

<Directory "/var/www/vhosts">
       AllowOverride All
       Options FollowSymLinks   
       Order allow,deny
       Allow from all
       <IfModule sapi_apache2.c>
       php_admin_flag engine off
       admin_value safe_mode Off
       </IfModule>
       <IfModule mod_php5.c>
       php_admin_flag engine off
       php_admin_flag safe_mode off
       </IfModule>
</Directory>

Por último, es necesario comentar las líneas de open_basedir

<VirtualHost \
                       ip:80 \
                       ip:80 \
                       >
       ServerName default
       UseCanonicalName Off
       DocumentRoot /var/www/vhosts/default/htdocs
       ScriptAlias /cgi-bin/ "/var/www/vhosts/default/cgi-bin/"
       <IfModule mod_ssl.c>
               SSLEngine off
       </IfModule>
       <Directory "/var/www/vhosts/default/cgi-bin/">
               AllowOverride None
               Options None
               Order allow,deny
               Allow from all
       </Directory>
       <Directory /var/www/vhosts/default/htdocs>
       <IfModule sapi_apache2.c>
               php_admin_flag engine on
               php_admin_flag safe_mode off
  1. php_admin_value open_basedir "/var/www/vhosts/default/htdocs:/tmp"
       </IfModule>
       <IfModule mod_php5.c>
               php_admin_flag engine on
               php_admin_flag safe_mode off
  1. php_admin_value open_basedir "/var/www/vhosts/default/htdocs:/tmp"
       </IfModule>
       </Directory>
</VirtualHost>

Con estos cambios ya se puede cerrar el fichero, y comprobar la configuración con:

/usr/sbin/httpd  -t

Si no hay ningún error, reiniciar el apache:

/etc/rc.d/init.d/httpd restart


y ya debería funcionar.

En caso de error, si se ha realizado la copia del fichero /etc/httpd/conf.d/zz010_psa_httpd.conf.actual, copiar de nuevo este fichero a /etc/httpd/conf.d/zz010_psa_httpd.conf, editar de nuevo el fichero e incluir al final de este la línea

Include /var/www/vhosts/nuevo_dominio/conf/httpd.include 

Y reiniciar el apache

Consulta password cuenta FTP

select accounts.password from accounts INNER JOIN sys_users ON accounts.id=sys_users.account_id WHERE sys_users.login='borricos';

Control de la cola de mensajes en Plesk

The Plesk control panel itself provides a modified version od qmHandle ( http://qmhandle.sourceforge.net/ )along with it that can be used with ease to manage the queue To see the statistics of the queue:

/usr/local/psa/admin/bin/mailqueuemng -s
Messages in local queue:  0
Messages in remote queue: 0
Messages in todo queue:   0
Messages total:           0
Messages found:           0
Timestamp: 1215870834


From this you can see the status of qmails local,remote and todo list If you wish to do a delivery of the queued messages now run the following command

/usr/local/psa/admin/bin/mailqueuemng -a

To list remote message queue:

/usr/local/psa/admin/bin/mailqueuemng -R

List local message queue:

/usr/local/psa/admin/bin/mailqueuemng -L

To list message queue:

list message queues -l

To delete messages with a particular pattern in the subject line

/usr/local/psa/admin/bin/mailqueuemng -S”text”
eg: /usr/local/psa/admin/bin/mailqueuemng -S”failure notice”
will delete all delivery failed messages

To delete all messages in the queue (Use with caution - possible data loss )

/usr/local/psa/admin/bin/mailqueuemng -D

En el host112 en la cola de mess se acumulan los mensajes con "failure notice", pa liberar :

/usr/local/psa/admin/bin/mailqueuemng -S"failure notice"


Cambio de los alias de los diferentes demonios en QMAIL

Para cambiar o eliminar las direcciones a los que los diferentes demonios envía el qmail (el qmailer, el spamassassin, etc...) en el directorio /var/qmail/alias/:

ls -la
total 36 
drwxr-sr-x  2 alias qmail 4096 May  8 14:16 .
drwxr-xr-x 11 root  qmail 4096 May 25  2010 ..
-rw-r--r--  1 root  qmail   24 May  8 13:49 .qmail-anonymous
-rw-r--r--  1 root  qmail   24 May  8 13:49 .qmail-drweb
-rw-r--r--  1 root  qmail   24 May  8 13:49 .qmail-drweb-daemon
-rw-r--r--  1 root  qmail    2 May  8 14:16 .qmail-mailer-daemon
-rw-r--r--  1 root  qmail   24 May  8 13:49 .qmail-mailman
-rw-r--r--  1 root  qmail    2 May  8 14:15 .qmail-postmaster
-rw-r--r--  1 root  qmail   24 May  8 13:49 .qmail-root
bash-3.2# cat .qmail-mailer-daemon
#
(vigilar que únicamente tenga el #, cualquier espacio hará que no arranque el qmail)

Si se quiere poner una dirección:

&root@host109.iw.dtic.es

(se puede ir añadiendo direcciones con &)

Limpiar cola'

/usr/local/psa/admin/sbin/mailqueuemng  -D

Error: QMAIL: Unable to get 'From:' string from SMTP

Bajar el update (está tambien en el root del host109)

http://forum.parallels.com/showpost.php?p=400963&postcount=51

Parar el qmail (en otro caso no podremos sobreescribir el fichero)

tar xvfj update.tar.bz2
cp -p /var/qmail/bin/qmail-queue /var/qmail/bin/qmail-queue.bak
cp update/dist-rpm-Centos-5-x86_64/qmail-queue /var/qmail/bin/
chmod  /var/qmail/bin/qmail-queue --reference=/var/qmail/bin/qmail-queue.bat
chown mhandlers-user:popuser /var/qmail/bin/qmail-queue

Arrancar el qmail y rezar...

Creación de una alias de dominio para el correo

Para crear un dominio alias de otro, se tienen que acceder a las opciones "avazandas". En el panel de control, bajo la pestaña de "Websites & Domains", debajo de los inconos está el link Show Advanced Operations.

Desplegar y mostrará la opción Domain alias.

Página original de la info:

http://myhosting.com/kb/index.php?title=How_to_Create_Domain_Aliases_in_Plesk_10

Actualización del openssl

En caso de error al reiniciar plesk (seguramente debido a la actulización del openssl), se puede mirar el registro: /var/log/sw-cp-server/error_log

wget -c http://kb.parallels.com/Attachments/12669/Attachments/sw-cp-server-1.0-6.201004011105.centos5.i386.rpm
rpm -Uhv sw-cp-server-1.0-6.201004011105.centos5.i386.rpm
http://kb.parallels.com/8338

Consultar el pass de un usario Plesk

SELECT accounts.password FROM accounts INNER JOIN sys_users ON accounts.id=sys_users.account_id WHERE sys_users.login='UserLogin';

Cambiar UserLogin por el nombre el usuario.


Listar las cuentas de correo y redirección

SELECT concat(mail.mail_name,"@",domains.name),mail_redir.address FROM domains LEFT JOIN mail ON domains.id = mail.dom_id LEFT JOIN accounts ON mail.account_id = accounts.id LEFT JOIN mail_redir ON mail_redir.mn_id=mail.id ORDER BY  mail.id ASC ;


Redirigir al puerto 25 al 587 para evitar bloqueos

iptables -t nat -A PREROUTING -p tcp --dport 587 -i eth0 -j REDIRECT --to-ports 25


Se continuan recibiendo avisos "key update deferral notification":

http://kb.parallels.com/en/111198

Error: mod_rewrite: could not create rewrite_log_lock

En tal caso se puede solucionar a lo bestia mediante un rebote o con el siguiente comando:

ipcs -s | grep apache | awk ' { print $2 } ' | xargs ipcrm sem

Para mostrar el uso de semaforos del sistema:

/sbin/sysctl -a | grep sem

ej:

kernel.sem = 200 32000 32 128 

Increase with:

/sbin/sysctl -w kernel.sem=250

and make permanent after a reboot with:

kernel.sem = 250
in your /etc/sysctl.conf 

Se comenta que este error puede ser debido a que la máquina esté comprometida (mirar que los semaforos sean del usuario apache!):

http://forum.parallels.com/showthread.php?t=94801


Actualización de las licencias de plesk a una versión posterior 9.5

Tener en cuenta que no permite pasar a versiones anteriores una vez actualizada! Para pasar a 10.3 se hace desde el panel que gestión de licencias que proporcionan los de plesk. Para consultar la licencia que está en uso en el PLESK:

grep 'key-number' /etc/sw/keys/keys/key* ( http://kb.parallels.com/en/5207)

Error: Al añadir usuario a la base de datos: Table 'mysql.servers' doesn't exist

Esto pasa porqué los permisos del plesk en la base de datos están mal, para solucionarlo hacer lo siguiente:

mysql_fix_privilege_tables --user=admin --password=(TUPASSWORDDEADMIN) --verbose

Se puede ignorar los errores de columnas duplicadas...

Recuperación passwords correo

SELECT  mail.mail_name, accounts.password, domains.name FROM domains LEFT JOIN mail ON domains.id = mail.dom_id LEFT JOIN describeON mail.account_id = accounts.id;
/usr/local/psa/bin/admin --show-password

Actualización PHP en plesk

Para actualizar el plesk a la versión 5.2.17 instalar el repositorio de atomic

wget -q -O - http://www.atomicorp.com/installers/atomic.sh |sh

y hacer el update con el exclude del 5.3!!!

yum update php --exclude=php*5.3*

Antes de confirmar asegurarse que lo que va a instalar es lo correcto y que el repositorio es el de atomic o el de plesk ! ejemplo:

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Updating:
 php                     x86_64     5.2.17-1.el5.art  atomic            1.3 M
Installing for dependencies:
 libXaw                  x86_64     1.0.2-8.1        base              329 k
 libXmu                  x86_64     1.0.2-5          base               63 k
 t1lib                   x86_64     5.1.2-2.el5.art  atomic            208 k
Updating for dependencies:
 php-cli                 x86_64     5.2.17-1.el5.art  atomic            2.4 M
 php-common              x86_64     5.2.17-1.el5.art  atomic            282 k
 php-gd                  x86_64     5.2.17-1.el5.art  atomic            124 k
 php-imap                x86_64     5.2.17-1.el5.art  atomic             52 k
 php-mbstring            x86_64     5.2.17-1.el5.art  atomic            1.1 M
 php-mysql               x86_64     5.2.17-1.el5.art  atomic             86 k
 php-pdo                 x86_64     5.2.17-1.el5.art  atomic             66 k
 php-xml                 x86_64     5.2.17-1.el5.art  atomic            118 k
Transaction Summary
=============================================================================

En caso de duda abortar!


IMPORTANTE: REPOSITORIO PSA: http://autoinstall.plesk.com/PSA_9.2.1/dist-rpm-RedHat-el5-x86_64/opt/ (mirar la versión pertinente en caso de tener que instalar el .devel


Error: No space left on device: Failed to create global mutex

Si aparece este error y no arranca el apache, añadir la siguiente línea al sysctl.conf

kernel.sem = 512 32000 100 512
Realizar "sysctl -p"  y probar de arrancar el apache.

Error: Failed Login de todos los usuarios

Después de una actualización fallida, al Plesk ha comenzado ha rechazar a todos los usuarios de correo dando el error de LOGIN FAILED (mirar el fichero de log: /usr/local/psa/var/log/maillog)

Reiniciar los servicios de qmail y courier-imap

Si sigue fallando comprobar que exista el fichero /var/lib/plesk/mail/auth/passwd.db .Este fichero es el fichero de autentificación de los usuarios de correo.

Seguidamente se puede lanzar el comando: /usr/local/psa/admin/sbin/mail_auth_view

Esto mostrará todas las cuentas de correo, el password y los Flasgs asociados. En caso de estar disabled

/usr/local/psa/bin/domain -u payxpert -status enabled
/usr/local/psa/bin/domain -u newtechonline.es  -mail_service true

Password de Admin en Plesk 11

Para recuperar el password de admin en las versiones posteriores a la10 donde el /etc/psa/.psa.shadow está encriptado usar el comando:

/usr/local/psa/bin/admin --show-password

Cómo definir qué MTA se usa en Parallels Plesk Panel y cómo cambiar de Qmail a Postfix y viceversa

La versión 9 de Parallels Plesk Panel soporta dos MTAs (Message Transfer Agents):Qmail y Postfix. Parallels Plesk Panel sólo usa uno de ellos de forma simultánea.

El MTA usado en este momento por Parallels Plesk Panel se muestra en la páginaAdministración de Servicios

{Inicio -> Administración de Servicios}:
SMTP Server (Postfix)
o
SMTP Server (QMail)

También puede comprobar el MTA utilizando la utilidad mailmng de Parallels Plesk Panel:

~# $PRODUCT_ROOT_D/admin/sbin/mailmng --features | grep SMTP_Server
 $features['SMTP_Server'] = "Postfix";
 $features['SMTP_Server_package'] = "postfix";
~#

o

~# $PRODUCT_ROOT_D/admin/sbin/mailmng --features | grep SMTP_Server
 $features['SMTP_Server'] = "QMail";
 $features['SMTP_Server_package'] = "psa-qmail";
~#

Resolución

Puede cambiar de MTA de Qmail a Postfix y viceversa utilizando el script autoinstaller.

Ejecute el script sin parámetros:

~# /usr/local/psa/bin/autoinstaller

Seleccione Parallels Plesk Panel 9 (instalado actualmente) en la cuarta página. Desactive todas las demás aplicaciones comoSSO y Parallels Plesk Sitebuilder.

En la página Lista de Componentes Principales para Parallels Panel, seleccione el servidor de correo Qmail o Postfix y presione Enter para completar la instalación.

También puede ejecutar el siguiente comando para cambiar el MTA a Postfix:

~# /usr/local/psa/admin/sbin/autoinstaller --select-release-current --install-component postfix

Para cambiar el MTA a Qmail:

~# /usr/local/psa/admin/sbin/autoinstaller --select-release-current --install-component qmail

Consultar fecha expiración Dominio

select d.name,from_unixtime(l.value) as 'expiration date' from Limits l join domains d on d.limits_id=l.id where l.limit_name = 'expiration' order by 'expiration date';

Mails en cola de qmail

At the command prompt, type: /var/qmail/bin/qmail-qstat To list multiple messages in the queue, type:

/var/qmail/bin/qmail-qread
kill -ALRM `ps ax | grep qmail-send | grep -v grep | awk '{print $1}'`
/usr/local/psa/admin/sbin/mailqueuemng -l

Borrar la cosa de ficheros:

find /var/qmail/queue/mess -type f -exec rm {} \;
find /var/qmail/queue/info -type f -exec rm {} \;
find /var/qmail/queue/local -type f -exec rm {} \;
find /var/qmail/queue/intd -type f -exec rm {} \;
find /var/qmail/queue/todo -type f -exec rm {} \;
find /var/qmail/queue/remote -type f -exec rm {} \;

Problemas licencia Virtuozzo

Para ver la información sobre la licencia del virtuozzo:

vzlicview


Para forzar su actualización comprobar que se pueda acceder al puerto 5224 del servidor ka.parallels.com (lo pone en la información de la licenia como keyserver_host)

Una vez comprobado que se pueda conectar, lanzar el siguente comando para forzar la actualización de la licencia:

/usr/sbin/vzkeyupdate -n

Reparacion tablas mysql

mysqlcheck -A -r -p

Error: al instalar plesk INTERNAL ERROR

Internal error: Dependent row(s) 'smb_roles.id = 1' isn't found for 'smb_users.roleId = 1'.

Message     Dependent row(s) 'smb_roles.id = 1' isn't found for 'smb_users.roleId = 1'.
File     Abstract.php
Line     206
Type     Exception


Si da un error similar lanzar el siguiente comando para actualizar la información del admin:

/usr/local/psa/bin/admin --show-password MservDt001$
/usr/local/psa/bin/init_conf -u -passwd MservDt001$

Instalar yum en contenedores virtuozzo

vzpkg install -p 277 yum

Actualizar licencia

Info licencia:

/usr/local/psa/bin/keyinfo --list 

Generar licencia: /usr/local/psa/admin/bin/keymng --install --source-file /etc/sw/keys/keys/keyXXJGEWSg

Las keys están en:

cd /etc/sw/keys/keys/

LVM

LVM

[1]

Sistema de gestión de volumenes avanzado para el kernel de Linux, nos permite gestionar el espacio de almacenamiento de una manera mucho más flexible que de la manera tradicional. Entre sus carecterísticas tenemos:

A partir de la versión del núcleo de Linux 2.6 podemos contar con soporte para LVM2, aún así debemos instalar las herramientas de uso.

apt install lvm2

Preparación de un entorno para pruebas

Siempre podemos añadir una máquina virtual con diferentes discos y hacer pruebas con ellos, pero como LVM puede utilizarse sobre cualquier dispositivos de bloques vamos a crear diferentes ficheros gracias a que los dispositivos de bucle -loop device- trataremos comos discos físicos.

dd if=/dev/zero of=fichero0 bs=1M count =100
losetup /dev/loop0 fichero0
dd if/dev/zero of=fichero1 bs=1 count=100
losetup /dev/loop1 fichero1

Iniciando dispositivos

Para poder crear volúmenes lógicos antes debemos iniciar estos "ficheros-discos virtuales" como volúmen lógico.

pv create /dev/loop0
pv create /dev/loop1

Volume Group

Podemos crear un grupo de volúmenes a partir de los volúmenes físicos virtuales creados.

vgcreate mi_grupovm /dev/loop0 /dev/loop1

Activando / DesActivando los VG

Solo cuando un grupo de volumenes lógicos esta activo se puede acceder a los volúmenes logicos que contiene. Para activar y desactivar los grupos tenemos el comando:

vgchange -a y mi_grupovm

Para eliminar un grupo de volumenes es necesario asegurarse que no hay dentro ningún volumen lógico. Primero desactivamos el grupo:

vgchange -a n mi_grupovm

Después eliminamos:

vgremove mi_grupovm

Para añadir un volumen físico más:

vgextend mi_grupovm /dev/loop2

Eliminando un volumen físico: Primero utilizamos el comando pvdisplay /dev/loop2. Esto lo hacemos para comprobar que ningún volumen lógico este utilizando dicho volumen físico. Lo vemos bajo el atributo Allocated PE Para extraer el volumen físico:

vgreduce mi_grupovm /dev/loop2

Creacion de volumen lógico

Indicando los MBs:

lvcreate -L 10M -n lv1 mi_grupovm

Indicando los extends:

lvcreate -l 3 lv2 mi_grupovm

Indicando el volume lógico a utilizar:

lvcreate -L 10M -n lv3 mi_grupovm /dev/loop1

Borrado de volumenes lógicos

lvremove lv1

Utilizando el volumen lógico

mkdir /mnt/disco1 /mnt/disco2 /mnt/disco3
mkfs.ext3 /dev/mi_grupovm/lv1
mount /dev/mi_grupovm/lv1 /mnt/disco1

SnapShots

Para poder crear instantáneas debemos instalar activar el módulo dm-snapshot.

modprobe dm-snapshot

Es posible crear una instantánea de un volúmen lógico (LV), y montar la instantánea para hacer una copia de seguridad. Cuando creamos una instántanea se debe indicar el tamaño máximo que se utilizará para guardar los cambios sobre el volumen original.

lvcreate -L20M -s -n congelado /dev/mi_grupovm/lv2

Podemos montar la instantánea y trabajar sobre ella.

mkdir /mnt/congelado
mount /dev/mi_grupovm/congelado /mnt/congelado

Docker

  1. Obtener información
docker info
docker network info
docker volume info
  1. Ver número de procesos levantados (contenedores levantados). Muy útil para encontrar de manera rápida el identificador del contenedor
docker ps
  1. Entra en un terminal del contenedor
docker exec it Id_container sh 
  1. Entra en el log del contendor
docker attach Id_container
  1. Ver archivos de configuración
docker inspect Id_container
  1. Para borrar
docker system prune -a
docker image prune
docker container prune
docker volume prune
docker network prune
  1. Para listar
docker system ls
docker image ls
docker volume ls
docker network ls
docker container ls
  1. Descargar y levantar una imagen
docker run -d --name graphite --restart=always -p 8080:80 -p 2003-2004:2003-2004 -p 2023-2024:2023-2024  -p 8125:8125/udp -p 8126:8126 graphiteapp/graphite-statsd
  1. Parada y arrancada de un contenedor
docker stop name or id // docker start name or id
  1. Levantar una imagen descargada
docker build -t hopsoft/docker-graphite-statsd ./docker-graphite-statsd/
  1. Levantar imagen con compose
Debe lanzarse en el directorio donde se encuentre el archivo docker-compose.yml
docker-compose up
  1. Logs de los containers
docker logs name_container

openvz

Introducción

El OpenVZ es un projecto de virtualización basado en containers. OpenVz crea containers (tambien llamados Ves o VPSs) que son entidades independientes y que pueden poseer su propia IP , recursos, usuarios, etc... es decir es en si mismo un sistema independiente. El proyecto es la base de la versión comercial Parallels Virtuozo. Para más info: wiki.openvz.org

Instalación CentOs

La instalación del Openvz se puede realizar mediante repositorio:

cd /etc/yum.repos.d wget http.//download.openvz.org/openvz.repo rpm –import http://download.openvz.org/RPM-GPG-Key-OpenVZ 

Una instalado el repositorio ya se puede instalar mediante yum el kernel necesario para ejecutar el openvz

yum install ovzkernel 

Configuración

Configurar parametros del sistema operativo: (editar fichero sysctl.conf)

# On Hardware Node we generally need packet 
forwarding enabled and proxy arp disabled 
net.ipv4.ip_forward = 1 
net.ipv6.conf.default.forwarding = 1 
net.ipv6.conf.all.forwarding = 1 
net.ipv4.conf.default.proxy_arp = 0 
# Enables source route verification net.ipv4.conf.all.rp_filter = 1 
# Enables the magic-sysrq key kernel.sysrq = 1 
# We do not want all our interfaces to send redirects net.ipv4.conf.default.send_redirects = 1 net.ipv4.conf.all.send_redirects = 0 

Y por último desactivar el selinux, en el fichero /etc/sysconfig/selinux realizar el siguiente cambio

SELINUX=disabled Reiniciar la máquina y cargar la opción con el ovzkernel. 

Creación máquinas

Para la gestión de los containers es necesaria la instalación del vzctl

yum install vzctl vzquota 

Arrancar el servicio

/sbin/service vz start 

Antes de la creación de cualquier container tenemos que bajarnos los templates o crear uno especifico, para comenzar nos bajaremos un template ya creado.. Podemos bajar templates ya creados desde la siguiente dirección: [1]

Una vez ya tengamos los templates crearemos el container usando nuestro template:

vzctl create 1001 –ostemplate nombre_template 

configurar los parametros del container

vzctl set --ipadd ipaddr --nameserver nameserverIP --hostname hostname --save 

En este punto ya deberíamos ser capaces de arrancar la máquina

vzctl start vpsid 

Para consultar los recursos que esta consumiendo

vzcalc -v vpsid 

Para indicar que el container se inicie en el arranque:

vzctl set vpsid --onboot yes --save 

Podemos realizar cambios del resto de parametros de la configuración de igual manera:

vzctl set vpsid --vmguarpages $((256 * 256)) --save

Toda la configuración se almacena en /etc/vz/conf/container_id.conf , así que ante grandes cambios se puede modificar directamente el fichero de configuración y el comando vzcfgvalidate para validar si el fichero de configuración es correcto.

Uso de Containers

Si en un momento dado necesitamos entrar en la máquina, lo haremos de la siguiente manera:

vzctl enter vpid 

De esta forma entraremos directamente en la máquina como usuario root y sin que nos pida el password, realizaremos el trabajo que tengamos que hacer dentro de la máquina y saldremos de esta con un simple exit. Si lo que queremos es resetear el password, igual que con los cambios de configuración usaremos el vzctl

vzctl set vpsid --userpasswd user:passwd 

Por último, si no queremos entrar,si no que simplemente queremos ejecutar un comando dentro de la maquina:

vzctl exec vpsid apt-get upgrade

Borrado de Containers

La última gestión que podemos realizar sobre el container es la eliminación del container, cuando se realiza no pide confirmación y elimina el container y todo el contenido, así que mejor pensarselo dos veces antes de dar al enter. Para eliminar un container lo que tenemos que hacer es llamaar a vzctl con el parametro destroy y el id del container.

vzctl destroy veid

Hadoop / Spark

Hadoop

Apache Hadoop es un framework de software que soporta aplicaciones distribuidas. Permite a las aplicaciones trabajar con miles de nodos y petabytes de dtos.

Arquitectura Hadoop

El Hadoop Distributed File System (HDFS) es un sistema de archivos distribuido, escalable y portátil escrito en Java para el framework Hadoop. Cada nodo en una instancia Hadoop típicamente tiene un único nodo de datos; un clúster de datos forma el clúster HDFS.

Spark

Descripción Spark

Spark es un sistema de computación en clúster de propósito general. Puede implementar y ejecutar aplicaciones paralelas en clústeres que van desde un solo nodo hasta miles de nodos distribuidos. Spark fue diseñado originalmente para ejecutar aplicaciones Scala, pero también es compatible con Java, Python y R

Este cluster de Spark correrá bajo el protocolo Yarn de HADOOP. Los trabajos de Spark pueden ejecutarse en YARN en dos modos: modo de clúster y modo de cliente. Comprender la diferencia entre los dos modos es importante para elegir una configuración de asignación de memoria adecuada y para enviar trabajos como se espera.

Los trabajos de Spark constan de dos partes:

Modo Clúster Todo se ejecuta dentro del clúster. Puede iniciar un trabajo desde cualquier equipo y el trabajo continuará ejecutándose incluso si se cierra el equipo desde donde se lanzo el trabajo. En este modo el controlador Spark se encapsula dentro del YARN Application Master.

Modo Cliente El controlador se ejecuta en el equipo cliente, si el equipo cliente se apaga el trabajo falla. El modo cliente es adecuado para trabajos interactivos pero para trabajos de larga ejecución, el modo el clúster es más apropiado.

Funcionamiento Las aplicaciones Spark se ejecutan como conjuntos independientes de procesos en un clúster, coordinados por el objeto SparkContext (Progama controlador).

Siendo más específico, SparkContext para ejecutarse en el clúster puede conectarse a varios tipos de administradores de clúster (el propio Spark , Mesos o Yarn, siendo este último el de nuestra instalación), que asigna recursos entre las aplicaciones. Una vez conectado, Spark adquiere ejecutores en nodos de clúster, que son procesos que ejecutan cálculos y almacenan datos para su aplicación. A continuación, envía su código de aplicación (definido por los archivos JAR o Python pasados a SparkContext) a los ejecutores. Finalmente, SparkContext envía tareas a los ejecutores para ejecutar.

Funcionamiento-spark.png

Instalación Hadoop

Para la instalación de Hadoop hemos seguido el siguiente tutorial: https://www.linode.com/docs/databases/hadoop/how-to-install-and-set-up-hadoop-cluster/

Equipos para la instalación TEST Spark -> 45.79.207.240 (Maestro y Esclavo) cool-ad14 -> 172.104.214.142 (Esclavo)

Paso 1 Creación de /etc/hosts. Debemos añadir a cada /etc/hosts todos las máquinas que participan en el clúster

45.79.207.240 spark
172.104.214.142 node-ad14

Paso 2 Creación del usuario hadoop y clave pública. Debemos crear un usuario con el nombre hadoop en cada máquina.

   User: hadoop
   Pass: passwd

Solo nos faltará crear una clave pública en el maestro y compartilo con el propio maestro y los esclavos.

   Máquina Spark / Usuario hadoop
   ssk-keygen -b 4096
   ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@spark
   ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node-ad14

Paso 3 En el Master. Dentro de la carpeta /home/hadoop con el usuario hadoop nos descargamos el fichero.tar.gz que contiene hadoop.

https://hadoop.apache.org/
https://archive.apache.org/dist/hadoop/common/hadoop-3.1.2/hadoop-3.1.2.tar.gz
   Descomprimimos   / tar -xvzf hadoop-3.1.2.tar.gz
   Cambio de nombre / mv hadoop-3.2.1 hadoop


Paso 4 Variables de entorno. En el fichero /home/hadoop/.profile añadimos la siguiente línea. Si el fichero no existe hemos de crearlo:

PATH=/home/hadoop/hadoop/bin:/home/hadoop/hadoop/sbin:$PATH

Paso 5 Configuración de JAVA. Si no tenemos java instalado debemos instalarlo

yum install jdk-1.8.0-devel

Una vez instalado debemos conocer la ubicación de la carpeta jre, para saberlo utilizamos el siguiente comando:

   update-alternatives --display java

Una vez obtenemos la ruta de java, hacemos un export de la variable JAVA_HOME en hadoop-env.sh

/home/hadoop/hadoop/etc/hadoop/hadoop-env.sh

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre


Paso 6 Archivos de configuración. Establecemos el master. /home/hadoop/hadoop/etc/hadoop/core-site.xml

<configuration>
       <property>
           <name>fs.default.name</name>
           <value>hdfs://node-master:9000</value>
       </property>
</configuration>


Establecemos los path para hdfs. /home/hadoop/hadoop/etc/hadoop/hdfs-site.xml

<configuration>
   <property>
           <name>dfs.namenode.name.dir</name>
           <value>/home/hadoop/data/nameNode</value>
   </property>
   <property>
           <name>dfs.datanode.data.dir</name>
           <value>/home/hadoop/data/dataNode</value>
   </property>
   <property>
           <name>dfs.replication</name>
           <value>1</value>
   </property>
</configuration>

La última propiedad dfs.replication, indica cuántas veces se replican los datos en el clúster. Por ejemplo podríamos configurar con 2 para que todos los datos se duplicasen en ambos nodos, NO INGRESAR UN VALOR MÁS ALTO QUE EL NÚMERO DE NODOS ESCLAVOS.


Establecemos Yarn como el framework por defecto para las operaciones de Mapreduce. /home/hadoop/hadoop/etc/hadoop/mapred-site.xml

<configuration>
   <property>
           <name>mapreduce.framework.name</name>
           <value>yarn</value>
   </property>
</configuration>


Configuración Yarn ~/hadoop/etc/hadoop/yarn-site.xml

<configuration>
   <property>
           <name>yarn.acl.enable</name>
           <value>0</value>
   </property>
   <property>
           <name>yarn.resourcemanager.hostname</name>
           <value>node-master</value>
   </property>
   <property>
           <name>yarn.nodemanager.aux-services</name>
           <value>mapreduce_shuffle</value>
   </property>
</configuration>


Configuración de esclavos. En la documentación que hemos leído se utiliza un fichero llamado slaves, pero actualmente se está utilizando un fichero que se llama workers.

Dentro del fichero /home/hadoop/hadoop/etc/hadoop/workers
localhost
node-ad14



Configuración de la asignación memoria. La asignación de memoria puede ser complicada en nodos de RAM baja porque los valores predeterminados no son adecuados para nodos con menos de 8GB de RAM. Vamos a destacar como funciona la asignación de memoria para los trabajos de MapReduce y veremos una configuración para nodos de 2GB de RAM.


Propiedades de la asignación de memoria. Un operación con Yarn tiene dos tipos de procesos:

Ambos tipos de procesos se ejecutan en los nodos esclavos. Cada nodo esclavo ejecuta un demonio NodeManager que es responsable de la creación del contenedor en el nodo. Todo el clúster es administrado por un ResourceManager que programa la asignación de contenedores en todos los nodos esclavos, según los requisitos de capacidad y el cargo actual.

Tenemos cuatro tipos de asignación deben configurarse para el clúster funcione correctamente.

Cuánta memoria se puede asignar para los contenedores YARN en un solo nodo. Este límite debe ser más alto que todos los demás, de lo contrario la asignación de contenedores será rechazada y las aplicaciones fallan. Sin embargo no debe ser la cantidad total de RAM en el Nodo.

yarn.nodemanager.resource.memory-mb

Cuánta memoria puede consumir un contenedor y la asignación de memoria mínima permitida. Un contenedor nunca será más grande que el máximo, o la asignación fallará y siempre se asignará como un múltiplo de la cantidad mínima de RAM.

yarn.scheduler.maximum-allocation-mb
yarn.scheduler.minimum-allocation-mb


Cuánta memoria se le asignará al AplicationMaster. Este es un valor constante que debe ser inferior al de tamaño máximo del contenedor.

yarn.app.mapreduce.am.resource.mb


Cuańta memoria se le asignará a cada mapa.

mapreduce.map.memory.mb
mapreduce.reduce.memory.mb

   

Ejemplo de configuración de 2GB de RAM por NODO.

yarn.nodemanager.resource.memory-mb    1536
yarn.scheduler.maximum-allocation-mb    1536
yarn.scheduler.minimum-allocation-mb    128
yarn.app.mapreduce.am.resource.mb    512
mapreduce.map.memory.mb            256
mapreduce.reduce.memory.mb        256


~/hadoop/etc/hadoop/yarn-site.xml

<property>
       <name>yarn.nodemanager.resource.memory-mb</name>
       <value>1536</value>
</property>
<property>
       <name>yarn.scheduler.maximum-allocation-mb</name>
       <value>1536</value>
</property>
<property>
       <name>yarn.scheduler.minimum-allocation-mb</name>
       <value>128</value>
</property>
<property>
       <name>yarn.nodemanager.vmem-check-enabled</name>
       <value>false</value>
</property>

~/hadoop/etc/hadoop/mapred-site.xml

<property>
       <name>yarn.app.mapreduce.am.resource.mb</name>
       <value>512</value>
</property>
<property>
       <name>mapreduce.map.memory.mb</name>
       <value>256</value>
</property>
<property>
       <name>mapreduce.reduce.memory.mb</name>
       <value>256</value>
</property>

Paso 7

Replicación de los binarios de hadoop y los archivos de configuración. Pasamos los binarios y las configuración que hicimos anteriormente en el maestro hacia los esclavos asignados.

Paso 8 Formatear HDFS. HDFS necesita ser formateado como cualquier clásico sistema de ficheros. En no nodo maestro ejecutar el siguiente comando:

   /home/hadoop/hadoop/bin/hdfs namenode -format

Una vez termina hadoop está listo para iniciarse.

Paso 9 y último Antes de levantar Hadoop vamos a securizar los puertos de escucha controlando las conexiones desde el iptables tanto del nodo-maestro como de los nodos-esclavos.

Lista de puertos a controlar en el< nodo maestro

9000 - 9684 -9866 - 9867 - 9868 - 9870
8040 - 8042 - 8088 - 8030 - 8031 - 8033 
40773 - 36550 - 27017

Preparamos el firewall y levantamos.

Arranque de Hadoop

Esta sección explicará cómo iniciar HDFS en NameNode y DataNodes, y controlará que todo funcione correctamente e interactúe con los datos HDFS.

Inicio y parada de HDFS En el nodo maestro lanzamos con el usuario hadoop:

/home/hadoop/hadoop/sbin/start-dfs.sh

Una vez finalizado la ejecución comprobamos los procesos java con el comando jps, tanto en el nodo maestro como en los esclavos, nos tiene que aparecer algo así:

NODO MAESTRO

21922 Jps
21603 NameNode
21787 SecondaryNameNode

NODO ESCLAVO

19728 DataNode
19819 Jps

Si queremos ver un reporte de los nodos conectados y del clúster utilizamos el comando

/home/hadoop/hadoop/bin/hdfs dfsadmin -report

Para parar el funcionamiento de hadoop:

/home/hadoop/hadoop/sbin/stop-dfs.sh


Inicio y parada de Yarn En el nodo maestro lanzamos con el usuario hadoop:

/home/hadoop/hadoop/sbin/start-yarn.sh


Para comprobar que los nodos están trabajando con yarn

/home/hadoop/hadoop/bin/yarn node -list

Plataforma web de yarn http://spark:8080

Instalación de Spark

Para la instalació de Apache Spark, simplemente necesitamos realizar la descarga de los ficheros de binarios y descomprimirlos, y clonar el repositorio para el conector con Cassandra.

Nos descargamos el tar de ficheros binarios de Apache Spark del siguiente enlace: http://apache.rediris.es/spark/spark-<version>/spark-<version>-bin-hadoop2.7.tgz P.e:

  1. cd /install
  2. wget http://apache.rediris.es/spark/spark-2.3.0/spark-2.3.0-bin-hadoop2.7.tgz

Ya solo debemos descomprimir el archivo en /usr/local (o en otra ruta si fuera mas pertinente):

  1. cd /usr/local
  2. tar -zxf /install/spark-2.3.0-bin-hadoop2.7.tgz

Hacemos un clone del repositorio de git del conector de Cassandra:

  1. git clone https://github.com/datastax/spark-cassandra-connector

Integración de Spark con Hadoop

Para la comunicación con el administrador de recursos YARN, Spark debe conocer la configuración de Hadoop. Esto se hace a través de la variable de entorno HADOOP_CONF_DIR

Editamos /home/hadoop/.profile

export HADOOP_CONF_DIR=/home/hadoop/hadoop/etc/hadoop
export SPARK_HOME=/usr/local/spark
export LD_LIBRARY_PATH=/home/hadoop/hadoop/lib/native:$LD_LIBRARY_PATH

Reiniciamos la sesión.

Renombramos el archivo spark-defaults.conf.template ha spark-defaults.conf Este archivo se encuentra en la ubicación de Spark, normalmente en:

/usr/local/spark

ASIGNACIÓN DE MEMORIA EN SPARK Como le hemos pasado la ruta de la configuración de Hadoop, Spark cogerá la configuración de memoria para contenedores y a se la aplicará, aún así hemos de configurar algunas asignaciones de memoria en spark y otras cosas, hago un breve resumen más abajo con las variables necesarias.

Editamos spark-defaults.conf, le añadimos la siguiente líneas al final del archivo:

  1. Para qué spark sepa que ha de funcionar con Yarn.
spark.master yarn
  1. Cantidad predeterminada de memoria asignada a Spark.driver en el clúster.
spark.driver.memory     512m
spark.yarn.am.memory    512m
spark.executor.memory   896m
  1. Monitorización
spark.eventLog.enabled false
spark.eventLog.dir hdfs://spark:9000/spark-logs
spark.history.provider            org.apache.spark.deploy.history.FsHistoryProvider
spark.history.fs.logDirectory     hdfs://spark:9000/spark-logs
spark.history.fs.update.interval  10s
spark.history.ui.port             18080