Nginx como proxy inverso para Docker VHosts

4 minutos de lectura

Actualmente estoy tratando de construir mi propio servidor/servicio web y quería configurar cosas como esta:

  • WordPress para el “blog” principal
  • Gitlab para mis repositorios git
  • Owncloud para mi almacenamiento de datos

He estado usando Docker para ejecutar un pequeño y agradable gitlab, que funciona perfectamente bien, mapeándose al puerto: 81 en mi servidor web con mi dominio.

Lo que me molesta un poco es que las imágenes de Docker siempre están vinculadas a un número de puerto específico y, por lo tanto, no son fáciles de recordar, por lo que me encantaría hacer algo como esto:

git.mydomain.com for gitlab
mydomain.com (no subdomain) for my blog
owncloud.mydomain.com for owncloud

Por lo que entendí, necesito un proxy inverso para esto, por lo que decidí usar nginx. Así que configuré las cosas así:

http {
include       mime.types;
default_type  application/octet-stream;

sendfile        on;

keepalive_timeout  65;

server {
    listen       80;
    server_name  mydomain.com;
    location / {
            proxy_pass http://localhost:84;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
server {
    listen 80;
    server_name git.mydomain.com;

    location / {
        proxy_pass http://localhost:81;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

De esta manera, tengo git.mydomain.com funcionando sin problemas, pero mi wordpress solo me muestra una página web en blanco. Mi DNS está configurado así:

Host   Type   MX Destination
*      A      IP
@      A      IP
www    CNAME   @

¿Soy demasiado estúpido o qué está pasando aquí?

  • ¿Está ejecutando cada servicio en su propio contenedor? ¿En qué contenedor de latas se está ejecutando nginx? Recuerde que el host local dentro del contenedor no es lo mismo que el host local fuera del contenedor. O vincule los contenedores y use el env para encontrar IP o use la IP pública del host.

    -Usman Ismail

    9 de noviembre de 2014 a las 0:05

  • Aquí es cuando jwilder/nginx-proxy le salva la cordura y le brinda todo lo que necesita. El contenedor de proxy escucha el demonio de Docker y se reconfigura cada vez que se inicia otro contenedor de aplicaciones web en el mismo host.

    – Devvyn

    26 mayo 2015 a las 19:03

  • posible duplicado de Asignación de vhosts a puertos Docker

    – Devvyn

    26 mayo 2015 a las 19:10

Sé que su pregunta es más específica sobre su configuración de proxy Nginx, pero pensé que sería útil darle este enlace que detalla cómo configurar un contenedor docker de Nginx que implementa automáticamente configuraciones para el proxy inverso de esos contenedores docker. En otras palabras, ejecuta el proxy inverso y luego sus otros contenedores, y el contenedor Nginx enrutará el tráfico a los demás en función del nombre de host.

Básicamente, extrae el contenedor de proxy y lo ejecuta con algunos parámetros establecidos en el docker run comando, y luego abre los otros contenedores que desea proxy. Una vez que instaló Docker y extrajo la imagen de nginx-proxy, los comandos específicos que uso para iniciar el proxy:

docker run -d --name="nginx-proxy" --restart="always" -p 80:80 \
-v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy

Y ahora el proxy se está ejecutando. Puede verificar apuntando un navegador a su dirección, que debería devolver un error Nginx 502 o 503. Obtendrá los errores porque todavía no hay nada escuchando. Para poner en marcha otros contenedores, es muy fácil, así:

docker run -d --name="example.com" --restart="always" \
-e "VIRTUAL_HOST=example.com" w3b1x/mywebcontainer

Que -e "VIRTUAL_HOST=example.com" es todo lo que necesita para que su tráfico de enrutamiento de proxy Nginx llegue al contenedor que está iniciando.

He estado usando este método en particular desde que comencé con Docker y es realmente útil para este tipo de situación. El artículo que vinculé te brinda instrucciones paso a paso y toda la información que necesitarás. Si necesita más información (específicamente sobre la implementación de SSL en esta configuración), puede consultar el repositorio git para este software.

  • Puedo dar fe de esto. Lo he estado usando en producción durante algunos meses y, literalmente, me ha dado una mejor calidad de vida debido a la simplicidad que ofrece en contraste con la reconfiguración manual del proxy para cada implementación de la aplicación.

    – Devvyn

    26 mayo 2015 a las 19:05


Su configuración nginx parece sana, sin embargo, está golpeando localhost:xx, Cuál está mal. debería ser cualquiera gatewayip:xx o mejor target_private_ip:80.

Una manera fácil de lidiar con esto es comenzar sus contenedores con --link y para “inyectar” la ip a través de un script de shell: tenga la configuración nginx “original” con un marcador de posición en lugar de la ip, luego sed -i con el valor del medio ambiente.

¿Ha sido útil esta solución?