started practices node getting devcenter deploy best app node.js heroku deployment port subdomain

node.js - node - npm best practices



Heroku+node.js: Tengo un servidor que usa varios puertos. ¿Cómo puedo conseguir que Heroku los asigne? (3)

Bien, después de investigar un poco, descubrí que la apertura de puertos en Heroku está desactivada y no está permitida .

La única forma de evitar esto es usar subdominios y luego en la aplicación para usar un módulo proxy (como el subdomain-router que yo uso).

PERO - Heroku no te permite crear subdominios en su dominio, lo que significa que your-app.herokuapp.com está arreglado y no puede tener subdominios.
En los manuales de Heroku, te exigen que tengas tu propio dominio y proveedor de DNS para hacer tal cosa, creando un alias A (CNAME) en la tabla dns en la configuración de tu dominio, que hará referencia a tu dominio de la aplicación herokuapp y luego usará el comando heroku domains:add para agregar su dominio a la lista de origen permitida.

Puedes leer más here . Proporciona toda la información que necesitas.

Espero que haya ayudado a algunos.

Umm voy a tratar de ser más claro ..

En un servidor de aplicaciones que he escrito en node.js, tengo un proxy interno para varios puertos:

  • En mi puerto 8080 tengo mi api de descanso .
  • en mi puerto 3000 tengo mi servidor push y chat .

Utilizo el enrutador de subdomain-router paquete npm para enrutamiento interno al puerto, exponiendo los subdominios en el ''front-end'' que el proxy vuelve a esos puertos.
demostración de código: ( <some-app> no es el nombre real de la aplicación, obviamente)

require(''subdomain-router'') ({ host: ''<some-app>.herokuapp.com'', subdomains: { '''': 8080, // <some-app>.herokuapp.com <=> ::8080 --WORKS-- ''api'': 8080, // api.<some-app>.herokuapp.com <=> ::8080 ''chat'': 3000, // chat.<some-app>.herokuapp.com <=> ::3000 ''push'': 3000 // push.<some-app>.herokuapp.com <=> ::3000 } }).listen(process.env.PORT || 5000);

La API funciona muy bien, aunque no puedo acceder a ella a través de <some-app>.herokuapp.com:8080 , pero solo a través de <some-app>.herokuapp.com y dejar que el módulo interno de subdomain-router haga su magia.
Además, no puedo acceder a los subdominios. Al intentar acceder a la api.<some-app>.herokuapp.com no api.<some-app>.herokuapp.com No such app página de error de la No such app de heroku.

TL; DR accediendo a <some-app>.herokuapp.com funciona (redirige a /v1 path para mi API), pero no puedo acceder a <some-app>.herokuapp.com:8080 , <some-app>.herokuapp.com:3000 o chat.<some-app>.herokuapp.com .

Al intentar acceder a mi API especificando el puerto en la url ( como este: <some-app>.herokuapp.com:8080 ), <some-app>.herokuapp.com:8080 el siguiente error en mi navegador (google chrome): ERR_CONNECTION_REFUSED .

Mi suposición educada dice que podría ser algo relacionado con la apertura de puertos en heroku, pero no tengo ni idea de cómo hacerlo (he intentado buscar en Google).
Sin embargo, no explica por qué no puedo acceder a los subdominios.

Agradecería cualquier luz arrojada sobre este tema.
Soy nuevo en heroku y se está volviendo muy frustrante.

¡Gracias!
Amit


Sé que esta es una publicación antigua, pero quería proporcionar una respuesta actualizada para referencia y uso futuro:

Si está utilizando socket-io, el enlace al mismo puerto es fácil. Otras bibliotecas websocket deberían tener un enfoque similar (de https://github.com/socketio/socket.io ):

Junto con Express A partir de 3.0, las aplicaciones Express se han convertido en funciones de solicitud de controlador que pasa a las instancias de http o http Server. Debe pasar el servidor a socket.io, y no a la función de aplicación rápida. También asegúrese de llamar a .listen en el servidor, no en la aplicación.

const app = require(''express'')(); const server = require(''http'').createServer(app); const io = require(''socket.io'')(server); io.on(''connection'', () => { /* … */ }); server.listen(3000);

Ahora tendrá tráfico de http & ws que fluye a través de un solo puerto (Heroku no enruta http / tcp por separado, si lo hiciera, sus websockets no funcionarán durante el período). Es posible vincularse con otros marcos que no sean expresos: ( https://github.com/socketio/socket.io ).

Prefiero este método debido a la paridad y las pruebas del entorno, es decir, no es necesario configurar subdominios o enrutamiento de puertos


También aprendí sobre esto hoy, aprendí que si ejecuta un servicio en un puerto en Heroku, todavía puede acceder a él localmente. No funcionaría para la preocupación del usuario anterior, pero solucionó mi problema, lo que me llevó a esta pregunta.