Get it on Google Play
Mas de 21 años en el mundo del IT corporativo

Publicando servicios vía Nginx(Script)

12-07-2019
Proxy Nginx

Proxy Nginx

El siguiente script comprueba cada 5 segundos que puertos están compartiendo los contenedores arrancados dentro de los contenedores que tenemos abiertos y los publica automáticamente a través de un proxy con Nginx(Arrancado dentro de otro contenedor). Además también publica los puertos que se están compartiendo por el puerto 81.
Es muy bueno porque comprueba cada 5 segundo que la configuración requerida es igual a la publicada y solo reinicia el contenedor con Nginx si sin diferentes. És ligero, ágil y practico.
Este script se desarrolló para una formación Mesosphere donde usamos ‘minidcos’ sobre unos servidores virtuales para poder trastear. Gracias a este script podíamos ver desde el exterior las aplicaciones que publicábamos sin ningún esfuerzo.
El script es fácilmente adaptable para usar otros proxys, por ejemplo, Haproxy o leer las configuraciones de otras partes como otros servidores, filtrar por servicio, usar balanceo de carga, etc.
Aquí os dejo el script, si alguien tiene mejoras que las publique en los comentarios o lo haga saber:

#!/bin/bash

# Start: nohup ./auto-balance.sh &

function checkPorts {
	HOSTPORT=82

	DESCTEXT=""

	NGINX=$'worker_processes 1;\n'
	NGINX+=$'events { worker_connections 1024; }\n'
	NGINX+=$'http {\n'
	NGINX+=$'    sendfile on;\n'
	NGINX+=$'    server {\n'
	NGINX+=$'        listen 80;\n'
	NGINX+=$'        location / {\n'
	NGINX+=$'            proxy_pass         http://172.17.0.3;\n'
	NGINX+=$'            proxy_redirect     off;\n'
	NGINX+=$'            proxy_set_header   Host $host;\n'
	NGINX+=$'            proxy_set_header   X-Real-IP $remote_addr;\n'
	NGINX+=$'            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;\n'
	NGINX+=$'            proxy_set_header   X-Forwarded-Host $server_name;\n'
	NGINX+=$'        }\n'
	NGINX+=$'    }\n'


	docker ps -q > "/root/temp.txt"
	for j in $(docker ps -q)    
	do
		docker exec "$j" docker ps > "/root/temp.txt"
		for c in $(docker exec "$j" docker ps)   
		do	
			if [ $(echo "$c" | cut -c 1-8) = "0.0.0.0:" ]  
	  		then  
				PORT=$(echo "$c" | cut -c 9-99)
				PORT=$(echo "$PORT" | cut -d'-' -f 1)

				docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$j" > "/root/temp.txt"
				IP="$(cat /root/temp.txt)"
				NGINX+=$'    server {\n'
				NGINX+=$"        listen $HOSTPORT;"
				NGINX+=$'\n'
				NGINX+=$'        location / {\n'
				NGINX+=$"            proxy_pass         http://$IP:$PORT;"
				NGINX+=$'\n'
				NGINX+=$'            proxy_redirect     off;\n'
				NGINX+=$'            proxy_set_header   Host $host;\n'
				NGINX+=$'            proxy_set_header   X-Real-IP $remote_addr;\n'
				NGINX+=$'            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;\n'
				NGINX+=$'            proxy_set_header   X-Forwarded-Host $server_name;\n'
				NGINX+=$'        }\n'
				NGINX+=$'	 }\n'

				DESCTEXT+=$"<p>$IP:$PORT -> $HOSTPORT</p>"

				HOSTPORT=$((HOSTPORT+1))
			fi
		done
	done

				NGINX+=$'    server {\n'
				NGINX+=$'        listen 81;\n'
				NGINX+=$'        location / {\n'
				NGINX+=$'            default_type text/html;\n'
				NGINX+=$"            return 200 '<h1>Services</h1> $DESCTEXT';"
				NGINX+=$'\n'
				NGINX+=$'        }\n'
				NGINX+=$'	 }\n'


	NGINX+=$'}'

	if [ "$(cat /root/nginx/nginx.conf)" != "$NGINX" ]  
		then
		echo "$NGINX" > "/root/nginx/nginx.conf"
		docker restart 1be6d5cda3d1

		echo " Nginx updated!" >> "/root/auto-log.txt"
		fi

	}

while [ true ]
	do
		echo "[$(date)] Checking Nginx" >> "/root/auto-log.txt"
		checkPorts

		sleep 5
	done
Si te ha servido, por favor comparte
 

Leave a Reply