Instalacion de un servidor basico centos 7, tomcat 9, postgres 12 con pgpool

INSTALACION DE UN SERVIDOR BASICO CENTOS 7.7 - TOMCAT 9.0 - POSTGRES 9.4.
==============================================================

 version: 1.2.f 28/12/2019 16:33

Linux : Breve introduccion a los sistemas *NIX

Que es YUM:
- Yellow dog Updater, Modified es una herramienta libre de gestión
de paquetes para sistemas Linux basados en RPM. Fue desarrollado
por Seth Vidal y un grupo de programadores voluntarios, y
actualmente se mantiene como parte del proyecto Linux@DUKE de la
Universidad de Duke

- Que es RPM:
RPM Package Manager (o RPM, originalmente llamado Red Hat Package Manager,
pero se convirtió en acrónimo recursivo1​) es una herramienta de administración
de paquetes pensada básicamente para GNU/Linux. Es capaz de instalar,
actualizar, desinstalar, verificar y solicitar programas.
 RPM es el formato de paquete de partida del Linux Standard Base.

Originalmente desarrollado por Red Hat para Red Hat Linux, en
la actualidad muchas distribuciones GNU/Linux lo usan, dentro de las cuales
las más destacadas son Fedora, Mandriva, Mageia, PCLinuxOS, openSUSE,
SuSE Linux.
También se ha portado a otros sistemas operativos.

Inicialmente las instalaciones se hacian por RPM, pero surgio el
inconveniente de que RPM no instala la librerias y recursos que son necesarios
para el correcto funcionamiento de lo que se esta instalando (dependencias),
ese inconveneniente lo soluciona YUM, que utiliza el proceso RPM , pero adicionalmente
identifica y carga las dependencias necesarias sin necesidad de intervencion
humana.
Nota: Yum es comando de instalcaion de las distribuciones que heredan de
RED HAT, loas que heredan de por ejemplo debian usan otros comandos como APT
aunque en el fondo su funcionamiento es similar.

- Instalar un editor de texto (emacs o nano) por ejemplo para que nos
permita editar los archivos a intervenir mas adelante.
Se debe djar claro que debe ser un editor de consola, ya que las instaciones
de servidores no tienen en su mayoria consola grafica.

 #sudo yum install emacs

- Defincion de variables locales LOCAL = utf-8
Este proceso garqntiza que la conexiones tipo VNC y Putty localicen el local
del servidor y no el de su propio sistema

 # sudo emacs /etc/locale.conf 

Grabar o editar en este archivo lo siguiente:

LANG=en_US.utf8

si todo quedo correcto verificar :

# sudo localectl status

Debe ver algo como esto
LANG=en_US.utf8


- Modelo de conectividad:
Por lo genereral los proveedores de servicios de servidores entregan
estos con ssh sobre el puerto 22 como mode de conexion,  si se va a
establecer la conexion desde una extensiones linux debe tener ssh
instaldo.

   # yum install ssh*

Si desea hacer desde windows puede hacerlo mediante el programa
putty:
      https://www.putty.org/

se recomienda tambien el uso de filezilla client para subir y bajar
informacion desde y hasta el servidor:
     https://filezilla-project.org/

- Uso del del comando # sudo
Los sistemas linux tiene en general un usuario administrador del sistema
con permisos de  usuario, grupo y otros muy amplio. (root)
Dado a los problemas de seguridad y permanente exposicion a ataques de
los servidores en la web, los proveedores de servicio suelen ultimamente
restringir estos permisos y exigir que toda la administracion se haga
mediante el comando de consola de seguridad

# sudo

Ante puesto a todos los comandos de los diferentes procesos.
En este instructivo hace eco de esta politica recomendando ampliamente
que haga de esta manera por seguridad.

- limpiar pantalla para clarificar lo que se esta haciendo

     # sudo clear

- Listar archivos
     # sudo ls -l     //lista archivos y carpetas
     # sudo ls -a     //Lista incluso archivos ocultos
     # sudo ls -p     //Lista con el contenido de las carpetas

- Copiar archivos
     # sudo cp origen destino

- Mover archvios
     # sudo mv origen destino

- Saber en que carpeta se esta
     # sudo pwd

- Borrar archivos
    # sudo rm archivo

- Borrar carpetas con todo su contenido
    # sudo rpm -R carpeta

- Cambiar permisos de un archivo
  - propietario: # sudo chown -R usuario_propietario archivo
  - grupo      : # sudo chown -R grupo propietario   archivo
  - permisos   : # sudo ghgrp -R ugo+wrx             archivo
                 donde u: permisos de usuario.
                       g: permisos de grupo.
                       o: permisos de otros.

                       w: permiso de escritura (write)
                       r: permiso de lectura   (read)
                       x: permiso de ejcucion  (execute)
                 

Pasos a tener en cuenta a la hora de una reinstalacion.
Colocar la fecha del sistema a la hora actual, recordadr que no todos los
sistemas en el mismo uso horario.
Esto es importante para controlar la hora de los resplados y copias de
acuerdo a las hora y fecha de operacion e ubicacion del sistema.
Este paso solo se puede hacer en servidores dedicados, en VPS, por ser
virtualizaciones y en generar tener varias instancias de otros usuarios
esta opcion esta desahibilitada.

Ejemplo de cambio desde consola : # sudo date --set "2019-10-24 19:52"

1.  
     Es una buena practica no permitir que mediante el comando ping verifiquen
     el accerso a al  servidor.

     #Desactivar PING
     # sudo echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

     instalar mlocate, que permite localizar archivo en el sistema de una forma sencilla
     para verificar si en una instalion quedaron los archivos necesarios.
     implemta uodatedb que actuliza el directorio de carpetas y archivos de linux
     y locate que permite localizar cualquier cosa en el sistema.

     #sudo yum install mlocate

     Antes de hacer cualquier consulta generar la actualizacion del sistema
     # sudo updatedb

     Para localizar un archivo por ejemplo:
     # locate postgresql.conf

  Pasos recomendable antes de empezar una instalacion , pues actualiza los
  paquetes a la ultima version disponible.
   # sudo yum upgrade
   # sudo yum update

   Intalar un corta fuegos para manejo de puertos y seguridad, centos rcomienda
   firewalld, como su corta fuegos de defecto si por alguna razon (Los VPS) no
   permiten abrir y cerrar puertos de forma general, se recomienda instalar IPTABLES.

   # sudo yum install polkit*
   # sudo yum install firewall*                                                                                                         
     
   opcional (en casos como en instalaciones en VPS)
   # sudo yum install iptables*                                                                                                         

   Si hubo necesidad de instalar el polkit es necesario re iniciar el sistema,
   el proceso puede tomar unos 5 minutos en cancelar la instancia y levantarla
   de nuevo dependiendo de la plataforma y el proveedor del servicio.

   Nota: Recordar que los sistemas tipo VPS, tiene restriccion a varios comandos
   ya que son sistemas compartidos , por lo tanto los puertos abiertos, la
   cantidad de memoria disponible, cantidad de CPU , y los comandos asociados
   a ellos como firewall (apertura de puertos) y ulimit para establecer mas memoria
   no estaran disponibles en este tipo de configuraciones.

   En esos casos la forma de hacerlo si se requiere es solicitarlo al operador
   de plataaforma que le indicara si es viable o no esta opcion.

   -iniciarlo                                                                                                                            
   # sudo reboot

   #sudo service firewalld start
  
   Puerto webmin
   # sudo firewall-cmd --zone=public --add-port=10000/tcp --permanent

   si lo pudo abrir responde con:
   sucess
   Si el puerto ya esta abierto responde con:
   Warning: ALREADY_ENABLED: 8080:tcp

   Puerto apache (http)
   # sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
   Puerto tomcat
   # sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
   # sudo firewall-cmd --zone=public --add-port=9080/tcp --permanent
   # sudo firewall-cmd --zone=public --add-port=9180/tcp --permanent
   Puerto https (ssl - tls)
   # sudo firewall-cmd --zone=public --add-port=443/tcp  --permanent
   # sudo firewall-cmd --zone=public --add-port=8443/tcp --permanent
   Hace la apertura de puertos permanente o sea guarda los cambios.
  
   # firewall-cmd --reload

   Verifica que los puertos esten activos
   Si todo quedo correcto responde:
   success

- Proceso alternativo de apertura de puertos si firewall no esta activo
  con IPTABLES
     # sudo yum install iptables                                                                                                        
       ==============================================================
     # sudo iptables -A INPUT  -i eth0 -p tcp --dport 10000 -j ACCEPT                                                                   
     # sudo iptables -A INPUT  -i eth0 -p tcp --dport 80    -j ACCEPT                                                           
     # sudo iptables -A INPUT  -i eth0 -p tcp --dport 8080  -j ACCEPT                                                           
     # sudo iptables -A INPUT  -i eth0 -p tcp --dport 9080  -j ACCEPT                                                         
     # sudo iptables -A INPUT  -i eth0 -p tcp --dport 9180  -j ACCEPT                                                             
     # sudo iptables -A INPUT  -i eth0 -p tcp --dport 443   -j ACCEPT                                                             
     # sudo iptables -A INPUT  -i eth0 -p tcp --dport 8443  -j ACCEPT                                                                  

     Guardar los cambios
     # sudo service iptables save                               

Una forma para administrar IPTABLES es el comando CSF
 que de una forma sencilla y mediante comandos simples o la configuracion
del archivo /etc/csf/csf.conf se pueden obtenter buenos resultados
de una forma sencilla y clara o mediante la linea de comandos

Para habilitar CSF
# sudo csf -e
Para deshabilitar CSF
# sudo csf -x

Administrar puertos
implemente edite el siguiente archivo utilizando un  editor de archivos:

# sudo emacs /etc/csf/csf.conf

Encuentre las siguientes líneas y agregue los números de puerto que desea abrir:

# Allow incoming TCP ports
Y agregue los puertos que desea habilitar
en nuestro caso serian:

# Allow incoming TCP ports                                                                                                                 
TCP_IN = "80,8080,20000,9050,10000,9001,9999,9898"

# Allow outgoing TCP ports                                                                                                                 
TCP_OUT = "30000:50000,11022,20,21,22,25,53,80,110,113,443,465,587,993,995,20000,10000,9001,9999,9898"

# Allow incoming UDP ports                                                                                                                 
UDP_IN = "80,8080,20000,9050,10000,9001,9999,9898"

# Allow outgoing UDP ports                                                                                                                 
# To allow outgoing traceroute add 33434:33523 to this list                                                                                
UDP_OUT = "20,21,53,113,123,10000,9050,9001,9999,9898"

# Allow incoming PING. Disabling PING will likely break external uptime                                                                    
# monitoring                                                                                                                               
ICMP_IN = "1"

Para comprobar que los cambios surten efecto, asegúrese de reiniciar CSF utilizando el siguiente comando:

# sudo csf -r

También es posible el bloquear a países enteros. Se advierte sin embargo, que algunos rangos de IP pueden no estar actualizados, en cuyo caso usted estaría perdiendo tráfico de visitantes legítimos. Además, por la sola cantidad de direcciones IP, el crear estas reglas puede añadir una tardanza extrema en los reinicios del servidor.

Si usted aún desea agregar países completos a su configuración de CSF, abra el siguiente archivo:

/etc/csf/csf.conf

Busque la sección titulada "CC_Allow or CC_Deny" e ingrese alguno de los siguientes códigos de país:

# Each option is a comma separated list of CC's, e.g. "US,GB,DE"                                                                           
CC_DENY = "SA,BH,BY,CN,KP,CU,AE,ET,IN,IR,PK,GB,RU,SY,SD,TM,UZ,VN,AU,KR,EG,ER,FR,KZ,MY,LK,TH,TN,TR"
CC_ALLOW = ""

Para agregar una ip a la lista blanca

# sudo csf -a 123.123.123.123

También puede eliminar una dirección IP de la lista de permitidas utilizando este comando:

# sudo csf -ar 123.123.123.123

En caso de un ataque, también puede bloquear ciertas direcciones IP. Utilice el siguiente comando:

# sudo csf -d 123.123.123.123

Esta dirección IP se agregará a la lista de direcciones IP bloqueadas por iptables y está almacenada en /etc/csf.deny

Usted también puede eliminar una dirección IP utilizando el siguiente comando:

csf -dr 123.123.123.123

Esta dirección IP se agregará a la lista de direcciones IP bloqueadas por iptables y está almacenada en /etc/csf.deny

Esta dirección IP se agregará a la lista de direcciones IP bloqueadas por iptables y está almacenada en /etc/csf.deny

Usted también puede eliminar una dirección IP utilizando el siguiente comando:

# sudo csf -dr 123.123.123.123

   - Instalar nmap para verificar puertos
   # sudo yum install nmap
   # sudo nmap localhost

   - Otra alternativa para verificar puertos es lsof, ademas sirve como comando
     de utilidad para eliminar sockets abiertos, en el script que se instala en
     el crontab sos_postgres.sh

   # sudo yum install lsof
   # sudo lsof -i -P

3.
    -Instalar java y javac
    Por defecto linux trae instalado java pero no javac que es el compilador,
    necesario para la instalacion de los processo de DAO/DTO.
    instalar y o acutalizar

    # sudo yum erase java*            // borra versiones anteriores que pueden ser incompatibles
    # sudo yum install java*          // instala todo el kit java

    Verificar que java quedo instaldo  y que version
    # sudo java -version

    Se debe ver algo semejante a lo siguiente.
    Debe notar que la instalcion yum instala la ultima version ESTABLE para la version linux
    que se esta instalando.
    openjdk version "1.8.0_232"
    OpenJDK Runtime Environment (build 1.8.0_232-b09)
    OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)

    Verificar si javac (compilador) java quedo instalado.

    # sudo javac -version

    Debe ver un mensaje similar al siguiente
    sudo javac -version
    javac 1.8.0_232

    Sino puede ver este mensaje instalar javac de forma independiente
    # sudo yum install javac*

4. Instalar postgres
   PostgreSQL es un sistema de gestión de bases de datos relacional
   orientado a objetos y de código abierto, publicado bajo la licencia PostgreSQL,1​
   similar a la BSD o la MIT.

   Como muchos otros proyectos de código abierto, el desarrollo de PostgreSQL no es
   manejado por una empresa o persona, sino que es dirigido por una comunidad de
   desarrolladores que trabajan de forma desinteresada y libre o apoyados
   por organizaciones comerciales. Dicha comunidad es denominada el PGDG (PostgreSQL Global Development Group). 1

   De forma similar a java, postgres instalado por YUM , recordar que postgres se
   puede instalar mediante la descarga de los archivos de configuracion desde el
   sitio de postgres si se desea una version mas actualizada, a la fecha la mas reciente
   es version 12, sin embargo la instalada por yum es la estable recomendada por el
   sistema mismo linux que se esta instalando, en este caso la 12

   El siguiente script automatiza la instalación de postgres
   =============================================================================
   clear
   echo "Guion de instalacion postgres presione enter para continuar"
   read

   clear
   echo "Borrando posgres ... presione enter para continuar"
   read

   sudo sudo postgresql-12 stop

   sudo chattr +i pg_hba.conf                                                                                   
   sudo chattr +i postgresql.conf                                                                               

   sudo chattr +a pg_hba.conf                                                                                   
   sudo chattr +a postgresql.conf 

   sudo rm -rf /var/lib/pgsql
   sudo yum erase postgres-12*

   clear
   echo "creando posgres ... presione enter para continuar"
   read
   sudo yum install postgres-12*
   sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
   sudo systemctl enable postgresql-12
   sudo service postgresq-12 restart

   =============================================================================
   Para actualizar a las versiones de postgres 
#sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

   # sudo yum install postgresql12-server                                     
                                                                         
    Al instalar postgres es necesario darle un paso de inicializacion ya que postgres no
    inicia el servidor por defecto.
    Iniciar Postgres                                                                                                                     
  
   #sudo /usr/pgsql-12/bin/postgresql-12-setup initdb

    verificar que la base de datos se inicializo correctamente, si es así los archivos
    postgresql.conf y pg_hba.conf deben estar instalados.

    # sudo locate postgresql.conf
  debe ver un mensaje similar a lo siguiente:

  /usr/pgsql-12/share/postgresql.conf.sample
  /var/lib/pgsql/12/data/postgresql.conf

    Este paso es iportante porque aunque
    el archivo exista , no tiene porque quedar en determinada carpeta , como dichos
    archivos hay que intervenirlos para ajustarlos a las condiciones de memoria y
    acceso es importante determinar donde quedaron.

    de forma similar donde quedo pg_hba.conf

    # sudo locate pg_hba.conf

    /usr/share/pgsql/pg_hba.conf.sample
    /var/lib/pgsql/data/pg_hba.conf

    En postgresql.conf : se configuraran las condiciones de la memoria que al final
    se reflejan en el redimiento de la DB en el sistema.
    Es muy importante hacer el tuning de este aerchivo mediante una herramienta
    adecuada para este fin.
    Una buena herramienta se encuentra en :  https://pgtune.leopard.in.ua/#/
    Aunque nos da un buen acercamiento a lo que esnecesario, no es por demas hacer los
    ajustes que se crean conveniente de acuerdo al rendimiento ue se este obteniendo.

    En pg_hba.conf se configura la forma en que el servidor de base de datos permite
    conectarse con el mundo exterior, se debe ajustar ya que por defecto postgres
    solo permite conectarse a el servicio medante pgsql (lenguaje de script del propio
    postgres) , hay que darle permiso para que las aplicaiones (three party) puedan
    hacerlo, java entre ellas.

    verificar las condiciones del servidor , memoria y cpu con                                                                           
    top y htop
    para el efecto instalamos htop en el servidor
   
    -instalar el repositorio EPEL
      ( carpeta de directorios de aplicaciones avanzadas centos y otros proveedores
        como RED-HAT y Fedora.)                                            
  
    # sudo yum -y install epel-release

    Instalar la version grafica de top --> htop                                                                                       
 
    # sudo yum install htop
    ejecutar
    # sudo htop

    Mediante este comando podemos determinar cuanta memoria y cuantas cpu tenemos en nuestro
    sistema.
    En ocaciones la memoria que muestra el htop/top, es diferente a las cpu y memoria que
    contramos, eso se debe a que linux tiene estos parametros que toma en el momento de
    INSTALACION y no se actualizan de forma automatica cuando se hace una expancion de memoria.
    Si esto ocurre aumentarla mediante los comandos que se veran a continuacion.
   
5. Aumentar el numero de archivos abiertos en el sistema operativo para
   para que pueda funcionar el tomcat y el postgres.
   Esto es necesario hace si el postgres u otro proceso empieza a mandar el mensaje
   TOO MANY FILE OPEN.
   too many open puede ocurrir :
   a) No tenemos suficiente memoria fisica
   b) Si tenemos memoria pero el sistema no la ha reconocido.

   Este comando ES TRANSITORIO , no lo guarda, si se re incia el sistema el valor se
   pierde.

   # sudo ulimit -n 75000                                                                                                               

   Este comando permite hacer una ampliacion en CALIENTE , hasta que se logre que el
   sistema se ajuste al valor correcto y el mensaje TOO MANY FILE OPEN, el valor
   que tenga ulimit depende de la instalacion.
   Con la instruccion siguiente, le digo al sistema que me permita
   abrir 75.000 archivos, SIMULTANEAMENTE.
   Para linux un archivo abierto puede ser un socket de comunicacion
   por ejempo de postgres, o una seccion java o una consulta.

   En una apertura y consulta se pueden abrir hasta 10 sockets por
   seccion en un solo usuario.

   Por ejemplo Para abrir el java, para mantener la coneccion (ALIVE), para
   crear un canal de comunicaciones, para abrir el puerto, para
   conectar a la DB, para conectarse a la tabla de interes, para
   traer la informacion , para desplegarla, para montar la pantalla etc.

   Por eso es muy importante que en desarrollo de una aplicacion hasta
   donde se puede se cierre cada seccion para que no consuma recursos
   de forma innecesaria , por eso a las secciones se les da un tiempo
   de apertura y cierre, tiempo despues del cual el sistema las cierra
   tipicamente entre 15-30 minutos, ademas claro por seguridad.

   En el desarrollo es muy, muy importante que cada vez que una consulta
   o actualizacion se haga se cierre el socket (close) y hasta donde
   se puede se use el modo de re-uso de coneccion de base datos y/o
   el modelo spool, tambien se usa los recolectores de basura que no
   son mas que utilidades que limpian la memoria periodicamente y
   eliminan los socketes que no se estan usando.
   Un modo de hacer un buen desempeño es colocar un numero alto de
   archivos abiertos (siempre y cuando haya memoria para esto)
   En este caso de ejemplo estamos diciendo que el sistema debe
   ser capaz de soporta 75.000 archivos abiertos.
  
   Por ejemplo el comando anterior:

   # sudo ulimit -n 75000                                                                                                               

   y convinarlo con tenicas de liberacion de memoria forzada y
   cierres de seccion.
   por ejemplo mediante el comando cron:

   30 6,8,12,14,18,20,23 * * * /bin/sync && sudo/sbin/sysctl -w vm.drop_caches=3

   Este comando cron libera la memoria basura de forma programatica
   cada 30 minutos segun el ciclo horario : a las 6,8,12,14 ... es decir
   aproximadamente cada 2 horas.

   o mediante el metacomando programatico sos_postgres.sh ( comando
   de apliccion efectuado para filtrar y borrar sockets sin uso.
   /usr/bin/sos_postgres

  El siguiente comando hace que se liberen los sockets inactivos , cada 1 minuto
  60 segundos, ya que por lo genrallos sitemas viene con liberacion cada 2
  horas, para aplicaciones con muchos sockts abirtos este valor no es para nada
  conveniente y es mejor dejarlo en valores entre 1 y 5 minutos.

# sudo sysctl -w net.ipv4.tcp_keepalive_time=60

     // retorna el valor normalemente el sistema toma el valor en
     // segundos,   60 = 1 minuto puede ser un valor aceptable.
     // Por defecto los sistemas traen 2 horas = 7200 segundos.
     net.ipv4.tcp_keepalive_time = 60

   Para hacerlo persistente agregar a:
   # sudo emacs  /etc/sysctl.conf

   net.ipv4.tcp_keepalive_time = 60


   #sudo crontab -e
   */1 * * * * /usr/bin/sos_postgres
   =================================================================
   MAXIMO=90
   IDLE=90
   HTTP=90

   USUARIOSH=`/usr/sbin/lsof -i -n -P | grep http | grep CLOSE |wc -l`
   if [  ${USUARIOSH} -gt ${HTTP}  ]
   then
      /usr/sbin/lsof -i -n -P | grep http | grep CLOSE | awk '{print $2}'| xargs  kill -15
   fi

   USUARIOS=`ps -ef | fgrep "postgres" | fgrep "idle" | wc -l`
   if [  ${USUARIOS} -gt ${IDLE}  ]
   then
   ps -ef | grep postgres | grep idle  |sort -n -k5.1 -k5.2 -k5.4 -k5.5 |awk '{print $2}' |awk 'NR < 200 {print}'| xargs kill -15

   fi

   USUARIOS=`ps -ef | fgrep "postgres" | wc -l`
   if [  ${USUARIOS} -gt ${MAXIMO}  ]
   then
   /sbin/service postgresql-12 restart
   fi
   =================================================================

    Cuando se logra cancelar el mensaje de TOO MANY FILE OPEN
    es una buena practica hacerlo permantente para que cuando
    se haga un reboot (manual o accidental) los parametros
    permanezcan.

    - Editar
    En este caso de coloca la memoria que se tiene fisica en el
    parametros:
    * hard nofile 3000000
    nos indica que tenemos en este ejemplo 64 Megas disponibles.

    # sudo emacs /etc/security/limits.conf                
    root       soft      nofile   10000
    root       hard    nofile   30000
    *            soft      nofile   100000
    *            hard    nofile   300000

    En este caso le indicamos editando o insertando el fin del
    archivo, la linea que relaciona cuantos archivos debemos
    tener para que el mensaje TOO MANY FILES OPEN desaparezca.

    Nota: estos valores están correlacionados, el valor de
    fs.file-max puede tener cualquier valor, pero eso no indica
    que pueda funcionar si no se le coloca memoria para hacerlo.
    primero fisicamente en el computador y luego estableciendola
    en el sistema con el comando anterior.

    # sudo emacs /etc/sysctl.conf                                                                                                      

    fs.file-max = 75000

    Todo el proceso anterior de uso y verificacion del performance (desempeño)
    del servidor es un paso previo y necesario antes de continuar con el
    tunning del postgres , ya que es este paquete el mas sensible a las condisiones
    de memoria y cpus disponibles.


    Una vez hayamos ajustado el postgres:
    Procedemos a vincular el postgres a el ejecutor automático de aplicaciones
    para que el sistema boot le de de alta cada vez que el sistema se re-inicie.
    crear el link para iniciar postgres.

    # sudo systemctl enable postgresql-12
   
    Para hacer el tuning, como es un paso que puede dejar al postgres inoperante
    por algun parametro mal establecido , es recomendable:
    Recordar que la ruta del archivo puede cambiar, tener en cuento lo dicho
    en cuanto a la verificacion de su ubicacion con el comando locate

    # sudo locate pg_hba.conf

    Hacer una copia de pg_hba.conf y postgres.conf en: en este
    caso porque locate nos devolvio que lo tiene en esta ruta.
     /var/lib/pgsql/12/data

    # sudo cp pg_hba.conf pg_hba.conf.old
    # sudo cp postgresql.conf postgresql.conf.old

    Para dar acceso a la conexion por sockets de java, ya que como se dijo postgres
    por defecto tiene el acceso cerrado para cualquier instancia diferente a su
    mismo script pgsql.

   insertar en pg_hba.conf
   puede usar emacs o cualquier otro editor de texto.

   # sudo emacs pg_hba.conf

   Para dar acceso a localhost en el servidor
   #**********************************************************************************                                                  
 

   # Las 2 ultimas lineas deben quedar asi para que pgpool se pueda conectar.
   host    all         all         127.0.0.1/32          trust
   host    all         all         ::1/128                   trust
  

   #**********************************************************************************                                                  

   Si desea colocar una contraseña a su DB debe cambiar por:

   # Las 2 ultimas lineas deben quedar asi para que pgpool se pueda conectar.
   # La primera se refiere a la conexion a la DB dese un administrador como webmin o psql
   # La segunda linea se refire a la conexion a sistemas externos o entornos como JAVA
   # La 3,4 y 5 lineas permiten el acceso a pgpool y el adminmistrador de pool PCP

    local all postgres                                                             md5
    host  all postgres      127.0.0.1   255.255.255.255          md5

   
   #**********************************************************************************                                                  

   - Colocar password al postgres para evitar conexiones indebidas
     psql -Upostgres -c "ALTER USER postgres WITH PASSWORD 'supassword'"

   NOTA: Recuerde colocar el passwd aqui asignado a su modelo de conexion Java
   en su aplicacion.
   Compilalar la aplicacion y re-iniciar postgres para que actulice los cambios
  
   modificar en:
   postgresql.conf

   para dar acceso a JAVA por socket especificamente en el argumento:
   que viene como:

   #listen_addresses = 'localhosts'

   Indicando que el sistema esta cerrado para aplicaciones de conexion por socket
   tcp/ip en nuestro caso java.
   dejarlo como se indica.
   O sea rerirar el simbolo '#' para habilitar el parametro y hacerlo generico
   medante el simblo '*'

   #**********************************************************************************                                                 
   
   listen_addresses = '*'

   Aqui buscar los parametros y valores sugeridos en su administrador de tunning

   Semblanza de referencia de una configuracion funcional en postgresql.conf
  
una herramienta util de configurar que da un acercamiento a un uso mejor de memoria es;: https://pgtune.leopard.in.ua
Uselo como uuna forma de obtner mejores valores de configuracion
pero no es excusa para no entender claramento lo que estos cambios
recomndados significan.

/#/===================================================================================
   Servidor con 64GB de memoria
                1500 conexiones
                Linux
                Para aplicaciones tipo Web

    postgres.cnf
    *********************************
    max_connections = 1500
    shared_buffers  = 15872MB
   
    effective_cache_size = 47616MB
    work_mem = 2708kB
    maintenance_work_mem = 2GB
    checkpoint_completion_target = 0.7
    wal_buffers = 16MB
    random page cost=1.1
    efective_io_concurrency=200
    default_statistics_target = 100
    min_wal_size=1GB
    max_wal_size=4GB
    max_worker_process=8
    max_parallel_workers_per_gather=4
    max:parallel_workers=8
    max_parallel_maintenace_workers=4
   #**********************************************************************************                                                  
   Si todo quedo correcto lanzar nuevamente el postgres para ver que tome los cambios
   sugeridos.
   Si hay algún error se sugiero volver a colocar los valores por defecto guardados
   como una copia, e inte7ntarlo de nuevo.

   # sudo service postgresql-12 restart

   Si el mensaje es algo similar al mensaje a continuación su configuracion quedo
   correcta.

   Redirecting to /bin/systemctl restart postgresql.service

   Es usual que cuando se hace una actualizacion del sistema mediante update/upgrade
   puede haber un cambio el los archivos de configuracion pg_hba.conf y postgresql.conf
   para prevenir que esto ocurra debemos cambiar los atributos de estos archivos.

6. Cambiar los atributos para que no se modifiquen automaticamente al iniciar el sistema
   o al actualizar mediante yum.

   Es decir debemos Proteger los archivos para que no sean cambiados accidentalmente en
    una actualizacion del sistema. (Hace los archivos intocables, si se desea hacer algun
   ajuste se debe elimar la proteccion utilizando el signo menos en (-) en el atributo en
   lugar del signo (+)

   # sudo chattr +i pg_hba.conf                                                                                   
   # sudo chattr +i postgresql.conf                                                                               

   # sudo chattr +a pg_hba.conf                                                                                   
   # sudo chattr +a postgresql.conf                                                                               
       
   Si todo quedo correcto debe ver en su pantalla algo simiar a lo siguiente al hacer
   un listado de la carpeta mediante el comando ls -l

   # sudo ls -l

   rwx------ 5 postgres postgres  4096 dic  5 15:34 base
   drwx------ 2 postgres postgres  4096 dic  5 17:39 global
   drwx------ 2 postgres postgres  4096 dic  5 15:34 pg_clog
   -rw------- 1 postgres postgres  4323 dic  5 17:32 pg_hba.conf
   -rw------- 1 root     root      4232 dic  5 17:25 pg_hba.conf.old
   -rw------- 1 postgres postgres  1636 dic  5 15:34 pg_ident.conf
   drwx------ 2 postgres postgres  4096 dic  5 17:39 pg_log
   drwx------ 4 postgres postgres  4096 dic  5 15:34 pg_multixact
   drwx------ 2 postgres postgres  4096 dic  5 17:39 pg_notify
   drwx------ 2 postgres postgres  4096 dic  5 15:34 pg_serial
   drwx------ 2 postgres postgres  4096 dic  5 15:34 pg_snapshots
   drwx------ 2 postgres postgres  4096 dic  5 17:44 pg_stat_tmp
   drwx------ 2 postgres postgres  4096 dic  5 15:34 pg_subtrans
   drwx------ 2 postgres postgres  4096 dic  5 15:34 pg_tblspc
   drwx------ 2 postgres postgres  4096 dic  5 15:34 pg_twophase
   -rw------- 1 postgres postgres     4 dic  5 15:34 PG_VERSION
   drwx------ 3 postgres postgres  4096 dic  5 15:34 pg_xlog
   -rw------- 1 postgres postgres 19837 dic  5 17:37 postgresql.conf
   -rw------- 1 root     root     19845 dic  5 17:26 postgresql.conf.old
   -rw------- 1 postgres postgres    57 dic  5 17:39 postmaster.opts
   -rw------- 1 postgres postgres    84 dic  5 17:39 postmaster.pid

   Verificar si los atributos fueron cambiados:

   # sudo lsattr pg_hba.conf

   Debe mostrar el mensaje siguiente:
   ----ia-------e-- pg_hba.conf

   # sudo lsattr postgresql.conf

   Debe mostrar el mensaje siguiente:
   ----ia-------e-- postgresql.conf

   Indicando que efectivamente los parámetros de protección i,a estan activos.
   Crear bases fci001 (fci001 es el nombre de una DB cualquiera) dentro detro de postgresql.
   Es necesario crear las bases antes de que las mismas puedan ser pobladas por las
   ditintas tablas y datos dentro de las mismas.

   Si es una instalacion "fresca" , los datos se irán creando mediante la aplicacion misma
   y sus diferentes tablas necesarias.

   Si se esta migrando un servidor, se deben primero hacer las copias necesarias de
   las tablas y datos del anterior servidor que se va a importar sobre la nueva instalacion.
   Observar el parametro utf-8 que indica que el sistema acepta caracteres especiales tipo 'ñ'.

   Verificar que postgresql es en funcionamiento.
   #sudo systemctl status postgresql-12

   instalar las librerias contrib para que postgres encuentre las utilidades dblink
    #yum install postgresql12-contr*

   crear una base de datos para poblarla con las diferentes tablas.

   # sudo -u postgres -i createdb fci001 -E utf-8

   Si tuvo algun error al crear la tabla o uso un nombre incorrecto la forma de
   borrar esa entrada a la base de datos es mediante el siguiente comando.
   Borrar base                                                                                                                         
   #sudo -u postgres -i dropdb fci001


   NOTA:
   Si desea elminar una instalacion postgres actual (recordar que si lo hace debe tener un backup de
   la informacion antes de proceder para poder restituirla luego).

   i) Parar el postgres :
      # sudo postgresql-12 stop

   ii) Cambiar los atributos de pg_hba.conf y postgres.conf colocando un signo menos (-) en lugar del (+),
      porque debe borrar la configuraracion, y como estan no deja ya que estan protegidos.

      # sudo chattr -i pg_hba.conf                                                                                   
      # sudo chattr -i postgresql.conf                                                                               

      # sudo chattr -a pg_hba.conf                                                                                   
      # sudo chattr -a postgresql.conf                                                                               

   iii) Remover la carpeta
      # sudo rm -rf /var/lib/pgsql
       Para elimar todas la configuracion y logs de postgres

   iv)Eliminar postgres :
      # sudo yum erase postgres*

7. Crear script de copias de seguridad

   crear el usuario respaldo para guardar la copias de seguridad

   #sudo adduser respaldo
   #sudo passwd  respaldo

   El sistema responde:
   passwd: todos los símbolos de autenticación se actualizaron con éxito.
   dar permisos para que puedan grabarse archivos en ella

   # sudo chown -R respaldo /home/respaldo
   # sudo chgrp -R respaldo /home/respaldo
   # sudo chmod -R ugo+wrx /home/respaldo

   Adicionar el usuario db_repository para hacer las copias de la informacion
   de las tablas y datos postgres.
   Ver (mas abajo como configuar copia de infomacion con webmin)

   # sudo adduser db_repository
   # sudo passwd  db_repository

   El sistema responde:
   passwd: todos los símbolos de autenticación se actualizaron con éxito.
   dar permisos para que puedan grabarse archivos en ella

   # sudo chown -R db_repository /home/db_repository
   # sudo chgrp -R db_repository /home/db_repository
   # sudo chmod -R db_repository /home/db_repository
  
   chmod da permisos de acceso a un archivo o carpeta.
   a) parametro -R , agrega el mismo permiso a la carpeta y de forma recursiva a
      las carpetas y archivos que se encuentras dentro de esta
   b) parametro ugo  : da permiso de usuario , grupo y otros
   c) parametro +    : Agrega permisos a los parametros anteriores , (-) retirar
                       dichos permisos
   d) parametro wrx  : w: permiso de escritura (write)
                       r: permiso de lectura   (read)
                       x: permiso de ejecucion

   - crear el un script para hacer el resplado.
   usualmente es un script de comandos de copia con el comando tar (puede tambien
   usarse  zip,bzip,rar hay que instalarlos con yum).
   de los    archivos y carpetas de interes a respaldar, usualmente se colocan los archivo
   de ejecucion en la carpeta /usr/bin , donde estan todos los ejecutables del sistem operativo.

   ejemplo de un archivo de copia:

   # sudo emacs /usr/bin/copia.sh
   #==========================================================================================
   tar zcvfPp /home/respaldo/respaldo.tgz /usr/local/tomcat/ /usr/bin/copia.sh /usr/bin/sos_postgres* /usr/bin/sos /home/db_repository

   #==========================================================================================

  Dar permisos de ejecucion.
  # sudo chmod ugo+wrx copia.sh

   Aqui al comando tar se le asignan los sighuientes parametros
   tar:    comando para copiar recursivas con comprension y manteniendo los permisos
           originales
           Parametros:
           z : zip    :Use modelo de comprension zip
           c : copy   :Haga una copia
          (x): extraer:opcional- Extrae un copia del archivo solicitado, o sea lo descomprime.
           v : verbose:Muestre lo que esta haciendo
           f : file   :asigne el archivo de entra y salido (io) sini toma por defecto
                      la pantalla y el directorio donde se esta ubicado
           P :        :Guarde el Path (ruta de la copia que se esta haciendo).
           p :        :mantenga los permisos del archivo (carpeta que se esta guardando

   El asterisco al final de un file (archivo o carpeta) copia todos los file (archivos
   y carpetas  que tengan semejanza a la descripcion inicial en el caso db_* , se esta diciendo que copie
   todas las carpetas y/o archivos qu esten en /home con inicio db_
   si al final de una carpeta la termina con el signo barra inclinada (/) le estoy
   diciendo que copie la carpeta con todo su contenido.

   - Le damos al archivo permisos de ejecucion, como el archivo queda en /usr/bin,
     puede ser ejecutado sin necesidad de darle la ruta donde quedo guardado.
 
   El siguiente script , verifica cuantos socketes http y postgres estan abiertos
   al momento de la    ejecucion mediante el comando lsof, si encuentra que hay
   mas de 90 que no han podido ser cerrados de forma normal reinicio el postgres,
   para forzar el cierre.
   Sino verifica si hay sockets en estado pendiente o IDLE y los cierra (CLOSE),
   de forma normal.

  # sudo emacs /usr/bin/sos_postgres.sh

  # =================================================================
   MAXIMO=90
   IDLE=90
   HTTP=90

   USUARIOSH=`/usr/sbin/lsof -i -n -P | grep http | grep CLOSE |wc -l`
   if [  ${USUARIOSH} -gt ${HTTP}  ]
   then
      /usr/sbin/lsof -i -n -P | grep http | grep CLOSE | awk '{print $2}'| xargs  kill -15
   fi

   USUARIOS=`ps -ef | fgrep "postgres" | fgrep "idle" | wc -l`
   if [  ${USUARIOS} -gt ${IDLE}  ]
   then
   ps -ef | grep postgres | grep idle  |sort -n -k5.1 -k5.2 -k5.4 -k5.5 |awk '{print $2}' |awk 'NR < 200 {print}'| xargs kill -15

   fi

   USUARIOS=`ps -ef | fgrep "postgres" | wc -l`
   if [  ${USUARIOS} -gt ${MAXIMO}  ]
   then
   /sbin/service postgresql-12 restart
   fi
  # ===================================================================
  Dar permisos de ejecucion a los archivos sos_postgres.sh y sos para que puedan ser
  usados o de forma independiete o por un proceso cron.

  # sudo chmod ugo+wrx sos_postgres.sh

  # sudo emacs /usr/bin/sos
  # ===================================================================
  # Reinicia el servidor tomcat, borra basura en memoria, y actaliza las
  # class de las aplicaciones, inicia nuevqamente el corta fuegos.

    pgpool stop
    /usr/local/tomcat/bin/shutdown.sh
    sudo sync && sudo sysctl -w vm.drop_caches=3
    find /usr/local/tomcat/webapps/ -name web.xml -exec touch {} \;
    service postgresql restart
    /usr/local/tomcat/bin/startup.sh

    systemctl start firewalld
    pgpool
  

 #====================================================================
  Dar permisos de ejecucion.

  # sudo chmod ugo+wrx sos

   - Cierra el pool de conexiones a postgres
   - /usr/local/tomcat/bin/shutdown : Apaga el servidor de aplicaciones tomcat
   - sudo sync && sudo sysctl -w vm.drop_caches=3 : sincroniza la memoria y borra
     el cache y las variables de memoria que no se esten usando
   - find /usr/local/tomcat/webapps/ -name web.xml -exec touch {} \; : Actualiza
     las classes de java que se hayan intervenido a su ultima version compilada.
   -  service postgresql restart : reinicia postgres y hace la actualiacion de
     tablas y datos si se hizo algun cambio.
   - /usr/local/tomcat/bin/startup.sh : inicia de nuevo el servidor de aplicaciones
     tomcat.
   - systemctl start firewalld : activa el corta fuejos y actuliza los puertos
     que hayan sido abiertos o cerrados en el proceso.
   - Abre el pool de conexiones a postgres.

7. Crear el crontab
   Crontab en un ejecutor y automatizacion de tareas programaticas que se requieren sean
   ejecutadas periodicamente, sin necesidad de intervencion.

   Normalmente las tareas basicas de crontab que deben ser automatizadas son entre otras:
   a) Limpieza de memoria.
   c) copias de seguridad.
   d) respaldos de informacion.
   e) borrados de socketes pendiente de cerrar. etc.
                                                                                                                     
   Le da permisos de acceso al sistema de copias

   Nota: usualmwente crontab se edita con el editor (vi de linux).
   - Para ingresar informacion presionar la tecla insert.
   - Ingresar la informacion normalmente por linea o pegar.
   - Para salir presionar ESC para que salga de insercion
   - Tecla SHIFT el sistema coloca el cursor que son los 2 puntos (:)
   - wq salva la informacion y ENTER.

   #sudo crontab -e
   #*******************************************************************************                                                     
  
   30 6,8,12,14,18,20,23 * * * /bin/sync && /sbin/sysctl -w vm.drop_caches=3
   */1 * * * * /usr/bin/sos_postgres.sh
   30 1,12 * * * /usr/bin/copia.sh #Bacup de los programas                                                                              
  
   #*********************************************************************************                                                   
  
   si todo quedo correcto el sistema responde:
   crontab: installing new crontab

8. crear los usuarios tomcat  y asignar claves

   # sudo adduser tomcat
   # sudo passwd  tomcat
     El sistema responde:
     passwd: todos los símbolos de autenticación se actualizaron con éxito.

   dar permisos para que puedan grabarse archivos en ella

   # sudo chmod -R ugo+wrx /home/tomcat
   # sudo chown -R tomcat  /home/tomcat
   # sudo chgrp -R tomcat  /home/tomcat

9.  Instalar el webmin:

    El webmin es un administrador de la plataforma linux y menaja entre otras
    cosas el gestor de bases de datos postgres.
    Nota: El webmin esta en permanente actalizacion por lo tanto en cada caso es
    necesario verificar los pasos para crear dicha instacion.
    UN pagina de referencia que mantiene el proceso actualizado es:

    En esta pagina hacen la instalacion con nano que es un editor de texto similar
    emacs,
    Usan wget : es un comando para descargar archivos desde de la web de forma segura,
    , el cual debe estar instalado previamente usulmente viene pre instalado
    sino instalar

    # sudo yum install wget

    https://nksistemas.com/instalar-webmin-en-centos-7/

    Si todo funciono conforme a lo esperado , ya que instalado webmin el el puerto
    10000.
    El sistema responde:
    Instalando    : webmin-1.930-1.noarch                                                                                   
    1/1
    Webmin install complete. You can now login to https://suservidor.com:10000/
    as root with your root password.

    Nos informa que podemos usar el administrador como una instancia segura https
    del servidor (https:IP_DEL_SERVIDO/URL:10000).
    y que la clave de acceso es la asignada al usuario root.

    Recordar abrir este puerto si no ha hecho aun en el paso 1. de este instructivo.

   # sudo firewall-cmd --zone=public --add-port=10000/tcp --permanent
   # firewall-cmd --reload
  
   Forma alternariva iptables
att   # sudo iptables -A INPUT  -i eth0 -p tcp --dport 10000 -j ACCEPT                                                                   
   # sudo iptables-save

   Nota : Recordar tener firewall o cualquier otro corta fuegos como iptables) que

   permita abrir el puerto para que webmin pueda ser usado desde internet.

   Las versiones suoeriores de postgres 9.2 cambian la carpeta configuracion de
   pg_hba.conf
    /var/lib/pgsql
    a
   /var/lib/pgsql/12
   El numero al final (12) dependera de la version del postgres que se este instalando.

  Por lo tanto al intentantar usar el servidor postgres de webin muestra un error
  de archivo pg_hba.conf no encontrado.
  Para solucionar el problema editar el archivo :
  # sudo emacs /etc/webmin/postgresql/config
  y modificar la linea:

  hba_conf=/var/lib/pgsql/12/data/pg_hba.conf

  Reinicar el webmin y si solicita contraseña salvar la misma que configuro para
el postgres.

Reiordar configurar el sistema de backup de las bases de datos de postfgres desde el webmin, en la parte inferior del panel de postgres hay un icono para programar el backup, ero aqntes de programarlo debe instalar el Perl DBD , dando click sobre el icono que sugiere esta instalacion, una vez concluido el proceso en la linea
Scheduled backup enabled? ingresa la opcion Yes.
Selecciona las fechas y hora de su preferencia, y termine salvando la configuracion, este paso crea una entrada a su contrab para que se efectue automaticamente cada vez que se cumpla la programacion indicada
 
10. Instalar tomcat
    Apache Tomcat (también llamado Jakarta Tomcat o simplemente Tomcat) funciona como un
    contenedor de servlets desarrollado bajo el proyecto Jakarta en la Apache Software
    Foundation. Tomcat implementa las especificaciones de los servlets y de JavaServer Pages
    (JSP) de Oracle Corporation (aunque creado por Sun Microsystems).
    Tomcat es un contenedor web con soporte de servlets y JSPs. Tomcat no es un servidor de
    aplicaciones, como JBoss o JOnAS. Incluye el compilador Jasper, que compila JSPs
    convirtiéndolas  en servlets. El motor de servlets de Tomcat a menudo se presenta
    en combinación con el servidor web Apache.

    Tomcat puede funcionar como servidor web por sí mismo. En sus inicios existió la percepción
    de que el uso de Tomcat de forma autónoma era sólo recomendable para entornos de desarrollo
    y entornos con requisitos mínimos de velocidad y gestión de transacciones.
    Hoy en día ya no existe esa percepción y Tomcat es usado como servidor web autónomo en entornos
    con alto nivel de tráfico y alta disponibilidad.
    Dado que Tomcat fue escrito en Java, funciona en cualquier sistema operativo que disponga
    de la máquina virtual Java.

    Tomcat actual esta en la version 9.0.29 "fresca" , si ya se tiene una aplicacion funcional
    tomcat ir al paso II)
  I)
   a) verificar que java y javac esten instalados ya que tomcat es un contendor de
      aplicaciones basado en java. (ver paso 3. de este instructivo).
   b) Adicionar un usuario tomcat, segun el paso 8. de este instructivo.
   c) Descargar tomcat version 9.0
      Nota: Esta es la ultima version estable, antes de una instalacion fresca verificar
      la version actual para actualizar la descarca.
      verificar en la pagina: http://tomcat.apache.org/
      En dicha pagina hay informacion no solo de la version sino adicionalmente de los bug
      eliminados y actualizacion y ampliaciones del sistema.

      # sudo wget https://www-eu.apache.org/dist/apache-tomcat-9.0.29.tar.gz

      Eventualmente puede ocurrir que la descarga no se puede hacer de forma directa entonces
      se hace de forma alternativa podemos hacerlo directamente del repositorio de tomcat :
      https://tomcat.apache.org/download-90.cgi
      Dado que estamos en sistema sin consola grafica no podemos usar un navegador convencional
      tipo google por ejemplo para hacer la descarga y dado que el comando para hacerlo wget
      que es su forma alternativo no funciona toca instalar un navegador se consola por ejemplo
      lynx.
      Como navegador que es lynx permite descargar el software necesario directamente al servidor
      que se esta instalando , sin necesidad de descargarlo a otro computador para luego copiarlo.

      # sudo yum install lynx

      y ejecutalor con la ruta donde esta la version de tomcat de nuestro interes

      # sudo lynx https://tomcat.apache.org/download-90.cgi
      para descargar la version actual.


   d) Extraer el tar de el contenedor tomcat (no el parametro z, porque no esta comprimido
      tar -xvf apache-tomcat-9.0.27.tar.gz
   e) Cambiar el nombre del contenedor de apache a tomcat para que utilice todos los procesos
      de instalacion de este instructivo que estan basdados en el nombre tomcat , no apache

      # sudo mv apache-tomcat-9.0.27 tomcat

   f) Mover el contenedor a la carpeta /usr/local estandar

      # sudo mv tomcat /usr/local

   g) Tunning al tomcat
      # sudo cd /usr/local/tomcat/conf

      hacer una copia de server.xml

      # sudo emacs server.xml

      Usualmente entre las las lineas 69 - 86/103-113 de este archivo estan las base de ajuste
      En las lineas 69 y 75 se debine el puerto de conexion que se va usar , lo normal del
      tomcat es que ese usen los puertos 8080 o 80 (el 80 usado basicamente para la conformacion
      de paginas web con frontend publico y 8080 para sistermas administrativos en general.
      El numero de hilos (socketes) abiertos se define en la linea con:
      maxThreads="1000" , lo cual depende en todo caso de la cantidad de memoria que se tenga
      disponible opcion en la opcion IO.
      A partir de la linea 103, se encuentran otras opciones de configuracion de las mismas
      caracteriticas pero con el modelo NIO (, con re-uso de conexiones , es MUY importante
      determinar  con cual opcion se va trabajar como se dijo, de acuerdo a la memoria que se disponga
      pero ademas de las caracteristicas del servicio.

      la opcion :
      compressableMimeType="text/html,text/xml,text/plain,text/css,application/javascript,application/json,text/javascript"

      si se habilita optimiza el canal de comunicacion pero consume mas recurso de memoria.
      Y descomentar (retirar <--  --> solo una de las opciones para evitar conflictos en el proceso.

      Es decir cada opcion que se tome debe ser cuidadosamente evaluada, porque en general cada
      una de ellas incide en el rendimiento, lo que se gana en ancho de banda por ejemplo implica
      mas consumo o de memoria o de CPU. (en general en sistemas nada es gratuito y siempre
      sera velocidad vs seguridad , comunicacion vs memoria , rendiminto vs cpu etc.)

      -Ampliar el chace del sistema tomcat, en la version previas al tomcat 8, el sistema no mostraba
       un desborde del cache , a partir de la version 8 , el sistema muestra un warning si el cache
       alcanzo un valor de 10240 kb, en menios de 5 segundos se sugiere aumentar este valor, un
       valor practico es de 5 veces este valor .

      #sudo emacs /usr/local/tomcat/conf/context.xml

      <context>
        <Resources cacheMaxSize="51200" />
      </context>


      # sudo emacs /usr/local/tomcat/conf/server.xml     

      #************************************************************************************************

    <!-- A "Connector" using the shared thread pool-->

     <Connector connectionTimeout="20000"
                maxThreads="1000"
                port="8080"
                protocol="org.apache.coyote.http11.Http11NioProtocol"
                compression="on"
                compressionMinSize="1024"
                noCompressionUserAgent="gozilla, traviata"
                compressableMimeType="text/html,text/xml,text/plain,text/css,application/javascript,application/json,text/javascript"
                URIEncoding="UTF-8"
                redirectPort="443"/>
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               compression="on"
               compressionMinSize="1024"
               noCompressionUserAgent="gozilla, traviata"
               compressableMimeType="text/html,text/xml,text/plain,text/css,application/javascript,application/json,text/javascript"
               redirectPort="8443" />
    -->

    <!--
    <!-- A "Connector" using the shared thread pool-->

     <Connector connectionTimeout="20000"
                maxThreads="1000"
                port="8080"
                protocol="org.apache.coyote.http11.Http11NioProtocol"
                compression="on"
                compressionMinSize="1024"
                noCompressionUserAgent="gozilla, traviata"
                compressableMimeType="text/html,text/xml,text/plain,text/css,application/javascript,application/json,text/javascript"
                URIEncoding="UTF-8"
                redirectPort="443"/>
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               compression="on"
               compressionMinSize="1024"
               noCompressionUserAgent="gozilla, traviata"
               compressableMimeType="text/html,text/xml,text/plain,text/css,application/javascript,application/json,text/javascript"
               redirectPort="8443" />
    -->

    #************************************************************************************
 
   h) Actualizar permisos de usuario y grupo del tomcat creado en el paso 8.
      # sudo cd /usr/local
      # sudo chown -R tomcat tomcat
      # sudo chgre -R tomcat tomcat
  
   i) Iniciar el servidor:
      #  /usr/local/tomcat/bin/startup.sh

      si se desea apagar el servicio:
      # /usr/local/tomcat/bin/shutdown.sh

  II) Si ya existe una aplicacion en el servidor de aplicaciones tomcat.

     a) Ir al servidor fuente de la aplicacion (servidor "viejo".
     b) Crear una carpeta /home/db_repository sino existe.
        La copia de informacion de la DB que esta en /home/db_repository la cual se debe haber hecho previa a la
            migracion con el administrador, guardar la informacion con el titulo fci001.sql
            https://su_ip:10000  (webmin)
            opcion webmin
                         SERVERS -> postgres database server-> backup database
                       
                         ============================================================================
                          Postgresql database
                          BackupDatabase
                          seleccionar : Backup files directory   /home/db_repository/
                          Create destination directory? : Yes
                           Backup schedule
               Scheduled backup enabled? No Yes, at times chosen below .. (elegir yes)
                           Simple schedule .. Times and dates selected below .. (elegir select below)

                           escoger minutos y horas deseados , dejar day ,month and weekdays  en ALL

                           darle SAVE para guardar la configurar y que quede activa en el crontab
                         ============================================================================

        Elegimos backup now (parte inferior de la pantalla)

     d) Un archivo con la copia del sistema de contenedor tomcat debe haber quedado en la carpeta /home/respaldo
         con el nombre respaldo.tgz * root.tgz
         En ella queda:
         i) El servidor de contenido tomcat que esta en /usr/local/tomcat
        ii) Los script de soporte que estan /usr/bin entre otros : sos, sos_postgres, copia.sh etc.
       iii) La copia de tablas e informacion de la DB
      

      b) hacer una copia del sistema mediante el comando copia.sh de su servidor original.
         Nota: ver que exista este comando en /usr/bin/copia.sh en el servidor original.
               sino hacer una copia de respaldo mediante el comando:
         # sudo tar zcvfPp /home/respaldo/respaldo.tgz /usr/local/tomcat/ /usr/bin/copia.sh /usr/bin/sos_postgres* /home/db_repository /usr/bin/sos


      d) Llevar esta copia a servidor que se esta instalando y colocarla en en la carpeta /home/respaldo/root.tgz o
         /home/respaldo/respaldo.tgz  que debio haber sido creada en el paso 7. anterior del servidor nuevo.
         Se puede hacer por filezilla.

      e) Restituir los programas  en /usr/local/tomcat desde el servidor original si  se esta
         haciendo una migracion a un servidor nuevo.

         # sudo tar zxvfPp /home/respaldo/respalado.tgz
           o
         # sudo tar zxvfPp /home/respaldo/root.tgz

      f) actualizar permisos de usuario y grupo del tomcat creado en el paso 8.
         # sudo cd /usr/local
         # sudo chown -R tomcat /usr/local/tomcat
         # sudo chgre -R tomcat /usr/local/tomcat

         Dar permisos de ejecucion de tomcat al usuario tomcat
         # sudo chmod -R 555    /usr/local/tomcat

      g) recupar las tablas e informacion de postgres que deben haber quedado en
         /home/db_repository

         # cd /home/db_repository
         de acuerdo al paso 6. se debio haber creado la DB , sino crearla en este punto.       

         #sudo -u postgres -i createdb fci001 -E utf-8

         Ingresar al servidor postgres y restituir tablas e informacion.
         # sudo su  postgres
           psql fci001 -f fci001.sql              
           exit

      h) Repetir el paso II -> c -> iii. de este instructivo para crear el nuevo sistema
         de respaldo de la informacion de tablas y datos del servidor actual.

            https://su_ip:10000  (webmin)
            opcion webmin
                         SERVERS -> postgres database server-> backup database
                       
                         ============================================================================
                          Postgresql database
                          BackupDatabase
                          seleccionar : Backup files directory   /home/db_repository/
                          Create destination directory? : Yes
                           Backup schedule
               Scheduled backup enabled? No Yes, at times chosen below .. (elegir yes)
                           Simple schedule .. Times and dates selected below .. (elegir select below)

                           escoger minutos y horas deseados , dejar day ,month and weekdays  en ALL

                           darle SAVE para guardar la configurar y que quede activa en el crontab
                         ============================================================================


      g) ejecutar el servidor de aplicaciones tomcat
         # sudo sos

11. Crear el archivo de respaldo automatico en  /root/.netrc
   
     a.
    #sudo emacs /root/.netrc
    El login y password el usuario y contraseña de su servidor de respaldo.
    ********************************
     machine 151.90.161.240
     login suservidor
     password yXoMiCwQwfay349
     macdef init
     prompt
     bin
     put  /home/respaldo/root.tgz /pub
     quit
    **********************************

    b. dar permisos de ejecucion
    #sudo chmod 600 /root/.netrc

    dar la entrada a crontab, con copia a la 1:40 AM y 12:40PM todos los dias
    # sudo crontab -e
    40 1,12 * * * /usr/bin/ftp 151.187.16.24 # colocar la ip de su respaldo.

    salvar y verificar que repondio
    crontab: installing new crontab
   
    El sistema de backup usa el comando ftp, usualmente esta instaldo sino
    instalarlo.
    # sudo yum install ftp


12. Instalar pg_pool  Administrador de conexiones en Pool de Postgres.
       Independiente del esfuerzo que se dedique a una buena programacion de apertura y
       cierre de sockets , siempre el tema queda pendiente del uso y de lo costos y
       limitacion de los recursos de memoria u cpu, para mejorar esta situacion el
       uso de los pool de conexion son una muy buena alternativa y casi todos los
       gestores de bases de datos cuentan con ese recurso.

       En algunos casos, inmersos en el mismo manejador y en otros como librerias
       independientes.
       En este caso usaremos una libreria suficientemente madura para el menejo de
       socketes de postgres , PGPOOL. (Estudiar este administrar de sockets ya que
       presenta muchas alternativas interesante)
       - Balance de cargas
       - Watchdog para sistemas de servidores de alta disponiblidad
       - Configuracion de servidores reduntes, etc.

       El proceso es en esencia descargar e instalar el repositorio de pgpool ,
       instalar pgpool con yum y ajustarlo,

      # yum install epel-release
      # yum install pgpool*

lo que basicamente consiste en abrir los
       puertos en los cuales pgpool funciona, 9999, 9998 y el puerto de conexion
       de postgres 5434.
       Asignar una clave md5 al sistema para poder usar el administrador de
       conexiones pcp (opcional).
       comando para genera el password md5, el parametro -n es necesario para que
       no se genere un salto de linea que cambie el hash.

       Nota: Verificar si el pgpool , ya esta instalado , antes de proceder a instalar
       otra version pues se presentan conflictos entre las ditintas versiones.
        # yum install postres*
       Instala por defecto la version correspondiente a la version que se esta instalando,
       el comando which , verifica si un paquete esta instalado.
       # sudo which pgpool
       Responde:
       /usr/bin/pgpool
     

     instalar el repositorio de pgpol:
         # yum install http://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/pgpool-II-release-4.1-1.noarch.rpm
    c) Instalar pgpool
        yum install pgpool-II-12.x86_64
       # sudo yum install pgpool-II-pg96*
    d) # sudo systemctl enable pgpool.service

    //--- Nota para intalar pgpool en EC2 de Amazon
    pgpool en EC2 se instala descargando la version mas actual de pgpool del repositorio de pgpool
    https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/
    a) Descargar el pquete rpm : (Esta es la version mas actual en el momento)
       - pgpool-II-pg10-4.1.0-1pgdg.rhel7.x86_64.rpm
    b) Descargar la libreria de manejo de memoria en cache libmemcache*
       # sudo yum install libmem*
    c) Instalar pgpool con el comando RPM
       # sudo rpm -iv pgpool-II-pg10-4.1.0-1pgdg.rhel7.x86_64.rpm
    d) Recordar abrir los puertos en EC2 , tener en cuenta que en EC2 la apertura de puertos no
       se hace ni con iptables , ni con firewall , sino regisatrando los puertos de interes
       9999,9998 y 5434 en el grup de seguridad de la instancia por el administrador de
       instancias EC2 de AWS.

       Puertos de Ingreso
       - security group
       - launch wizard
       - inboud
       - edit

       Puertos de salida
       - security group
       - launch wizard
       - outboud
       - edit


    -Configuralo para que manejar el pool de sockets
# sudo pg_md5 -u postgres -m sucontraseña
       Genera una contrseña que coloca en el archivo pool_pass en formato MD5
       el par usuario y contraseña de ese archivo debe ser copiado al archivo
       pcp.conf en el mismo directorio

       Nota: supassword debe ser igual al password que asigno al postgres.
       o mediante el comando de postgres:
      
    Nota: este paso es opcional si se va manejar el pcp para administrar y controlar
    el pool de conexiones por su propio administrador.
    Se recomienda ampliamente la instalacion y manejo de PGADMIN , como una herramienta
    muy versatil para la administracion de DB postgres, dada lo amplia en su estructra
    y manejo se sale de la competencia de este instructivo.

    El pcp.conf requiere un password colocalar el mismo de pool_passwd.                                                                                                
                              

    Ahora Configurar el pgpool para adminmistrar conexiones que esencialmente bien
    listo para permitir conexiones a Postres de forma local (por defecto) por el
    puerto de conexion de postgres 5434.

    verificar pgpool.conf tenga minimo los siguientes parametros establecidos.

    listen_addresses = '*'     #Permite conexion por socket como java
    port = 9999                   #Puerto de conexion 9999 de pgpool
    enable_pool_hba = on   #Utiliza el pg_hba de postgres, si hay un solo servidor debe estar off
    pool_passwd = 'pool_passwd'  #si se tiene configurado pg_hba con md5 ,
    connection_cache = on            #Activa el pool de conexiones.
    num_init_children = 32            # valor proporcional ala memoria que se tenga
   
   modificar el pool_hba.conf

   #sudo emacs pool_hba.conf

   #**********************************************************
  # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD                                                                               

# "local" is for Unix domain socket connections only                                                                                       
local   all         all                                   trust
# IPv4 local connections:                                                                                                                  
host    all         all         127.0.0.1/32      trust
host    all         all         ::1/128               trust
*************************************************************

verifcar que el pg_hba.conf de postfgres este pemitiendo conexions
desde pgpool

#sudo emacs pg_hba.conf

#*************************************************************
# TYPE  DATABASE        USER            ADDRESS                 METHOD

local all postgres                                                                md5
host  all postgres      127.0.0.1   255.255.255.255             md5

# "local" is for Unix domain socket connections only
# IPv4 local connections:
host    all             all             127.0.0.1/32        trust
# IPv6 local connections:
host    all             all             ::1/128                 trust


    Abrir los puertos 9999,9898 y 5434 sobre los que escucha pgpool para entrada y
    salida, si no pgpool no funciona.

   # sudo firewall-cmd --zone=public --add-port=9999/tcp --permanent
   # sudo firewall-cmd --zone=public --add-port=9998/tcp --permanent
   # sudo firewall-cmd --zone=public --add-port=5434/tcp --permanent
   Hace la apertura de puertos permanente o sea guarda los cambios.

   # firewall-cmd --reload

   De forma alternativa con iptables los puertos 9999,9998 y 5434
   # sudo iptables -A INPUT  -i eth0 -p tcp --dport 9999 -j ACCEPT
   # sudo iptables -A INPUT  -i eth0 -p tcp --dport 9898 -j ACCEPT

   # sudo iptables -A OUTPUT -o eth0 -p tcp --dport 9999 -j ACCEPT
   # sudo iptables -A OUTPUT -o eth0 -p tcp --dport 9898 -j ACCEPT

   # sudo iptables -A OUTPUT -o eth0 -p tcp --dport 5434 -j ACCEPT
   # sudi iptables -A OUTPUT -o eth0 -p tcp --dport 5434 -j ACCEPT

   Guardar los cambio
   # sudo service iptables save
   de mostrar
   iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]                              

   activar pg pool
   # sudo pgpool
   para parar pgpool
   # sudo pgpool stop

   verificar si hay conexion a pgpool. (conexion al puerto 9999 del
   usuario postgres. en localhost.
   # sudo pgpool
   Nota es una buena practica verificar el servicio esta bien instalado,
   el parametro -n hce que pgpool muestra un log de inicio.Es particularme
   necesario en sistemas que tiene memoria limitada pues se puede presentar
   un error del tipo ya que hay un desbordamiento  de las memoria disponible.

   could not create shared memory for request size: 67108864
   shared memory creation failed with error "Invalid argument"

   # sudo pgpool  -n

   Ingresa a psql por el puerto 9999
   desde alli podemos ver cuantas conexiones hay activas.
  # sudo psql -Upostgres -p9999 -hlocalhost

   Si la conexion se establecio de colocar el prompt de postgres
   #postgres
   para esperar los comados de ve verificacion por ejemplo:
   Muestra la conexion exitosa a postgres.

   postgres=# show pool_nodes;
node_id | hostname  | port | status | lb_weight |  role 
---------+-----------+------+--------+-----------+--------
 0       | localhost | 5432 | 2      | 1.000000  | master
(1 fila)

   Muestra los sockets del pool abiertos.
   postgres=# show pool_processes;

   Debe sacar una informacion similar a:

    pool_pid |     start_time      | database | username |     create_time     | pool_counter
----------+---------------------+----------+----------+---------------------+--------------
 15272    | 2019-12-27 12:08:04 |          |          |                     |
 15275    | 2019-12-27 12:08:04 |          |          |                     |
 15276    | 2019-12-27 12:08:04 |          |          |                     |
 15277    | 2019-12-27 12:08:04 |          |          |                     |
 15278    | 2019-12-27 12:08:04 |          |          |                     |
 15279    | 2019-12-27 12:08:04 |          |          |                     |
 15280    | 2019-12-27 12:08:04 |          |          |                     |
 15281    | 2019-12-27 12:08:04 |          |          |                     |
 15282    | 2019-12-27 12:08:04 |          |          |                     |
 15283    | 2019-12-27 12:08:04 |          |          |                     |
 15284    | 2019-12-27 12:08:04 |          |          |                     |
 15285    | 2019-12-27 12:08:04 |          |          |                     |
 15286    | 2019-12-27 12:08:04 |          |          |                     |
 15288    | 2019-12-27 12:08:04 |          |          |                     |
 15289    | 2019-12-27 12:08:04 |          |          |                     |
 15290    | 2019-12-27 12:08:04 |          |          |                     |
 15291    | 2019-12-27 12:08:04 |          |          |                     |
 15292    | 2019-12-27 12:08:04 |          |          |                     |
 15293    | 2019-12-27 12:08:04 |          |          |                     |
 15294    | 2019-12-27 12:08:04 |          |          |                     |
 15295    | 2019-12-27 12:08:04 |          |          |                     |
 15296    | 2019-12-27 12:08:04 |          |          |                     |
 15297    | 2019-12-27 12:08:04 |          |          |                     |
 15298    | 2019-12-27 12:08:04 |          |          |                     |
 15299    | 2019-12-27 12:08:04 |          |          |                     |
 15300    | 2019-12-27 12:08:04 |          |          |                     |
 15303    | 2019-12-27 12:08:04 |          |          |                     |
 15304    | 2019-12-27 12:08:04 |          |          |                     |
 15305    | 2019-12-27 12:08:04 |          |          |                     |
 15306    | 2019-12-27 12:08:04 | postgres | postgres | 2019-12-27 12:08:09 | 1
 15307    | 2019-12-27 12:08:04 |          |          |                     |
 15308    | 2019-12-27 12:08:04 |          |          |                     |
(32 filas)

  -Para salir de la seccion de prueba utilice el comnando convencional de salir de
  seccion psql
  postgres=# \q

  Verificar si PCP (el administrdor de conxione PGPOOL esta activo
  # sudo pcp_node_info 0 localhost 9898 postgres postgres 0
  Donde:
  (0) -> valor de tiempo de espera en segundos. PCP desconecta si pgPool-II no responde en estos segundos
  (localhost)-> Dirección IP del servidor pgpool
  (9898) -> puerto conexión PCP
  (postgres) -> usuario PCP
  (contraseña) -> postgres PCP, en este caso

  devuelve:
  localhost 5432 1 1.000000
  Indicando que pgpool esta conectado al puerto por defecto de postgres
  y hay un nodo activo.

   Nota es una buena practica registrar el pgpool en un script que
   lo lance cada vez que se requiera un cambio en el postgres.

   ver el script : #sudo emacs /usr/bin/sos
   para actulaizar aplicaciones y acceso a postgres.


13. visualizar varibles de entorno mediante, para determinar si todo esta ok.

    # env                                             

Dependiendo del proceso    de instalacion debe verse algo similar a esto
Verificar cada parametro instaldo en su servidorpara saber si todo quedo ok.

********************************************************************
MANPATH=:/usr/local/easy/share/man
TOMCAT_HOME=/usr/local/tomcat/lib
HOSTNAME=server.prueba.com
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=1000
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/0
JAVA_OPTS= -Djava.awt.headless=true -XX:MaxPermSize=512M -XX:PermSize=512M
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/jdk/bin:/usr/local/jdk/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\
/bin:/usr/local/easy/bin:/usr/local/bin:/usr/X11R6/bin:/root/bin
JAVA_HOME=/usr/local/jdk
XMODIFIERS=@im=ibus
EDITOR=emacs
LANG=es_ES.utf8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LS_OPTIONS=--color=tty -F -a -b -T 0
LOGNAME=root
VISUAL=emacs
QTLIB=/usr/lib64/qt-3.3/lib
CVS_RSH=ssh
CLASSPATH=.:/usr/local/jdk/lib/classes.zip:\
/usr/local/jdk/jre/lib/ext/comm.jar:
LESSOPEN=||/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
HISTTIMEFORMAT=%F %T

*******************************************************************
14. Verificacion de los archivos log.
    Linux posee una amplio manejo de los logs para todos los procesos
    tanto de funcionamiento como de seguridad, en general ubicados
    en
   
    # /var/log

   # sudo ls -l /var/logs
   algunos son archivos y otros son carpetas:
   el uso del comando
   # sudo tail -200 secure
   por ejemplo
   (Se le pide a sistema que muestre las 200 ultimas lineas del archivo de interes secure)
   es ampliamente recomendado para la revision del estado general del sistema;
   El sistema linux tiene un sistema versiones para guardar la informacion
   usualmente separado por guion:
   del tipo:
   -rw-------. 1 root    root             26655691 dic  9 15:24 secure
   -rw-------. 1 root    root            182865652 dic  1 03:49 secure-20191201
   -rw-------. 1 root    root            101899528 dic  8 03:45 secure-20191208

   por ejemplo :
   #sudo tail -100 /var/log/secure

   Este archivo debe ser revisado periodicamente para verificar potenciales
   intentos de ataques.

total 321820
drwxr-xr-x. 2 root    root                 4096 ago  1 02:08 anaconda
drwx------. 2 root    root                 4096 dic  9 15:15 audit
drwxr-xr-x. 2 beamium beamium              4096 dic  9 03:27 beamium
-rw-------. 1 root    root                    0 sep 19 13:42 boot.log
-rw-------. 1 root    utmp              2092800 dic  9 15:24 btmp
-rw-------. 1 root    utmp              1464192 dic  1 03:49 btmp-20191201
drwxr-xr-x. 2 chrony  chrony               4096 ago  8 13:40 chrony
-rw-------. 1 root    root               832600 dic  9 15:24 cron
-rw-------. 1 root    root              3746055 dic  1 03:50 cron-20191201
-rw-------. 1 root    root              3773455 dic  8 03:45 cron-20191208
-rw-r--r--. 1 root    root                90604 nov 30 14:37 dmesg
-rw-r--r--. 1 root    root                    0 nov  1 15:56 dmesg.old
-r--------. 1 root    root                71679 nov 30 14:37 dracut.log
-rw-r-----. 1 root    root               170769 dic  8 19:00 firewalld
-rw-------. 1 root    root                 9149 nov 23 17:17 grubby
-rw-r--r--. 1 root    root                  296 sep 19 13:44 grubby_prune_debug
drwxr-sr-x+ 3 root    systemd-journal      4096 sep 19 16:03 journal
-rw-r--r--. 1 root    root                  292 dic  9 14:54 lastlog
-rw-------. 1 root    root                    0 dic  8 03:45 maillog
-rw-------. 1 root    root                    0 nov 24 03:44 maillog-20191201
-rw-------. 1 root    root                    0 dic  1 03:50 maillog-20191208
-rw-------. 1 root    root               662360 dic  9 15:24 messages
-rw-------. 1 root    root              1782810 dic  1 03:49 messages-20191201
-rw-------. 1 root    root              3256376 dic  8 03:44 messages-20191208
drwxrwx---. 2 nginx   root                 4096 oct 26 03:32 nginx
drwxr-xr-x. 2 noderig noderig              4096 sep 19 13:48 noderig
drwxr-xr-x. 2 ntp     ntp                  4096 ago  8 13:48 ntpstats
drwxr-xr-x. 3 root    root                 4096 sep 19 13:48 puppetlabs
drwxr-xr-x. 2 root    root                 4096 ago  1 02:08 rhsm
drwxr-xr-x. 2 root    root                 4096 dic  9 00:00 sa
-rw-------. 1 root    root             26655691 dic  9 15:24 secure
-rw-------. 1 root    root            182865652 dic  1 03:49 secure-20191201
-rw-------. 1 root    root            101899528 dic  8 03:45 secure-20191208
-rw-------. 1 root    root                    0 dic  8 03:45 spooler
-rw-------. 1 root    root                    0 nov 24 03:44 spooler-20191201
-rw-------. 1 root    root                    0 dic  1 03:50 spooler-20191208
-rw-------. 1 root    root                64256 nov 27 15:43 tallylog
drwxr-x---. 2 toranon toranon              4096 feb 22  2019 tor
drwxr-xr-x. 2 root    root                 4096 sep 13 20:16 tuned
-rw-rw-r--. 1 root    utmp                  384 dic  9 14:54 wtmp
-rw-------. 1 root    root                 6234 dic  8 18:25 yum.log

Estos archvivos de versiones son usualmente grandes, despue de revisarlos es
rcomendable elimuinarlos con el comando /dev/null

Por ejemplo:

# sudo /dev/null /var/log/secure


15.15. A fin de optimizar la respuesta del servidor se debe tener en cuenta
    los siguientes pasos:

    a. Comprimir los recursos en los archivos: css. js e imagenes
    b. Habilitar el tomcat para que envie la informacion comprimida
    c. Habilitar el cache del tomcar para que solo actalice los archivos
      solo si cambian especificamente los archivos css, js, imagenes
    d. Instalar el programa pngquant
       # yum install pngquant                                                                                          
                   

    ejecutar el siguiente script donde esten las imagenes en PNG, comprimir
    todas las de la carpeta. (solo las *.png).
    NOTA: si se tiene en otro formato usar el compresor apropiado para el tipo de
    imagen.

    # find . -name '*.png' -exec pngquant --ext .png --force 256 {} \;                           


    para el efecto actualizar los archivos
    1. Usar una aplicacion para css, js como:
       https://norfipc.com/herramientas/comprimir-limpiar-reducir-archivos-codigo-css.php#result

       Nota : Se debe tener cuidado que los archivos js que esten bien conformados esto es:
       a. Los comentarios se debe usar /* */ en lugar de // (barras inclinadas)
       b. Todas las instruciones deben ser terminadas con ; (punto y coma)
       c. La declaracion de variables var solo debe ser precedida de 1 (un) espacio ante de
          la variable.
          la variable.
          Sugiero usar el ASCII del espacio en blanco var s= String.fromCharCode(32) en lugar
          de var s= " ";
          Ya que no todos los compresores resuelven bien este cadena generando errores inesperados 
       d. El comentario c. aplica en general ya que  los comprensores si encuentar mas de 1 (un)
          espacio eliminan todos los espacios , asi
         si la linea fue definidad como: var   variable= "0" ;
         el sistema de comprension la cambia por varvariable="0"; ocacionando un error de definicion
         de variable
       e. Se recomienda como buena practica terminar todas las funciones con ; por lo mismo del
          numeral c y d.
       f. Definir los procedimientos dentro de un if, else, for y while claramente con llaves ({})
          ya que igual que ocurre en el numeral c, si no las tiene, el compresor puede asimilarlas
          a una sola linea , generando error.
          Por ejemplo la linea:
              if ( a>b)  alert(a);
          el compresor la ve como :
              if(a>)alert(a);
          Lo que ocaciona un error de sintaxis.
          se sugiere hacerla asi;
              if (a > b )
                {
                  alert(a) ;
                };
    Para mejorar la velocidad del servidor se recomienda usar combiando el catche y el modelo de
    trasmision comprimida tipo gzip.

    2. /usr/local/tomcat/conf/server.xml
    Notar las lineas compresion="on" y subsiguientes relacionadas con compresion:

    <Connector connectionTimeout="20000"
                maxThreads="1000"
                port="8080"
                protocol="org.apache.coyote.http11.Http11NioProtocol"
                compression="on"
                compressionMinSize="1024"
                noCompressionUserAgent="gozilla, traviata"
                compressableMimeType="text/html,text/xml,text/plain,text/css,application/javascript,application/json,text/javascript"
                URIEncoding="UTF-8"
                redirectPort="443"/>

   3. Para activar el manejo del cache del tomcat
    NOTA: Debe hacerse en cada aplicacion dentro de la carpeta webapps
          donde apliccion es el nombre del programa.

   inserte las siguientes lineas que mantiene un cache por 2 semanas en este caso, o cuando se actualice alguna de los
   archivos css y js:

   /usr/local/tomcat/webapps/aplicacion/WEB-INF/web.xml
<web-app>
  <filter>
       <filter-name>ExpiresFilter</filter-name>
       <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
       <init-param>
        <param-name>ExpiresByType image</param-name>
        <param-value>access plus 2 weeks</param-value>
       </init-param>
       <init-param>
        <param-name>ExpiresByType text/css</param-name>
        <param-value>access plus 2 weeks</param-value>
       </init-param>
       <init-param>
         <param-name>ExpiresByType application/javascript</param-name>
        <param-value>access plus 2 weeks</param-value>
       </init-param>
    </filter>

    <filter-mapping>
      <filter-name>ExpiresFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

</web-app>

   para activar el cache debe tambien activarse de forma general el cache en
   /usr/local/tomcat/conf/contentext.xml

   <Context cachingallowed="true" crosscontext="true" debug="5"
         path="/jasperserver-pro" reloadable="false">

    <valve classname="org.apache.catalina.authenticator.BasicAuthenticator"
           disableproxycaching="false" securepageswithpragma="true">
        . . .
    </valve>

    ...

   </Context>



****************************************************************************

NOTA: Sobre este instructivo.
Es muy importante tener claro , que este instructivo es una guia
muy basica de la puesta a punto de un servidor tomcat, basado en
Java con un servidor de bases de datos Postgres, pero que es fundamentalmente
un proceso referente y no una receta, y por lo tanto el proceso de cada servidor es algo
sumante variable ya que depende siempre de las actualizaciones tanto del
sistema operativo como cada una de las aplicaciones que se requieran para
poner a punto el servicio.

Tambien tener presente que aunque ahora esta de moda que proveedores de servicio
ofrecen por defecto CENTOS (version 7), esto no siempre es cierto, y pueden haber cambios
mas o menos evenuales hacia otras distribuciones como DEBIAN, UBUNTU (ahora muy popular
entre los desarrolladores), RED-HAT y SUSE, o incluso como es el caso de Amazon
que promueve su propio linux EC2.

El estudio permantente, asimilacion y comprencion de cada uno de los pasos del proceso
es sumamente importante, porque como se dijo en algo tan cambiante lo
unico que queda como estable es la descripcion de las bases del proceso, sin
que de ninguna manera se implique que el seguir estos pasos sea garantia
de un proceso de instalacion existoso del sistema a menos que se tenga claridad y
se vayan ajustando las instancias necesarias de cada proceso y sub-proceso.

Eso implica el estudio y actualizacion permanente de este tipo de sistemas.
El simple hecho de cambio de version del sistema operativo (en este caso centos 7 -> Centos 8)
implica de forma automatica una revision de todas y cada una de aplicaciones
involucradas incluyendo el instalador mismo YUM por APT.

En general los cambios no suelen ser mayores pero, se debe conocecer para hacer
los ajustes pertinentes.
En resumen no hay una formula magica para hacer el tuning de un sistema.


Optimizar el uso de Memoria Tomcat

Tomcat cuenta con procedimento que le permite el uso de la memoria asignado por la JVM, y mantenimiento de los procesos activos denominado G1GC (garbagle colector), los parametros para optimizar este proceso depende de cuanta memoria disponible  se tenga y la velocidad del procesador.

En tomcat se debe crear un archivo en /bin con el nombre setenv.sh que debe presenta la siguiente forma

/usr/local/tomcat/bin/setenv.sh

 JAVA_OPTS="-server -Djava.awt.headless=true -XX:+UseG1GC 

-Xms=4g -Xmx=4g -XX:NewSize=2g -XX:MaxNewSize=2g

-XX:CMSInitiatingOccupancyFraction=65"

*Sugieren colocar los valores se Xms y Xmx iguales, recordad que la memoria aqui asignada ya no pueder usa por OS, por lo tanto debe dejar un margen de memoria

 suficiente para que el sistema  no presente un error de out-memory.

Xmx es la cantidad de memoria asignada a la JVM,  no se recomienda crecerla demasiado porque el proceso de recoleccion de basura puede tomar mucho tiempo , un valor entre 3GB y 4GB esta bien, -XXNewSize y -XXMaxNewSize se puede asingar igual al 50% del Xmx esta es una buen practica para tener un buen balance de desempeño y velocidad en  recoleccion de Basura.

 
-XX:NewSize / -XX:MaxNewSize es el rango de los procesos de nueva generacion en la memoria.

 -XX:CMSInitiatingOccupancyFraction=65 le indica al colector que efectue el proceso de recoleccion de basura en memoria cuando la ocupacion de memoria asignado en Xms supere el 65% de esta.

-Djava.awt.headless=true indica que se va a trabajar en un entono que no tiene consola grafica pero que en algunos casos puede recurrrir a una emulacion. 




Comentarios

Entradas populares