Servicios Avanzados
- Ansible
- Let'encrypt
- Apache / Varnish / Wordpress
- Squid3. Servidor Proxy
- Errores Plesk
- LVM
- Docker
- openvz
- Hadoop / Spark
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.
-
-
-
- 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:
- hosts - Grupo donde queremos trabajar
- become
- become_method
- vars: En este fichero también podemos definir variables, aquí se definirán variables que no tienen carácter general y que para ejecución diferentes podría variar.
- roles: los procesos que queremos ejecutar en la instalación, en este caso solo se lanzaría el proceso spark.
Comandos útiles
- ansible-playbook install.yml
Usando el ejemplo anterior inicializará la instalación de spark en el grupo de máquinas cool_ads_us
- ansible imp_rtb_bcn -a “ls /etc/”
Lanzaría el comando ls en la carpeta /etc/ de todas las máquinas del grupo imp_rtb_bcn
- ansible -m copy -a "src=scripts_init dest=/root" cool-ad11
Copia el contenido de la carpeta scripts_init en /root de la máquina cool-ad11
- ansible blockchain
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:
- por defecto. letsencrypt-auto .... Este modo obtiene el certificado y lo instalo en el vhost correspondiente.
- certonly. letsencrypt-auto certonly. Este modo solo obtiene el certificado
- renew. Este método solo renueva el certificado
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
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_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:
- pass ->Si para la petición en curso devolvemos pass, la peticiÃşn se envia al servidor Backend sin buscarse en la caché y la respuesta del backend http se devuelve al usuario sin cachearse.
- pipe ->Esta acciÃşn çortocircuita. el cliente HTTP y el Backend HTTP de forma que Varnish se limita a transferir datos de uno a otro. Es similar a pass (no se cachea) y ademÃąs Varnish no se dedica a inspeccionar el trÃąfico HTTP ni rellenar los objetos req/beresp/obj por lo que a veces se utiliza para evitar que objetos muy grandes (vÃŋdeos, etc) sean "procesados"por varnish.
- lookup ->Fuerza a Varnish a que devuelva el objeto desde la caché incluso si la petición en sí mísma está solicitando contenido no cacheado.
- deliver ->Le indica a Varnish que queremos devolver el objeto cacheado si es posible.
- hit_for_pass ->Similar a pass (pero accesible desde vcl_fetch) salvo porque crea un objeto de tipo hitforpass y lo que se hace en este caso es cachear la decisión de no cachear.
- restart ->Una forma de volver a ejecutar la lógica desde el principio.
- vcl_hash() >Permite alterar el hash que se utiliza para gestionar el objeto en la cachÃľ. Normalmente es la URL pero podemos alterar dicho hash a nuestra voluntad. Un ejemplo sería cachear la página del perfil (/profile/) de cada usuario, aÃśadiendo concatenando la cookie de usuario a la URL, lo que generaría un objeto distinto en cada para cada usuario.
- vcl_pipe() >Modo Pipe
- vcl_pass() >Podemos forzar a que se reinicie la transacción, lo cual incrementa un contador interno de restart"que podemos detectar en otras funciones.
- vcl_hit() >Llamada cuando lookup en la caché encuentra un objeto válido.
- vcl_miss() >Es llamada cuando lookup no encuentra un objeto válido.
- vcl_error() >LLamada cuando se encuentra un error por cualquier motivo.
- vcl_deliver() >Es llamada antes de que un objeto cacheado sea entregado al cliente HTTP.
Compilación de Varnish 4.1
Para poder compilar sin problemas debemos tener instalados los siguientes paquetes:
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
/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
# 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.
}
Varnish y 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
- service varnish reload
- /www/bin/apachectl stop
- /www/bin/apachectl start
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";
}
...
}
/www/bin/apxs -i -c ./modules/metadata/mod_headers.c
LoadModule headers_module /www/modules/mod_headers.so
Header set Access-Control-Allow-Origin "*"
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>
- No tiene la sentencia DocumentRoot
- 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
- https://bash-prompt.net/guides/apache-varnish/https://varnish-cache.org/trac/wiki/VCLExamples
-
http://www.digitalvalley.com/blog/configurar-varnish-para-aumentar-la-velocidad-de-web/
-
http://techinfobest.com/getting-real-client-ip-through-varnish/
Squid3. Servidor Proxy
Servidor Proxy. Squid3
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.
Ventajas
- Las pasarelas permiten únicamente aquellos servicios para los cuales hay un servidor intermedio habilitado.
- El protocolo tambíen puede ser filtrado, por ejemplo, filtrando el protocolo FTP, seria posible prohibir el uso de la orden "put".
- Podemos filtrar direcciones IP.
- El acceso a las páginas web es mucho más rápido.
- Los usuarios no tienen acceso al encaminador, comunicación bajo control.
- Filtración de web y palabras.
- Guarda informe de las conexiones
- Más protección delante de ataques externos.
Desventajas
- Hace falta configurar todas las aplicaciones para que tengan acceso a internet.
- Si el servidor proxy falla, la red se quedará sin internet.
- 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:
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,
- hacer un touch del fichero /usr/local/psa/var/modules/firewall/active.flag (no nos funcionaba en nuestro caso)
- mover el fichero /usr/local/psa/var/modules/firewall/safeact.confirm a otro nombre...
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:
- yum -y remove xulrunner
- yum groupinstall "development libraries" "development tools"
- yum -y remove xulrunner * (por si le da por volver a instalarlo)
- yum -y remove httpd
- yum -y remove bind-libs
- yum -y remove apr
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:
- soft nofile 1024
- hard nofile 65535
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:
- Modificar la línea Options SymLinksIfOwnerMatch y poner Options FollowSymLinks para que no de error al intentar acceder al directorio.
- Añadir la línea admin_value safe_mode Off y php_admin_flag safe_mode of para evitar problemas con el PHP, por lo que la estructura tendrá que quedar de la siguiente forma:
<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
- 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
- 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)
- Descomprimir
tar xvfj update.tar.bz2
- Hacer un backup del qmail-queue
cp -p /var/qmail/bin/qmail-queue /var/qmail/bin/qmail-queue.bak
- Copiar el nuevo binario
cp update/dist-rpm-Centos-5-x86_64/qmail-queue /var/qmail/bin/
- Dar permisos y cambiar propietario
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
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:
- Redimensionado de grupos lógicos.
- Redimensionado de volúmenes lógicos.
- Instantáneas de sólo lectura. LVM2 ofrece lectura y escritura.
- RAID0 de volúmenes lógicos.
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
- Obtener información
docker info docker network info docker volume info
- Ver número de procesos levantados (contenedores levantados). Muy útil para encontrar de manera rápida el identificador del contenedor
docker ps
- Entra en un terminal del contenedor
docker exec it Id_container sh
- Entra en el log del contendor
docker attach Id_container
- Ver archivos de configuración
docker inspect Id_container
- Para borrar
docker system prune -a docker image prune docker container prune docker volume prune docker network prune
- Para listar
docker system ls docker image ls docker volume ls docker network ls docker container ls
- 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
- Parada y arrancada de un contenedor
docker stop name or id // docker start name or id
- Levantar una imagen descargada
docker build -t hopsoft/docker-graphite-statsd ./docker-graphite-statsd/
- Levantar imagen con compose
Debe lanzarse en el directorio donde se encuentre el archivo docker-compose.yml docker-compose up
- 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:
- Ejecutores Spark. Ejecutan las tareas reales.
- Controlador Spark. Organiza los ejecutores.
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.
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:
- Application Master(AM) Responsable de monitorizar la aplicación y coordinar los ejecutores distribuidos por el clúster.
- Ejecutores propios para realizar los actuales trabajos.
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:
Ya solo debemos descomprimir el archivo en /usr/local (o en otra ruta si fuera mas pertinente):
- cd /usr/local
- tar -zxf /install/spark-2.3.0-bin-hadoop2.7.tgz
Hacemos un clone del repositorio de git del conector de Cassandra:
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:
- Para qué spark sepa que ha de funcionar con Yarn.
spark.master yarn
- 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
- 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