miércoles, 29 de diciembre de 2021

AWS: cambiar tipo de instancia desde cli



Cómo cambiar el tipo de instancia de AWS desde cli en AWS.



Veamos cómo cambiar el tipo de instancia EC2 de un servidor alojado en AWS usando AWS cli sobre un sistema operativo Linux.

Primero, definimos la variable instance con el ID de la instancia sobre la que queremos trabajar:

instance=i-0bXXXXXXXXXXXXXc1

A continuación apagamos la instancia:

aws ec2 stop-instances --instance-ids ${instance} { "StoppingInstances": [ { "InstanceId": "i-0bXXXXXXXXXXXXXc1", "CurrentState": { "Code": 64, "Name": "stopping" }, "PreviousState": { "Code": 16, "Name": "running" } } ] }

Cambiamos el tipo de instancia:

aws ec2 modify-instance-attribute --instance-id ${instance} --instance-type t3.large

Iniciamos la instancia:

aws ec2 start-instances --instance-id ${instance} { "StartingInstances": [ { "PreviousState": { "Code": 80, "Name": "stopped" }, "CurrentState": { "Code": 0, "Name": "pending" }, "InstanceId": "i-0bXXXXXXXXXXXXXc1" } ] }

Una vez la instancia esté levantada, ya deberíamos ver su nuevo tipo de instancia en su ficha.
0

miércoles, 22 de diciembre de 2021

Montar carpeta de Windows en el boot de Linux



Cómo montar una carpeta compartida en red en Windows en un sistema operativo Linux.



Si tenemos una carpeta compartida en red en Windows y queremos montarla en Linux, podemos editar el fichero /etc/fstab del sistema Linux y añadir una línea con la siguiente sintaxis:

//<Winserver>/<Share> <Mountpoint> <FileSystemType> <Options> 0 0

Por ejemplo:

//winserver/share /mnt/winshare cifs gid=users,file_mode=0664,dir_mode=0775,auto,username=john,password=johnpass 0 0

Opciones:

//winserver/share (Windows Share)
winserver puede ser el FQDN o IP del servidor y /share es la ruta del share.

/mnt/winshare (Mount Point)
Directorio existente en el sistema Linux local que servirá como punto de montaje de la carpeta de Windows.

cifs (File System Type)
Filesystem compatible con Windows.

gid=users
Todos los ficheros y directorios en el sistema remoto serán asignados al grupo "users".

file_mode=0664
Todos los ficheros existentes en el sistema remoto tendrán permisos rw-rw-r--.

dir_mode=0775
Todos los directorios existentes en el sistema reoto tendrán permisos rwxrwxr-x.

auto
Montar automáticamente en el boot.

username=john
Usuario existente en el sistema Windows con el que acceder al recurso: john

password=johnpass
Password del usuario especificado anteriormente: johnpass.

0
Indica que este filesystem no debería ser dumpeado.

0
Indica que este filesystem no debería ser comprobado por fsck.


Fuentes:

https://www.suse.com/support/kb/doc/?id=7000932
0

miércoles, 15 de diciembre de 2021

Exportar lista de máquinas virtuales de VMWare



Exportar lista de máquinas virtuales de un entorno VMWare con vSphere.



Si necesitamos exportar un listado con todas las máquinas virtuales presentes en un entorno VMWare, podemos seguir este sencillo procedimiento desde el vSphere:

En vSphere Client, pulsar Menu y seleccionar Global Inventory Lists.

A la izquierda, seleccionar Hosts para ver hosts en vSphere inventory.

Seleccionar todos los hosts.

Clicar sobre el botón export.

Una vez generado el fichero CSV, ya se podrá descargar para su consulta y/o manipulación.


Fuentes:

https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.vcenterhost.doc...
0

miércoles, 8 de diciembre de 2021

nginx y http2



Permitir peticiones HTTP/2 en nginx.



HTTP/2 es una actualización del protocolo HTTP que mejora la velocidad y la seguridad de las interacciones cliente-servidor en Internet. HTTP/2 agrega varias funciones nuevas al tiempo que mantiene la compatibilidad con versiones anteriores, por lo que los navegadores y servidores sin compatibilidad con HTTP/2 continúan funcionando correctamente, mientras que aquellos que las posean pueden aprovechar las mejoras de rendimiento.

El enfoque principal de las mejoras de HTTP/2 es la velocidad. Una limitación importante de HTTP/1 es que solo permite solicitar un recurso por petición, por lo que para minimizar los tiempos de carga, los navegadores abren múltiples conexiones HTTP/1 a un sitio a la vez para solicitar varios recursos en paralelo, con una sobrecarga significativa. HTTP/2, por su lado, usa conexiones multiplexadas para transmitir múltiples recursos a través de una sola conexión, reduciendo la carga.

HTTP/2 también hace un uso extensivo de la compresión, lo que mejora el rendimiento al ahorrar ancho de banda. En HTTP/2, los encabezados se envían como binarios comprimidos en lugar de como texto sin formato legible por humanos. El considerable ahorro de ancho de banda compensó el aumento menor en la carga de la CPU (para comprimir y descomprimir los encabezados) y la incomodidad para los usuarios humanos que no pueden leer los encabezados (por ejemplo, con fines de depuración).

HTTP/2 también introduce la priorización de recursos. Los navegadores web y otros clientes ahora pueden indicar el orden en el que desean recibir los recursos. Los navegadores con una buena compatibilidad con HTTP/2 pueden generar páginas significativamente más rápido al priorizar los recursos que el usuario necesita ver primero. Las primeras pruebas del rendimiento de HTTP/2 han demostrado que algunas páginas se cargan casi el doble de rápido.

Para permitir peticiones HTTP/2 en nginx para dominio.com debemos añadir "http2" en "listen":

server { listen 443 ssl http2; server_name dominio.com ssl_certificate server.crt; ssl_certificate_key server.key; }

Recargamos la configuración de nginx y este ya empezará a servir material vía HTTP/2.


Fuentes:

https://www.nginx.com/resources/glossary/http2/
http://nginx.org/en/docs/http/ngx_http_v2_module.html
0

miércoles, 1 de diciembre de 2021

Montar carpeta compartida de Windows en Linux



Cómo montar una carpeta compartida en red en Windows en un sistema operativo Linux.



Si tenemos una carpeta compartida en red en Windows y queremos acceder a ella desde un sistema Linux, podemos montarla de la siguiente manera:

mount -t cifs -o username=<WindowsUserID>,password=<UserPassword> //<WinServer>/<Share> /<Mountpoint>

Por ejemplo:

mount -t cifs -o username=usuario,password=contrasena //winserver/share /mnt/winshare

Si no se incluye password en la orden, se preguntará a continuación.

Una vez montada la carpeta, podemos dirigirnos a /mnt/winshare para acceder al contenido.


Fuentes:

https://www.suse.com/support/kb/doc/?id=7000932
0

miércoles, 24 de noviembre de 2021

AWS cli: descargar archivos de S3



Cómo descargar archivos de un bucket S3 mediante el cli de AWS en Linux.



Veamos cómo descargar ficheros de un bucket S3 de AWS.

En este ejemplo, el bucket se llama "blai-1".

Imaginemos que tenemos 2 archivos en local:

[ec2-user@ip-10-5-0-143 ~]$ ls 2021-11-24 11:52:21 30318 file1.txt 2021-11-24 11:52:22 43784 file2.txt

Por otro lado, tenemos 3 ficheros en el bucket S3 "blai-1":

[ec2-user@ip-10-5-0-143 ~]$ aws s3 ls s3://s3-blai-1/files/ 2021-11-24 11:52:51 30318 file1.txt 2021-11-24 11:52:52 43784 file2.txt 2021-11-24 11:52:52 96675 file3.txt

Queremos descargar el archivo file3.txt. Para descargar un fichero, usamos get-object:

[ec2-user@ip-10-5-0-143 ~]$ sudo aws s3api get-object --bucket s3-blai-1 --key files/file3.txt files/file3.txt

Tras descargar el fichero, listamos en local:

[ec2-user@ip-10-5-0-143 ~]$ ls 2021-11-24 11:52:21 30318 file1.txt 2021-11-24 11:52:22 43784 file2.txt 2021-11-24 11:52:52 96675 file3.txt

Ya tenemos file3.txt en local.

El último parámetro de la instrucción es la ruta y nombre de archivo que tendrá en local el archivo que descargamos - seleccionándolo con --key - lo cual puede ser modificado según nuestras necesidades.
0

miércoles, 17 de noviembre de 2021

Ver fecha de caducidad de un certificado .pfx



Comprobar fecha de expiración de un certificado en formato .pfx.



Para ver la fecha de expiración de un certificado en formato .pfx que hayamos exportado de un servidor Windows, podemos usar la utilidad openssl en Windows/Linux:

HOST# openssl pkcs12 -in archivo.pfx -nokeys | openssl x509 -noout -enddate

Donde archivo.pfx es el nombre del certificado en formato pfx.

Para incluir el password del certificado en la línea de comandos, podemos incluir:

-passin pass:"${pass}"

HOST# openssl pkcs12 -in archivo.pfx -nokeys | openssl x509 -noout -enddate -passin pass:”${pass}”

$pass es la variable que contiene el password.
0

miércoles, 10 de noviembre de 2021

curl: (35) error:1408F10B:SSL routines:ssl3



curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number.



Tras apuntar un dominio a un servidor corriendo nginx en modo reverse proxy y acceder al dominio vía línea de comandos mediante curl, me encontré con este error:

curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number

Tras investigar un poco, vi que me había dejado la directiva ssl en la configuración de nginx.

Antes:

server { listen 443; ... }

Después (arreglado):

server { listen 443 ssl; ... }

Una vez añadido "ssl", la web ya fue accesible vía HTTPS sin problemas.

Recordemos que al usar el parámetro "ssl" se indica a los navegadores que todas las conexiones aceptadas en el puerto especificado deben funcionar con SSL/TLS.


Fuentes:

http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
0

miércoles, 3 de noviembre de 2021

Guardar archivos como root en vim



Cómo guardar archivos como root en vim.



A veces me he encontrado con que edito un archivo con vim sin haber usado sudo, y luego no puedo guardarlo, con un error en pantalla al ejecutar :wq! que dice algo similar a "advertencia: cambiando un archivo de solo lectura".

Si hemos podido leer el fichero significa que podemos guardarlo con otro nombre; no hace falta salir y editar el fichero con sudo. Vim permite hacer esto usando el comando:

:w otro_nombre

No obstante, esta no es la mejor opción, dado que tendríamos que ejecutar una instrucción adicional para reemplazar el archivo que estamos editando:

!sudo mv otro_nombre %

% equivale a poner la ruta del archivo que estamos editando.
! al principio indica a vim que ejecute una instrucción usando el intérprete del sistema.

Para evitar tener que escribir dos instrucciones, podemos ejecutar la siguiente instrucción, todo en uno:

:w!sudo dd of=%

:w ! lo que sigue a ! se ejecuta tomando el búfer (es decir, el archivo) como entrada estándar.
sudo nos permite ejecutar la instrucción con permisos de root.
dd of=% toma la entrada estándar y escribe su contenido en el archivo que estamos editando.

Como usamos sudo, deberemos introducir nuestra contraseña. Luego pulsamos O y despúes Enter.

Como vim permite guardar comandos personalizados, podemos crear el siguiente comando:

cmap w!! w !sudo dd of=%

Así, la próxima vez que editemos un archivo sin haber usado sudo, bastará con ejecutar:

:w!!

Esto nos permitirá guardarlo sin problemas.
0

miércoles, 27 de octubre de 2021

AWS cli: subir archivos a S3



Cómo subir y sincronizar archivos a un bucket S3 mediante el cli de AWS en Linux.



Veamos cómo subir y sincronizar ficheros a un bucket S3 de AWS.

En este ejemplo, el bucket se llama "blai-1".

Imaginemos que tenemos 3 archivos en local:

[ec2-user@ip-10-5-0-143 ~]$ 2021-10-27 10:56:21 30318 file1.txt 2021-10-27 10:56:22 43784 file2.txt 2021-10-27 10:56:22 96675 file3.txt

Subimos los 3 ficheros al bucket usando "sync files":

[ec2-user@ip-10-5-0-143 ~]$ aws s3 sync files s3://s3-blai-1/files/ upload: files/file1.txt to s3://s3-blai-1/files/file1.txt upload: files/file2.txt to s3://s3-blai-1/files/file2.txt upload: files/file3.txt to s3://s3-blai-1/files/file3.txt

Listamos los ficheros presentes en el bucket:

[ec2-user@ip-10-5-0-143 ~]$ aws s3 ls s3://s3-blai-1/files/ 2021-10-27 10:56:31 30318 file1.txt 2021-10-27 10:56:32 43784 file2.txt 2021-10-27 10:56:32 96675 file3.txt

Borramos file1.txt en local:

[ec2-user@ip-10-5-0-143 ~]$ sudo rm files/file1.txt sudo rm files/file1.txt

Hacemos otro sync de archivos, esta vez con el flag delete.

El flag "delete" indica que se borre del bucket aquello que no exista en local:

[ec2-user@ip-10-5-0-143 ~]$ aws s3 sync files s3://s3-blai-1/files/ --delete delete: s3://s3-blai-1/files/file1.txt

Tras la instrucción anterior, listamos los ficheros presentes en el bucket:

[ec2-user@ip-10-5-0-143 ~]$ aws s3 ls s3://s3-blai-1/files/ 2021-10-27 10:56:32 43784 file2.txt 2021-10-27 10:56:32 96675 file3.txt

Observamos que file1.txt ya no existe.
0

miércoles, 20 de octubre de 2021

SAP: disco al 100%, lleno de logs



Cómo liberar espacio ocupado al 100% por logs en SAP.



Si un sistema SAP tiene el disco al 100% de ocupación es muy posible que este esté lleno de logs.

Se puede comprobar yendo a la carpeta "hdb00004" y observando centenares de ficheros de log.

Para reclamar este espacio, podemos hacer lo siguiente:

1. En global.ini, cambiar el parámetro log_mode a overwrite

2. Reiniciar BBDD y SAP

3. Cambiar log_mode a normal

4. Reiniciar el sistema de nuevo

5. En una ventana de SQL, ejecutar:

ALTER SYSTEM RECLAIM LOG

Tras ejecutar estos pasos, el espacio en disco debería haberse liberado.


Fuentes:

https://answers.sap.com/questions/337800/sap-business-one-hana---delete-log-files-in-mnt000.html
0

miércoles, 13 de octubre de 2021

Balancear cache en varios discos usando NGINX



Cómo distribuir el contenido de la cache almacenada en varios discos distintos.



Hace unos días contaba cómo guardar contenido cacheado en un NGINX que actúa como reverse proxy. Hoy contaré una característica adicional a la configuración presentada anteriormente.

Imaginemos que estamos cacheando contenido en el reverse proxy no tanto para aumentar la velocidad de carga de una web sino para poder presentar ciertas imágenes en caso de que los servidores que las almacenan caigan y dejen de servirlas para asegurar así su disponibilidad.

Si tenemos varios discos duros mapeados a la máquina donde está instalado NGINX, podemos usar NGINX para dividir el caché almacenado entre ellos, añadiendo una capa extra a alta disponibilidad.

A continuación, un ejemplo que muestra como dividir a los clientes de manera uniforme en dos discos duros distintos según el URI de la solicitud enviada por el cliente:

proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g inactive=60m use_temp_path=off; proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m max_size=10g inactive=60m use_temp_path=off; split_clients $request_uri $my_cache { 50% “my_cache_hdd1”; 50% “my_cache_hdd2”; } server { # ... location / { proxy_cache $my_cache; proxy_pass http://my_upstream; } }

Las dos directivas proxy_cache_path definen dos cachés (my_cache_hdd1 y my_cache_hdd2) en dos discos duros diferentes (hdd1 y hdd2), para asegurar la alta disponibilidad.

El bloque de configuración split_clients especifica que los resultados de la mitad de las solicitudes (50 %) se almacenan en caché en my_cache_hdd1 y la otra mitad en my_cache_hdd2. El hash basado en la variable $request_uri (el URI de la solicitud) determina qué caché se usa para cada solicitud, lo que da como resultado que las solicitudes de un URI determinado siempre se almacenan en el mismo caché.

Mencionar que este enfoque no reemplaza la configuración de un RAID. Si hay una falla en uno de los discos, podría darse un comportamiento impredecible en el sistema, como mostrarse errores 500 a las solicitudes que se dirigieron al disco duro defectuoso.


Fuentes:

https://www.nginx.com/blog/nginx-caching-guide/
0

miércoles, 6 de octubre de 2021

Forzar reboot en Linux



Cómo ampliar o extender un volumen LVM en Linux.



Queremos reiniciar una máquina Linux, y al ejecutar el comando "reboot" nos encontramos con el siguiente mensaje de error en pantalla:

HOST # reboot Failed to open initctl fifo: No such device or address Failed to talk to init daemon.

Independientemente de cuál sea el problema y del estado en el que se encuentre la máquina, la utilidad systemctl permite forzar el reinicio de un Linux "pase lo que pase" de la siguiente manera:

HOST # systemctl --force --force reboot Rebooting.

Ahora sí, la máquina ya debería estar reiniciándose.
0

miércoles, 29 de septiembre de 2021

Acceder a filesystems de WSL desde Windows



Cómo solucionar el error C0070057 que impide usar Microsoft Teams en Windows".



Puede ser interesante acceder a los filesystems de WSL (Windows Subsystem for Linux) desde el explorador de Windows. Esto ya es posible en WSL v2.

Para ello, primero deberemos listar los discos duros de nuestro equipo:

C:\Users\Usuario\Documents>wmic diskdrive list brief Caption DeviceID Model Partitions Size SAMSUNG MZ7LN256HC-07 \\.\PHYSICALDRIVE0 SAMSUNG MZ7LN256HCHP-00007 3 256

Las rutas de los discos están disponibles en las columnas 'DeviceID'.
Por lo general, los discos tienen el formato \\.\\\.\PHYSICALDRIVE*.


Montar


Para montar este disco usaríamos:

wsl --mount \\.\PHYSICALDRIVE0 --partition 1

El sistema quedará montado bajo /mnt/wsl/PHYSICALDRIVE0p1/

De forma predeterminada, wsl --mount intenta montar el disco como ext4.

Desde Windows, podemos dirigirnos a \wsl$ - o en este caso a \wsl\PHYSICALDRIVE0p1 - desde el explorador de Windows y veremos las carpetas y ficheros del sistema WSL.


Desmontar


Para desmontar el disco:

wsl --umount \\.\PHYSICALDRIVE0


Fuentes:

https://devblogs.microsoft.com/commandline/access-linux-filesystems-in-windows-and-wsl-2/
0

miércoles, 22 de septiembre de 2021

AWS: script python para crear snapshots y rotarlos



script en python para crear snapshots y rotarlos en AWS.



A continuación explicaré como crear snapshots en AWS usando un script en python, que a su vez rotará los snapshots, todo ello usando AWS cli en Linux.

Crear un cron que cree snapshots cada *:

[ec2-user@ip-10-5-0-143 ~]$ echo "* * * * * aws ec2 create-snapshot --volume-id vol-0b2efa7e024e758e5 2>&1 >> /tmp/cronlog" > cronjob [ec2-user@ip-10-5-0-143 ~]$ crontab cronjob

Miramos qué snapshots existen en este momento:

[ec2-user@ip-10-5-0-143 ~]$ aws ec2 describe-snapshots --filters "Name=volume-id,Values=vol-0b2efa7e024e758e5" { "Snapshots": [ { "Description": "", "Encrypted": false, "VolumeId": "vol-0b2efa7e024e758e5", "State": "pending", "VolumeSize": 8, "StartTime": "2020-06-17T10:50:02.036Z", "Progress": "99%", "OwnerId": "077455710323", "SnapshotId": "snap-0c9062daba8a9f4f7" }, { "Description": "", "Encrypted": false, "VolumeId": "vol-0b2efa7e024e758e5", "State": "completed", "VolumeSize": 8, "StartTime": "2020-06-17T10:45:11.200Z", "Progress": "100%", "OwnerId": "077455710323", "SnapshotId": "snap-0f2af28035ea778e5" }, { "Description": "", "Encrypted": false, "VolumeId": "vol-0b2efa7e024e758e5", "State": "completed", "VolumeSize": 8, "StartTime": "2020-06-17T10:49:02.082Z", "Progress": "100%", "OwnerId": "077455710323", "SnapshotId": "snap-0870e6eba7a6cc337" } ] }

Paramos crontab:

[ec2-user@ip-10-5-0-143 ~]$ crontab -r

Script para eliminar snapshots excepto 2:

[ec2-user@ip-10-5-0-143 ~]$ more snapshotter.py #!/usr/bin/env python import boto3 MAX_SNAPSHOTS = 2 # Number of snapshots to keep # Create the EC2 resource ec2 = boto3.resource('ec2') # Get a list of all volumes volume_iterator = ec2.volumes.all() # Create a snapshot of each volume for v in volume_iterator: v.create_snapshot() # Too many snapshots? snapshots = list(v.snapshots.all()) if len(snapshots) > MAX_SNAPSHOTS: # Delete oldest snapshots, but keep MAX_SNAPSHOTS available snap_sorted = sorted([(s.id, s.start_time, s) for s in snapshots], key=lambd a k: k[1]) for s in snap_sorted[:-MAX_SNAPSHOTS]: print "Deleting snapshot", s[0] s[2].delete()

Miramos cuantos snapshots hay:

[ec2-user@ip-10-5-0-143 ~]$ aws ec2 describe-snapshots --filters "Name=volume-id, Values=vol-0b2efa7e024e758e5" --query 'Snapshots[*].SnapshotId' [ "snap-0c9062daba8a9f4f7", "snap-0f2af28035ea778e5", "snap-0870e6eba7a6cc337" ]

Ejecutamos el script:

[ec2-user@ip-10-5-0-143 ~]$ python snapshotter.py Deleting snapshot snap-0f2af28035ea778e5 Deleting snapshot snap-0870e6eba7a6cc337

Miramos cuantos snapshos quedan:

[ec2-user@ip-10-5-0-143 ~]$ aws ec2 describe-snapshots --filters "Name=volume-id, Values=vol-0b2efa7e024e758e5" --query 'Snapshots[*].SnapshotId' [ "snap-0c9062daba8a9f4f7", "snap-0c87c81530f2f06c3" ]
0

miércoles, 15 de septiembre de 2021

Deshabilitar SELinux en CentOS



Cómo deshabilitar SELinux en CentOS.



Primero miramos el estado actual de SELinux en el sistema:

[centos@ip-10-252-3-87 ~]$ sudo sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 31

Vemos que SELinux está enabled (activo) en modo targeted.

Podemos modificar este estado para la sesión actual de targeted a permissive con el siguiente comando:

[centos@ip-10-252-3-87 ~]$ sudo setenforce 0

Comprobamos el estado actual de la política:

[centos@ip-10-250-3-87 ~]$ sudo sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: permissive Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 31

Si queremos deshabilitar permanentemente SELinux, debemos:

1. Editar el fichero /etc/selinux/config
2. Escribir SELINUX=disabled

# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted

Reiniciar el sistema con:

[centos@ip-10-252-3-87 ~]$ sudo shutdown -r now

Una vez reiniciado el equipo, comprobar el estado de SELinux con:

[centos@ip-10-252-3-87 ~]$ getenforce Disabled

SELinux ha quedado deshabilitado permanentemente.
0

miércoles, 8 de septiembre de 2021

Guardando caché en un reverse proxy nginx



Cómo configurar cache en reverse proxy nginx.



Un caché de contenido se encuentra entre un cliente y un "servidor de origen" y guarda copias de todo el contenido que este presenta. Si un cliente solicita contenido que el caché ha almacenado, este devuelve el contenido directamente sin contactar al servidor de origen. Esto mejora el rendimiento de una web ya que la caché de contenido está más cerca del cliente y utiliza los servidores de aplicaciones de manera más eficiente porque no tienen que hacer el trabajo de generar páginas desde cero cada vez.

Hay potencialmente varios cachés entre el navegador web y el servidor de aplicaciones: el caché del navegador del cliente, los cachés intermediarios, las redes de entrega de contenido (CDN) y el equilibrador de carga o el proxy inverso que se encuentra frente a los servidores de aplicaciones. El almacenamiento en caché, incluso a nivel de equilibrador de carga/proxy inverso, puede mejorar considerablemente el rendimiento.

NGINX se implementa comúnmente como un proxy inverso o un balanceador de carga en una pila de aplicaciones y tiene un conjunto completo de funciones de almacenamiento en caché. Para ello, solo se necesitan dos directivas: proxy_cache_path y proxy_cache. La directiva proxy_cache_path establece la ruta y la configuración del caché, y la directiva proxy_cache lo activa.

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { # ... location / { proxy_cache my_cache; proxy_pass http://my_upstream; } }

Los parámetros de la directiva proxy_cache_path definen la siguiente configuración:

- El directorio del disco local para el caché se llama /ruta/a/caché/.

- levels establece una jerarquía de directorios de dos niveles en /ruta/a/caché/. Tener una gran cantidad de archivos en un solo directorio puede ralentizar el acceso a los archivos, por lo que recomendamos una jerarquía de directorios de dos niveles para la mayoría de las implementaciones. Si el parámetro de niveles no está incluido, NGINX coloca todos los archivos en el mismo directorio.

- keys_zone configura una zona de memoria compartida para almacenar las claves de caché y los metadatos, como los temporizadores de uso. Tener una copia de las claves en la memoria permite que NGINX determine rápidamente si una solicitud es HIT o MISS sin tener que ir al disco, lo que acelera enormemente la verificación. Una zona de 1 MB puede almacenar datos de unas 8000 claves, por lo que la zona de 10 MB configurada en el ejemplo puede almacenar datos de unas 80 000 claves.

- max_size establece el límite superior del tamaño de la memoria caché (a 10 gigabytes en este ejemplo). es opcional; no especificar un valor permite que la memoria caché crezca para usar todo el espacio disponible en el disco. Cuando el tamaño de la caché alcanza el límite, un proceso llamado administrador de caché elimina los archivos que se usaron menos recientemente para que el tamaño de la caché vuelva a estar por debajo del límite.

- inactive especifica cuánto tiempo puede permanecer un elemento en la memoria caché sin que se acceda a él. En este ejemplo, el proceso del administrador de caché elimina automáticamente un archivo que no se ha solicitado durante 60 minutos, independientemente de si ha caducado o no. El valor predeterminado es 10 minutos (10 m). El contenido inactivo difiere del contenido caducado. NGINX no elimina automáticamente el contenido que ha caducado según lo definido por un encabezado de control de caché (Cache-Control:max-age=120, por ejemplo). El contenido caducado (obsoleto) se elimina solo cuando no se ha accedido a él durante el tiempo especificado por inactivo. Cuando se accede al contenido caducado, NGINX lo actualiza desde el servidor de origen y restablece el temporizador inactivo.

- NGINX primero escribe los archivos que están destinados a la memoria caché en un área de almacenamiento temporal, y la directiva use_temp_path=off le indica a NGINX que los escriba en los mismos directorios donde se almacenarán en la memoria caché. Le recomendamos que desactive este parámetro para evitar la copia innecesaria de datos entre sistemas de archivos. use_temp_path se introdujo en NGINX versión 1.7.10 y NGINX Plus R6.

- proxy_cache activa el almacenamiento en caché de todo el contenido que coincide con la URL del bloque de ubicación principal (en el ejemplo, /). También puede incluir la directiva proxy_cache en un bloque de servidor; se aplica a todos los bloques de ubicación del servidor que no tienen su propia directiva proxy_cache.

Una característica poderosa del almacenamiento en caché de contenido de NGINX es que NGINX se puede configurar para entregar contenido obsoleto de su caché cuando no puede obtener contenido nuevo de los servidores de origen. Esto puede suceder si todos los servidores de origen de un recurso en caché están inactivos o temporalmente ocupados.

Si un contenido no está disponible, en lugar de transmitir el error al cliente, NGINX entrega la versión obsoleta del archivo desde su caché. Esto proporciona un nivel adicional de tolerancia a fallas para los servidores que NGINX está representando y garantiza el tiempo de actividad en caso de fallas del servidor o picos de tráfico. Para habilitar esta funcionalidad, incluir la directiva proxy_cache_use_stale:

location / { # ... proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; }

Si NGINX recibe un error, tiempo de espera o cualquiera de los errores 5xx especificados del servidor de origen y tiene una versión obsoleta del archivo solicitado en su caché, entrega el archivo obsoleto en lugar de transmitir el error al cliente.


Fuentes:

https://www.nginx.com/blog/nginx-caching-guide/
0

miércoles, 1 de septiembre de 2021

Ampliar volumen LVM



Cómo ampliar o extender un volumen LVM en Linux.



Un volumen LVM llega al 100% de ocupación en un servidor Linux y debemos ampliarlo para que la aplicación que corre sobre él siga funcionando con normalidad.

Observemos que /dev/mapper/centos_centreon--central-var_lib_mysql está al 100%:

[root@centreon-central ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.9M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/mapper/centos_centreon--central-root 20G 3.5G 16G 19% / /dev/sda1 969M 282M 621M 32% /boot /dev/mapper/centos_centreon--central-var_lib_centreon 6.8G 2.6G 3.9G 40% /var/lib/centreon /dev/mapper/centos_centreon--central-var_lib_centreon--broker 4.8G 236M 4.4G 6% /var/lib/centreon-broker /dev/mapper/centos_centreon--central-var_cache_centreon_backup 4.8G 61M 4.5G 2% /var/cache/centreon/backup /dev/mapper/centos_centreon--central-var_log 9.8G 590M 8.7G 7% /var/log /dev/mapper/centos_centreon--central-var_lib_mysql 16G 15G 0 100% /var/lib/mysql tmpfs 379M 0 379M 0% /run/user/0

Añadimos 14 GB al disco de la máquina (con VMWare) y mostramos info del volumegroup:

[root@centreon-central ~]# vgdisplay --- Volume group --- VG Name centos_centreon-central System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 94 VG Access read/write VG Status resizable MAX LV 0 Cur LV 7 Open LV 7 Max PV 0 Cur PV 2 Act PV 2 VG Size <81.02 GiB PE Size 4.00 MiB Total PE 20740 Alloc PE / Size 17152 / 67.00 GiB Free PE / Size 3588 / <14.02 GiB VG UUID gNfI3W-1FLX-zcfi-ZycH-uxmZ-jlhf-439sEF

Vemos que hay 14 GB libres.

Ampliamos/extendemos el volumen que se ha quedado sin espacio:

/dev/mapper/centos_centreon--central-var_lib_mysql

[root@centreon-central ~]# lvextend /dev/mapper/centos_centreon--central-var_lib_mysql -L +14G Size of logical volume centos_centreon-central/var_lib_mysql changed from 16.00 GiB (4096 extents) to 30.00 GiB (7680 extents). Logical volume centos_centreon-central/var_lib_mysql successfully resized.

Lanzamos un df para ver cómo ha quedado el volumen:

[root@centreon-central ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.9M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/mapper/centos_centreon--central-root 20G 3.5G 16G 19% / /dev/sda1 969M 282M 621M 32% /boot /dev/mapper/centos_centreon--central-var_lib_centreon 6.8G 2.6G 3.9G 40% /var/lib/centreon /dev/mapper/centos_centreon--central-var_lib_centreon--broker 4.8G 236M 4.4G 6% /var/lib/centreon-broker /dev/mapper/centos_centreon--central-var_cache_centreon_backup 4.8G 61M 4.5G 2% /var/cache/centreon/backup /dev/mapper/centos_centreon--central-var_log 9.8G 590M 8.7G 7% /var/log /dev/mapper/centos_centreon--central-var_lib_mysql 16G 15G 0 100% /var/lib/mysql tmpfs 379M 0 379M 0% /run/user/0

El nuevo tamaño aun no se refleja en el volumen. Usamos resize2fs para finalizar el proceso:

[root@centreon-central ~]# resize2fs /dev/mapper/centos_centreon--central-var_lib_mysql resize2fs 1.42.9 (28-Dec-2013) Filesystem at /dev/mapper/centos_centreon--central-var_lib_mysql is mounted on /var/lib/mysql; on-line resizing required old_desc_blocks = 2, new_desc_blocks = 4 The filesystem on /dev/mapper/centos_centreon--central-var_lib_mysql is now 7864320 blocks long.

Volvemos a mirar el espacio del volumen:

[root@centreon-central ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.9M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/mapper/centos_centreon--central-root 20G 3.5G 16G 19% / /dev/sda1 969M 282M 621M 32% /boot /dev/mapper/centos_centreon--central-var_lib_centreon 6.8G 2.6G 3.9G 40% /var/lib/centreon /dev/mapper/centos_centreon--central-var_lib_centreon--broker 4.8G 236M 4.4G 6% /var/lib/centreon-broker /dev/mapper/centos_centreon--central-var_cache_centreon_backup 4.8G 61M 4.5G 2% /var/cache/centreon/backup /dev/mapper/centos_centreon--central-var_log 9.8G 591M 8.7G 7% /var/log /dev/mapper/centos_centreon--central-var_lib_mysql 30G 15G 14G 53% /var/lib/mysql tmpfs 379M 0 379M 0% /run/user/0

La utilidad df ya muestra el nuevo tamaño correctamente.
0

miércoles, 25 de agosto de 2021

Obtener SamAccountName a través de un nombre



Cómo consegir el SamAccountName de cada nombre de una lista en un Active Directory.



Digamos que tenemos una lista con nombres de empleados y necesitamos saber el nombre de usuario de cada uno de ellos dentro de un Active Directory de forma automática.

Con el siguiente código, podemos genrar un csv con la lista de nombres de usuario que buscamos:

Import-Csv C:\lista.txt | ForEach {
Get-ADUser -Filter "DisplayName -eq '$($_.DisplayName)'" -Properties Name, SamAccountName | Select SamAccountName 
} | Export-CSV -path C:\sam.csv -NoTypeInformation

Para que este procedimiento funcione, cada nombre debe estar includio en una línea independiente dentro del archivo lista.txt.

miércoles, 18 de agosto de 2021

Instalar AWS cli en Windows



Cómo instalar AWS cli en Windows.



AWS cli puede ser instalado en Linux, Windows y MacOS. Veamos cómo instalarlo en Windows.

Para instalar AWS cli en Windows, primero debemos descargar el instalador:

https://awscli.amazonaws.com/AWSCLIV2.msi

Acto seguido, instalamos el archivo descargado. Alternativamente, podemos instalarlo vía cmd:

C:\> msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi

Miramos que haya quedado instalado:

C:\> aws --version aws-cli/2.4.5 Python/3.8.8 Windows/10 exe/AMD64 prompt/off

Ahora es momento de configurar el acceso a nuestra cuenta, con las credenciales que hayamos creado en IAM y la región que queramos controlar desde cli:

HOST # aws configure AWS Access Key ID [None]: ABCDEFGHIJKLMNOPQRSTUV AWS Secret Access Key [None]: 123456789abcdefgABCDEFG Default region name [None]: eu-west-1 Default output format [None]: json

A partir de este momento ya podemos lanzar comandos con aws cli.

Por ejemplo, para listar nuestros buckets S3:

HOST # aws s3 ls 2021-06-03 17:08:50 bucket2 2021-06-01 14:55:44 bucket1


Fuentes:

https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
0

miércoles, 11 de agosto de 2021

Cómo configurar HSTS en Nginx



Cómo obligar a un navegador a usar HTTPS al acceder a nuestro dominio.



HSTS (HTTP Strict Transport Security o "Seguridad Estricta para el Transporte HTTP") es una política de seguridad en la que un servidor (como Nginx) especifica a los clientes (navegadores web) el requerimiento de usar HTTPS en todo momento para conectarse a ellos.

Para que HSTS funcione, el servidor manda la cabecera "Strict-Transport-Security", tras lo cual el cliente se verá obligado a usar HTTPS durante el tiempo especificado en el campo "max-age" de la cabecera.

Como HSTS se establece desde los headers, debemos añadir un header con dicha información.

Para añadir un header con la config. de HSTS, debemos escribir:

add_header Strict-Transport-Security "max-age=31536000";

IMPORTANTE: este header debe añadirse dentro de la directiva server, es decir, debe añadirse individualmente para cada dominio/subdominio que apunte a nginx, no puede añadirse una sola vez para todos los dominios dentro de la directiva http (por desgracia).

Como vemos en el código de ejemplo, la variable ‘max-age’ especifica que los clientes deben usar HTTPS durante 1 año (31536000 segundos), aunque esta cantidad puede modificarse.

Por otro lado, podemos incluir nuestra página en una lista de dominios que precargan HSTS por defecto en Google Chrome si añadimos nuestro dominio en https://hstspreload.org.

Para que Google Chrome precargue nuestra web en HTTPS por defecto, el header debe contener las palabras clave includeSubDomains y preload:

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

includeSubdomains hace que todos los subdominios de un dominio también usen HTTPS.

preload indica al cliente (navegador) que incluya nuestro dominio en la lista mencionada.

Elijamos el tipo de configuración que elijamos, debemos recargar la config. de nginx mediante:

nginx -s reload

Una vez recargado, HSTS quedará activo.
0

miércoles, 4 de agosto de 2021

Error de Microsoft Teams C0070057



Cómo solucionar el error C0070057 que impide usar Microsoft Teams en Windows".



Al volver de vacaciones, encendí el PC del trabajo y al abrir Teams me encontré con este error:



Tras leer en reddit acerca de este fallo de Windows, lo que hice para solucionarlo fue ir a la opción correo electrónico y cuentas, clicando en el botón inicio y escribiendo "correo":



Cliqué sobre "Agregar una cuenta de trabajo o escuela" e introduje, de nuevo, mi cuenta de correo empresarial, para regenerar el perfil corrupto que provoca el error.

Una vez hecho esto, el pop up con el error dejó de aparecer y Teams volvió a funcionar con normalidad.
1

miércoles, 28 de julio de 2021

Replicar directorios entre 2 servidores Linux



Cómo replicar una estructura de directorios (sin archivos) entre dos servidores Linux.



Puede que necesitemos replicar una estructura de directorios entre 2 servidores Linux y que solo queramos copiar los directorios, no los archivos. En ese caso, podemos usar la herramienta rsync.

Para esta tarea, usaremos las siguientes opciones de rsync:

Copiar los directorios:

-f"+ */"

No copiar los archivos:

-f"- *"

Seguido de la ruta en origen y la ruta en destino:

HOST# rsync -av -f"+ */" -f"- *" /carpeta/ root@destino:/carpeta/

Tras ejecutar el comando anterior, el árbol de carpetas de origen, es decir, la carpeta que hemos indicado y todas sus subcarpetas, se copiarán en destino, sin los archivos que haya en su interior.

El resto de opciones de rsync significan:

-a: archive mode; es como ejecutar las opciones -rlptgoD
-v: mostrar más información por pantalla.

Rescto al parámetro -a / -rlptgoD, singifica:

-r, --recursivo: entra a los subdirectorios
-l, --links: copiar enlaces
-p, --perms: preservar pemisos
-t, --times: preservar marcas de tiempo
-g, --group: el grupo en destino es el mismo que el grupo en origen
-o, --owner: preservar el autor
-D, -devices --specials: transfiere archivos especiales
0

miércoles, 21 de julio de 2021

PowerShell: comprobar si un puerto está abierto



Cómo comprobar si un puerto está abierto usando PowerShell.



Para comprobar si un puerto está abierto, podemos usar el siguiente script de PowerShell:

Function Test-PortConnection { [CmdletBinding()] # Parameters used in this function Param ( [Parameter(Position=0, Mandatory = $True, HelpMessage="Provide destination source", ValueFromPipeline = $true)] $Destination, [Parameter(Position=1, Mandatory = $False, HelpMessage="Provide port numbers", ValueFromPipeline = $true)] $Ports = "80" ) $ErrorActionPreference = "SilentlyContinue" $Results = @() ForEach($D in $Destination) { # Create a custom object $Object = New-Object PSCustomObject $Object | Add-Member -MemberType NoteProperty -Name "Destination" -Value $D Write-Verbose "Checking $D" -ForegroundColor Yellow ForEach ($P in $Ports) { $Result = (Test-NetConnection -Port $p -ComputerName $D ).PingSucceeded If(!$Result) { $Status = "Failure" } Else { $Status = "Success" } $Object | Add-Member Noteproperty "$("Port " + "$p")" -Value "$($status)" } $Results += $Object # or easier way true/false value # # ForEach ($P in $Ports) # { # $Result = $null # $Result = Test-NetConnection -Port $p -ComputerName $D # $Object | Add-Member Noteproperty "$("Port " + "$p")" -Value "$($Result)" # } # # $Results += $Object # } # Final results displayed in new pop-up window If($Results) { $Results } }

Tras pegar el script en la consola de PowerShell, podemos usarlo de la siguiente manera:

Test-NetConnection -ComputerName hostname -Port 443

Dodne hostname es el hostname de la máquina y 443 el puerto a comprobar.
0