Servidor 'Proxy' com nó.js on Heroku

Estou a tentar construir um servidor proxy com o nó.js em Heroku usando proxy http. Tudo funciona bem localmente, mas estou a ter alguns problemas em Heroku.

var http = require('http');
var httpProxy = require('http-proxy');

settings = {
  "localhost": process.env.LOCALHOST,
  "devices":   process.env.DEVICES_URI
}

var options = { router: { } }
options.router[settings.localhost + '/devices']  = settings.devices + '/devices';

var port   = process.env.PORT || 8000;
var server = httpProxy.createServer(options).listen(port);

Como podes ver no exemplo, eu configuro um objecto de encaminhamento. O que eu digo É isto.: quando um pedido corresponde a '/ devices', então route o pedido para o serviço do dispositivo. (identificado pelo DEVICES_URI environmental var)

em desenvolvimento eu defini

  • LOCALHOST = 'localhost'
  • DEVICES_URI = 'http://localhost:3000"

isto significa que todos os pedidos que vão para localhost: 8000 / dispositivos são apresentados para localhost: 3000 / dispositivos que é o que eu quero. Tudo funciona perfeitamente.

O problema está na produção. Dá-me um erro de tempo-limite repetido várias vezes para cada pedido.

2012-08-23T20:18:20+00:00 heroku[router]: Error H12 (Request timeout) -> GET lelylan-api.herokuapp.com/devices dyno=web.1 queue= wait= service=30000ms status=503 bytes=0

na produção os vars de ambiente são configurados para os nomes das aplicações.

  • LOCALHOST = 'lelylan-api.herokuapp.com'
  • DEVICES_URI = 'lelylan-devices.herokuapp.com /'
Acho que estou errado há algumas configurações, mas depois de todo o dia ainda estou não consegui perceber.

actualizar

Continuei com os meus testes e vi que o proxy não consegue chegar ao serviço Proxy, O que me impede totalmente.

em desenvolvimento, eu defini:

  • LOCALHOST = 'localhost'
  • DEVICES_URI = 'lelylan-devices.herokuapp.com/'

Se eu ligar http://lelylan-devices.herokuapp.com/devices tudo funciona bem.

Se eu ligar para localhost: 8000 / devices (que aponta para http://lelylan-devices.herokuapp.com/devices Heroku diz-me que não existe tal aplicação. Acho que o problema está no sistema de roteamento.

aqui pode aceder ao código-fonte. Aqui estão as barras de configuração para Heroku.

NODE_ENV      => production
LOCALHOST     => lelylan-api.herokuapp.com
DEVICES_URI   => lelylan-devices.herokuapp.com
TYPES_URI     => lelylan-types.herokuapp.com
LOCATIONS_URI => lelylan-locations.herokuapp.com
Author: Andrea Reginato, 2012-08-23

2 answers

Finalmente fiz com que funcionasse usando uma versão ligeiramente modificada proxy-by-url. O código final parece-se com isto e funciona bem.

var httpProxy = require('http-proxy');

var port = process.env.PORT || 8000;

var routing = {
  '/devices': { port: process.env.DEVICES_PORT || 80, host: process.env.DEVICES_URI }
}

var server = httpProxy.createServer(
  require('./lib/uri-middleware')(routing)
).listen(port);
Uma nota para recordar. O 'plugin' configura a máquina do cabeçalho para a aplicação de destino uri. Se você não fizer isso, Heroku não vai reconhecer o aplicativo e não vai encontrá-lo, como seu sistema de roteamento interno parece ser baseado no cabeçalho HOST.
 5
Author: Andrea Reginato, 2012-08-24 11:01:04

USO o 'proxy' de http com sucesso no Heroku. A primeira coisa que eu notei em seu err log é a url que está recebendo: Obter lelylan-api.herokuapp.com/tdevices

Há um erro de Digitação... em vez de '/devices', mostra '/tdevices'. Antes de continuar, pode confirmar se esta é a mensagem de registo actual?
 2
Author: SonOfNun, 2012-08-23 18:40:30