Tutorial
12 min read
62 views

Expose vs ngrok: Autoalojar un proxy inverso PHP para Laravel

IT
InstaTunnel Team
Published by the InstaTunnel team | Editorial policy
Expose vs ngrok: Autoalojar un proxy inverso PHP para Laravel

Current comparison

Looking for the main ngrok alternative guide?

We keep the latest ngrok alternative comparison, CLI commands, pricing notes, and webhook examples on one canonical page.

Open the InstaTunnel ngrok alternative guide

Quick answer

Expose vs ngrok: Autoalojar un proxy inverso PHP para Laravel: quick answer

If free tunnel limits interrupt your workflow, compare session length, stable URLs, concurrent tunnels, and paid-plan pricing before choosing a localhost tunnel tool.

What free tunnel limits should developers check first?

Check session duration, URL stability, concurrent tunnels, custom subdomains, bandwidth or request limits, and whether webhook callbacks survive restarts.

How does InstaTunnel handle longer development sessions?

InstaTunnel Free is designed around 24-hour sessions, with Pro available for higher limits and MCP endpoint tunnel workflows.

Como desarrollador moderno de PHP o Laravel, el desarrollo local es una máquina bien engrasada. Probablemente dependes de herramientas como Laravel Herd, Valet o Sail para servir tus aplicaciones en un dominio .test. Pero, ¿qué pasa cuando necesitas compartir ese entorno local con el mundo exterior — demo de una función en progreso a un cliente, prueba de webhooks de Stripe o GitHub, o vista previa de un diseño responsive en un teléfono real? Necesitas un túnel.

Durante más de una década, la respuesta predeterminada ha sido ngrok. Es robusto y funciona con cualquier stack, pero su nivel gratuito tiene compromisos que pueden interrumpir un flujo de trabajo. Una alternativa que vale la pena conocer es Expose, una herramienta de túnel de código abierto, nativa en PHP, creada por Marcel Pociot en Beyond Code — el equipo detrás de Laravel Herd y Tinkerwell.

Esta guía compara ambas herramientas tal como funcionan hoy, y luego explica cómo alojar tu propio servidor Expose en un VPS económico.


El nivel gratuito de ngrok, descrito con precisión

ngrok ha evolucionado más allá de ser una utilidad simple de túnel, convirtiéndose en una plataforma completa de ingreso. Su plan gratuito es más generoso de lo que muchos contenidos comparativos sugieren, pero tiene límites reales, y algunas afirmaciones comunes sobre él no se sostienen.

Lo que realmente tiene límite en el plan gratuito, según la documentación actual de ngrok:

Recurso Límite en nivel gratuito
Transferencia de datos saliente 1 GB/mes
Solicitudes HTTP/S 20,000/mes
Endpoints en línea Hasta 3
Agentes concurrentes 3
Conexiones TCP 5,000/mes
Tasa de solicitudes HTTP 4,000/minuto
Tasa de conexiones TCP 100/minuto
Dominios personalizados/marca No disponibles en Free (los usuarios Hobbyist añaden dominios ngrok-branded; usar tu propio dominio requiere Pay-as-you-go)

Dos puntos importantes para ser precisos, ya que son las fuentes más comunes de confusión:

  • No hay timeout de sesión en el nivel gratuito. La documentación de ngrok lo indica claramente — los endpoints gratuitos pueden funcionar indefinidamente como un servicio en segundo plano. No hay necesidad de reiniciar cada pocas horas.
  • No necesitas obtener un subdominio aleatorio nuevo cada vez. Desde 2023, cada cuenta de ngrok — incluyendo las gratuitas — puede reclamar un dominio estático gratuito (como panda-new-kit.ngrok-free.app) que permanece tuyo permanentemente y no cambia al reiniciar. No es un dominio completamente personalizado/marcado (eso sigue siendo de pago), pero resuelve el problema de “tengo que actualizar la URL del webhook de Stripe cada vez que reinicio el túnel”, siempre que lo hayas reclamado. Sin reclamar un dominio estático, sí obtienes uno nuevo y aleatorio en cada conexión.
  • El tráfico HTTP/S del nivel gratuito muestra una página intersticial de advertencia “haz clic para continuar” en el navegador, principalmente para disuadir abusos de phishing. No afecta solicitudes programáticas (como un webhook POST real de Stripe), y puede ser evitada incluso en el nivel gratuito enviando un encabezado personalizado User-Agent o el encabezado ngrok-skip-browser-warning.

Por encima de Free, los planes actuales son Hobbyist ($8–10/mes dependiendo de la facturación anual o mensual, dominios con marca ngrok, sin intersticial), Pay-as-you-go ($20/mes base más uso medido, endpoints ilimitados, usar tu propio dominio), y Enterprise (precio personalizado, SSO/SCIM/cumplimiento).


Expose: una alternativa nativa en PHP, de código abierto

Expose comparte solo tráfico HTTP/HTTPS — no es un transporte TCP/UDP genérico como ngrok, por lo que no tuneliza conexiones directas a bases de datos o sesiones SSH. A cambio, está enfocado estrictamente en el flujo de trabajo de desarrollo web y su núcleo es completamente de código abierto (licencia MIT) y escrito en PHP, así que si algo falla, puedes leer el código que está ejecutando.

Hasta ahora, el proyecto está activo: el repositorio exposedev/expose tiene más de 4,500 estrellas y 300 forks en GitHub, con su última versión (3.2.2) lanzada en marzo de 2026. El cliente requiere PHP 8.2 o superior — esto es un requisito estricto en el composer.json del paquete, no solo una recomendación, así que las guías antiguas de “PHP 7.4+” están desactualizadas.

Instalación del cliente

Tres métodos soportados:

Laravel Herd — si ya usas Herd, Expose viene integrado; solo configura tu token en las opciones de Herd.

Archivo PHP (PHAR) — el método principal documentado:

curl https://github.com/exposedev/expose/raw/master/builds/expose -L --output expose
chmod +x expose
sudo mv expose /usr/local/bin/expose

Con Composer:

composer global require exposedev/expose

(Nota: el paquete fue publicado históricamente como beyondcode/expose; ese nombre aún resuelve en Packagist, pero los docs actuales usan exposedev/expose). Asegúrate de que el directorio global de binarios de Composer esté en tu PATH.

Compartiendo un sitio

expose token TU_TOKEN

Luego, desde un directorio de proyecto .test (convención Herd/Valet), simplemente ejecuta expose sin argumentos, o comparte una URL explícita:

expose share http://localhost:8000

Un panel de solicitudes local en http://127.0.0.1:4040 permite inspeccionar y reproducir solicitudes entrantes, similar al inspector de ngrok.

Una corrección a una afirmación común: los subdominios personalizados no están disponibles en la capa gratuita alojada de Expose. Pasar --subdomain requiere una cuenta Expose Pro/Team o tu propio servidor autoalojado:

expose share mi-sitio.test --subdomain=mi-sitio

En el servidor gratuito sharedwithexpose.com (alojado por Beyond Code en Alemania), cada conexión obtiene un subdominio aleatorio y las conexiones tienen un tiempo limitado. Este es exactamente el problema que hace que el autoalojamiento valga la pena si quieres URLs estables y personalizadas sin pagar por asiento.

Precios actuales de Expose (expose.dev)

Nivel Precio Incluye
Hobby Gratis TLS/SSL, conexiones limitadas en tiempo, URLs aleatorios, un servidor en la UE
Pro $79/usuario/año Sin límite de tiempo, URLs persistentes, dominios y subdominios personalizados, red global de servidores
Equipo $229/equipo/año (hasta 10 usuarios) Todo en Pro, más soporte prioritario

Integración con Laravel Valet y Herd

Laravel Valet (herramienta local de desarrollo de Taylor Otwell, mantenida por la comunidad) soporta tres herramientas de compartir en las versiones actuales: ngrok, Expose y cloudflared de Cloudflare — seleccionadas vía valet share-tool ngrok|expose|cloudflared. Valet te preguntará qué instalar (Homebrew para ngrok/cloudflared, Composer para Expose) y luego valet share lo usará.

Laravel Herd — el entorno local de Beyond Code — tiene Expose integrado nativamente, configurable desde la interfaz de Herd, sin pasos adicionales.


Comparación de funciones

ngrok (Gratis/Hobbyist) Expose (Hobby/Pro)
Caso de uso principal Ingreso de red genérico; API empresarial/K8s Entornos locales de desarrollo web, solo HTTP/S
Lenguaje Go, cliente/servidor cerrado PHP, código abierto (MIT)
Protocolos HTTP/S, TCP, TLS Solo HTTP/S
URL estable en nivel gratuito Sí, si reclamas tu dominio estático gratuito No — subdominio aleatorio en cada conexión
Subdominios personalizados Solo de pago De pago (Pro) o gratuito en autoalojamiento
Inspector de solicitudes Sí (localhost:4040-estilo)
Autoalojamiento No aplica (solo gestionado) Sí, completamente documentado y de código abierto

Autoalojar Expose en un VPS económico

Si tu enfoque es PHP/Laravel y quieres subdominios personalizados estables sin pagar una tarifa anual por asiento, el autoalojamiento es el verdadero diferenciador. Aquí el proceso actual y correcto — nota que esto difiere en aspectos importantes de guías anteriores (incluyendo borradores previos de este texto): el servidor autoalojado ahora es un paquete separado del cliente, con su propio binario y repositorio.

Paso 1: Provisionar el servidor y configurar DNS

Un droplet básico de DigitalOcean ahora cuesta $4/mes (512 MiB RAM, 1 vCPU compartido, 10 GiB SSD, 500 GiB transferencia) — suficiente para un servidor Expose personal o de pequeño equipo. Ubuntu 24.04 LTS es una opción sólida.

Agrega dos registros DNS A apuntando a la IP de tu droplet: - expose (o cualquier subdominio que quieras como base, por ejemplo expose.tudominio.com) - *.expose (el comodín, para que todos los subdominios del túnel resuelvan)

Paso 2: Instalar PHP y Composer

El paquete del servidor Expose requiere PHP 8.2+:

sudo apt update
sudo apt install php-cli php-curl php-mbstring php-xml php-zip php-sqlite3 unzip git -y

curl -sS https://getcomposer.org/installer -o composer-setup.php
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

Paso 3: Instalar el servidor Expose (no el cliente)

El servidor autoalojado vive en su propio repositorio, exposedev/server, separado del paquete cliente exposedev/expose. Clónalo y instala dependencias:

git clone https://github.com/exposedev/server.git
cd server
composer install

El núcleo del servidor de código abierto te proporciona la infraestructura de túnel en sí. No incluye el panel de control de Expose Pro para gestión de equipos y facturación — eso es específico de la plataforma gestionada expose.dev.

Paso 4: Iniciar el servidor

php expose-server serve expose.tudominio.com

Este escucha en el puerto 8080 por defecto. Puedes cambiar el puerto con --port=3000, y restringir conexiones a quienes tengan un token válido con --validateAuthTokens (los tokens se gestionan desde la interfaz administrativa del servidor).

Paso 5: Configurar Nginx (o Apache) para TLS

El servidor Expose no termina SSL por sí mismo — necesitas un proxy inverso. Obtén primero un certificado wildcard (Certbot con desafío DNS funciona bien para *.expose.tudominio.com), y configura Nginx:

server {
    listen        443 ssl;
    listen        [::]:443 ssl;
    server_name   expose.tudominio.com *.expose.tudominio.com;

    ssl_certificate      /etc/letsencrypt/live/expose.tudominio.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/expose.tudominio.com/privkey.pem;

    location / {
        proxy_pass             http://127.0.0.1:8080;
        proxy_read_timeout     60;
        proxy_connect_timeout  60;
        proxy_redirect         off;

        # Para WebSockets — la conexión del túnel de Expose depende de esto
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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 https;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
sudo ln -s /etc/nginx/sites-available/expose /etc/nginx/sites-enabled/
sudo systemctl restart nginx

(Configuraciones para Apache y HAProxy siguiendo el mismo patrón están en la documentación oficial de Expose si prefieres no usar Nginx.)

Paso 6: Mantenerlo en ejecución con Supervisor

sudo apt install supervisor -y
sudo nano /etc/supervisor/conf.d/expose.conf
[program:expose]
command=/usr/bin/php /home/expose/server/expose-server serve expose.tudominio.com
numprocs=1
autostart=true
autorestart=true
user=expose
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start expose

(Alternativa: el repositorio del servidor Expose incluye un docker-compose.yaml. Copia .env-example a .env, configura PORT, DOMAIN, ADMIN_USERNAME, y ADMIN_PASSWORD, y ejecuta docker-compose up -d para obtener el mismo resultado con menos configuración manual, a costa de menos transparencia sobre qué está corriendo.)

Paso 7: Apunta tu cliente local a tu servidor

En tu máquina local, con el cliente Expose instalado:

expose default-server expose.tudominio.com
expose token TU_TOKEN

Luego, comparte un sitio con un subdominio fijo — algo que no puedes hacer en el servidor público gratuito:

expose share http://ecommerce.test --subdomain=checkout

Tu app ahora está en vivo en https://checkout.expose.tudominio.com, en infraestructura que controlas, sin límite de tiempo por conexión y sin tarifa por asiento.


Cuál opción realmente encaja

Quédate con ngrok si necesitas túnel TCP/TLS en bruto (bases de datos, SSH, servidores de juegos), ingreso a Kubernetes, SSO a nivel organizacional, o documentación de cumplimiento — cosas que Expose no hace.

Considera Expose si tu tráfico es solo HTTP/HTTPS, ya estás en el ecosistema Laravel/Herd, y prefieres administrar un VPS de $4/mes en lugar de pagar una tarifa anual por asiento para subdominios personalizados estables — o simplemente quieres poder leer la herramienta de túnel en la que confías.


Cambios y notas

Correcciones y adiciones hechas al borrador original, verificadas contra la documentación actual de ngrok y Expose, metadatos en GitHub/Packagist, y la página de precios de DigitalOcean:

  1. Timeouts de sesión en ngrok — El borrador original afirmaba que el nivel gratuito de ngrok impone timeouts que requieren reinicios frecuentes. La documentación de ngrok indica que los endpoints en nivel gratuito no tienen timeout y pueden correr indefinidamente como servicio en segundo plano. Fuente: documentación de límites del plan gratuito de ngrok.
  2. Subdominio aleatorio en cada reinicio en ngrok — El borrador original lo trataba como una condición. Desde 2023, cada cuenta de ngrok (incluyendo la gratuita) puede reclamar un dominio estático que no cambia al reiniciar; solo las cuentas que no lo han reclamado obtienen un subdominio nuevo y aleatorio en cada conexión. Fuente: publicación de ngrok sobre dominios estáticos; documentación de dominios de ngrok.
  3. Límite de solicitudes en ngrok — El borrador citaba 40 conexiones por minuto. La documentación actual indica límites separados: 100 intentos de conexión TCP/minuto y 4,000 solicitudes HTTP/minuto en el nivel gratuito. Fuente: límites y precios del plan gratuito de ngrok.
  4. Precio del droplet en DigitalOcean — El borrador usaba $5/mes. El droplet básico más barato ahora cuesta $4/mes (512 MiB RAM, 1 vCPU, 10 GiB SSD, 500 GiB transferencia). Fuente: página de precios de DigitalOcean.
  5. Nombre del paquete Composer — El borrador usaba beyondcode/expose. La documentación oficial actualiza a exposedev/expose; beyondcode/expose aún existe en Packagist como nombre legado que apunta al mismo proyecto. Fuente: documentación de instalación de Expose; Packagist.
  6. Requisito de versión PHP — El borrador decía “PHP 7.4+ (recomendado 8.2+)”. La versión actual del cliente en composer.json requiere PHP ^8.2 — ya no es solo una recomendación. Fuente: exposedev/expose en composer.json.
  7. Arquitectura cliente/servidor — La corrección más importante. El borrador asumía que un solo paquete beyondcode/expose provee tanto el cliente como un servidor autoalojado mediante expose serve. Actualmente, el servidor autoalojado es un paquete separado (exposedev/server), instalado con git clone y composer install, y se ejecuta con expose-server serve <dominio>. El paquete exposedev/expose ahora solo es el cliente. Los pasos de autoalojamiento en esta guía fueron reescritos para reflejar esta estructura de dos paquetes. Fuente: documentación de Expose Server (empezando el servidor); issue en GitHub de exposedev/server confirmando que serve ya no se acepta en el cliente.
  8. Subdominios en la capa gratuita — El borrador original sugería que se podía solicitar un subdominio personalizado en el servidor gratuito de Beyond Code. La documentación actual indica que --subdomain requiere una cuenta Pro/Team o un servidor propio; en el tier gratuito sharedwithexpose.com, cada conexión recibe un subdominio aleatorio y limitado en tiempo. Fuente: documentación de Compartir en Expose.
  9. Precios de Expose — Se añadieron tarifas actuales: Pro $79/usuario/año, Equipo $229/equipo/año (hasta 10 usuarios), y las restricciones del nivel Hobby gratuito (conexiones temporales, un servidor en la UE, URLs aleatorios). Fuente: página de precios de expose.dev.
  10. Configuración Nginx — La configuración original escuchaba en puerto 80 y dejaba SSL a un paso separado. La nueva configuración termina SSL en el propio Nginx en puerto 443, siguiendo la documentación de Expose. Fuente: documentación de soporte SSL de Expose.
  11. Configuración Supervisor — La configuración anterior asumía rutas antiguas. La correcta apunta a expose-server con el dominio, acorde a la estructura actual. Fuente: documentación de Expose para mantener el servidor en marcha.
  12. Integración con Laravel — Valet soporta ahora un tercer método, cloudflared, además de ngrok y Expose, mediante valet share-tool. Herd de Beyond Code incluye Expose nativamente, configurable desde la UI, sin pasos adicionales. Fuente: documentación de Laravel Valet y Expose.
  13. Actividad del proyecto — Se añadieron estadísticas actuales: más de 4,500 estrellas, 300 forks, licencia MIT, versión 3.2.2 en marzo de 2026, para mostrar que está activo. Fuente: GitHub y Packagist.
  14. Página intersticial en ngrok — La advertencia en navegador en nivel gratuito no afecta tráfico programático ni webhooks, y puede ser evitada enviando encabezados personalizados. Fuente: documentación de límites del plan gratuito de ngrok.
  15. Eliminación de lenguaje promocional — Se removieron afirmaciones no verificables o promocionales, en favor de comparaciones neutrales y basadas en fuentes; se limpiaron metadatos para una entrega limpia en Markdown.

Continue from this article into the most relevant product guides and workflows.

Related Topics

#Expose reverse proxy, Laravel Valet share alternative, self-hosted PHP tunnel, Beyond Code Expose vs ngrok, Beyond Code Expose, ngrok alternative for PHP, Laravel local development, PHP developer tools, self-hosted reverse proxy, DigitalOcean Expose tutorial, expose localhost to internet, PHP tunneling solution, Laravel Valet share, Valet share ngrok alternative, replace ngrok in Laravel, open-source ngrok alternative, Expose vs ngrok performance, self-hosted Expose server, DigitalOcean $5 droplet tutorial, local environment sharing, PHP local server, secure tunnel for PHP, reverse proxy in PHP, host your own ngrok, ngrok free tier limitations, expose local server, PHP developer environment, Laravel ecosystem, Laravel deployment, artisan serve alternative, Beyond Code tools, local dev server, webhook testing PHP, local API testing, expose local web server, secure reverse proxy, open source tunnel, PHP tunnel script, custom domain Expose, self host webhook tunnel, bypass ngrok limits, localhost tunneling, developer infrastructure tools, expose local API to internet, share local website, PHP networking, web development proxy, reverse proxy tutorial, Laravel tips and tricks, PHP artisan share, expose client configuration, self-managed PHP proxy, open source developer tools, Laravel dev workflow

Keep building with InstaTunnel

Read the docs for implementation details or compare plans before you ship.

Share this article

More InstaTunnel Insights

Discover more tutorials, tips, and updates to help you build better with localhost tunneling.

Browse All Articles