Servidor 'Proxy' com nó.js on 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 /'
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
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.
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?