Instalacion de un servidor basico centos 7, tomcat 9, postgres 12 con pgpool
==============================================================
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.
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
# sudo emacs /etc/csf/csf.conf
Encuentre las siguientes líneas y agregue los números de puerto que desea abrir:
# Allow incoming TCP portsTCP_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
# 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 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
/var/lib/pgsql/12/data/postgresql.conf
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:
# 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
1500 conexiones
Linux
Para aplicaciones tipo Web
postgres.cnf
*********************************
max_connections = 1500
maintenance_work_mem = 2GB
checkpoint_completion_target = 0.7
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.
# 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
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 ,
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
# 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
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
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.
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.
# "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
*************************************************************
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
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
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
Publicar un comentario