Bandera: Русский Русский Bandera: English English

Jitsi Meet (Docker) detrás de un proxy inverso Nginx

Publicado el 05.11.2025

Cómo instalar Jitsi Meet (Docker) detrás de Nginx Reverse Proxy

En el artículo anterior desplegamos un servidor Jitsi Meet básico con Docker.
Es una excelente forma de arrancar videoconferencias rápidamente, pero en producción el servidor Jitsi a menudo debe funcionar en el mismo host donde ya están otras aplicaciones web.
Para que todo conviva en paz, hay que ocultar Jitsi detrás de un Nginx reverse proxy.
Nginx se encargará del SSL, de los puertos 80/443 y hará de proxy de las peticiones hacia los contenedores Jitsi que escuchan en puertos internos.


Arquitectura

El esquema objetivo se ve así:

  1. Usuariohttps://meet.your-domain.comNginx (puerto 443)
  2. Nginxhttp://192.168.1.131:8400Contenedor Web de Jitsi (interfaz web y WebSocket)
  3. Usuario → (puerto 10000/UDP) → Contenedor JVB de Jitsi (flujo de vídeo/audio)

Importante: Nginx solo proxifica el tráfico web.
Los medios (vídeo y audio por WebRTC) van directamente al Jitsi Videobridge por el puerto 10000/UDP.


Paso 1. Configurar Jitsi Meet (.env)

Antes de configurar el proxy hay que decirle a Jitsi que ahora HTTPS y los certificados los gestiona el Nginx externo.

Abra .env y establezca:

DISABLE_HTTPS=1
HTTP_PORT=8400
HTTPS_PORT=8443
ENABLE_LETSENCRYPT=0
PUBLIC_URL=https://meet.your-domain.com/

Ahora reinicie Jitsi:

cd /path/to/docker-jitsi-meet
docker compose down
docker compose up -d

Compruebe que el contenedor web escucha en el puerto 8400:

docker ps | grep web

Paso 2. Configurar Nginx Reverse Proxy

Cree la configuración:

sudo nano /etc/nginx/sites-available/meet.your-domain.com.conf

Agregue:

upstream jitsi {
    server 192.168.1.131:8400;
}

server {
    listen 80;
    server_name meet.your-domain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name meet.your-domain.com;

    ssl_certificate /etc/letsencrypt/live/meet.your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/meet.your-domain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    client_max_body_size 0;
    proxy_buffers 8 32k;
    proxy_buffer_size 64k;

    location / {
        proxy_pass http://jitsi;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_read_timeout 300s;
    }

    location /xmpp-websocket {
        proxy_pass http://jitsi;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 86400s;
    }

    location ~ ^/colibri-ws/ {
        proxy_pass http://jitsi;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 86400s;
    }

    location /http-bind {
        proxy_pass http://jitsi;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 60s;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff2?|ttf|svg|eot)$ {
        proxy_pass http://jitsi;
        proxy_cache off;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

Active la configuración:

sudo ln -s /etc/nginx/sites-available/meet.your-domain.com.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Paso 3. Configurar el Firewall

El tráfico de medios de Jitsi usa UDP, por lo que el puerto 10000 debe estar accesible directamente.

Ejemplo de reenvío de puertos

Externo: 10000/UDP → Interno: 192.168.1.131:10000/UDP

Para UFW

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 10000/udp
sudo ufw reload

Si este puerto no está abierto, los participantes de la conferencia no podrán conectarse al vídeo y al audio.


Paso 4. Verificar la autenticación (si está habilitada)

Si en .env está habilitado:

ENABLE_AUTH=1
AUTH_TYPE=internal

Cree usuarios:

docker compose exec prosody prosodyctl register user1 meet.jitsi StrongPassword

La autenticación funcionará sin cambios, ya que Nginx simplemente hace de proxy del tráfico XMPP.


Resumen

Ahora su Jitsi Meet funciona detrás de Nginx reverse proxy:

  1. Jitsi (.env) sabe que HTTPS está deshabilitado y escucha en el puerto 8400.
  2. Nginx (.conf) atiende 443, y hace proxy de /, /xmpp-websocket, /colibri-ws y /http-bind.
  3. Firewall reenvía 10000/UDP directamente al JVB.

Puede alojar Jitsi junto a otros sitios y servicios, y Nginx se convierte en la puerta de entrada única a Internet.

Reseñas relacionadas

Había que hacer funcionar n8n, Redis y la base de datos. Lo había encargado antes a otro proveedor; todo se rompía constantemente. Se lo encargué a Mijaíl y al día siguiente todo funcionó rápido, ¡como un reloj!

christ_media · Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram

Comprador experimentado

24.09.2025 · ⭐ 5/5

Había que poner en marcha n8n, redis y la base de datos. Contraté antes a otro proveedor, y todo se rompía constantemente. Lo encargué a Mikhail, y al día siguiente ¡todo empezó a funcionar rápido, como un reloj!

Solución rápida al problema, ¡recomiendo a Mijaíl como profesional a todo el mundo! Intenté montar una configuración similar por mi cuenta y siguiendo consejos de IA, y acabé gastando mucho tiempo y dinero (por el tiempo de inactividad del servidor). Así que mi consejo final: acudan a profesionales, sale más barato =) Gracias a Mijaíl por su profesionalidad.

ladohinpy · Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram

25.08.2025 · ⭐ 5/5

Solución rápida al problema, ¡recomiendo a Mikhail como profesional! Intenté montar una configuración similar por mi cuenta y siguiendo consejos de redes neuronales, y acabó siendo una pérdida de mucho esfuerzo y dinero (por el tiempo de inactividad del servidor). Así que mi consejo al final: acudan a profesionales, saldrá más barato =) Gracias a Mikhail por su profesionalismo.

¿Necesitas ayuda?

Escríbeme y te ayudaré a resolver el problema

Publicaciones relacionadas