Questão Como hospedar um servidor local usando o Heroku?


Eu quero hospedar um site do Node.js rodando no meu laptop, para que seja acessível a outras pessoas. eu tentei encaminhamento de porta no meu roteador, mas não funciona porque o meu ISP parou de fornecer o endereço IP público para usuários domésticos. Outra solução que posso pensar é usar Heroku para hospedar algum tipo de proxy reverso, através do qual seria possível acessar o site.

Eu vi alguns proxies reversos escritos em Ir e Node.js dentro NPM, mas eles parecem usar portas separadas para um túnel e servidor público, que Heroku não permite. Mesmo que o Heroku permita apenas uma porta, eu ainda acho que existem algumas maneiras que isso ainda funciona:

  • considere primeiro o usuário websocket como cliente (website).
  • considere o usuário websocket com uma URL específica como cliente (website).

Como é possível que vários usuários estejam conectando ao mesmo tempo ao proxy, talvez seja necessário incluir um identidade em cada solicitação / resposta ao cliente (site).

Existe algum pacote que fornece isso, ou de alguma outra forma, permite que um cliente por trás do NAT, enquanto ainda está usando apenas uma porta?


0


origem


Um proxy reverso não funcionará se os usuários / o proxy não puderem estabelecer uma conexão com você. - Seth
Mas eu posso me conectar a ele, se estiver hospedado em Heroku. Eu sou novo nisso, mas se ele se comportar como o túnel reverso do SSH, eu acho que poderia funcionar. - wolfram77
@Seth eu estava tentando fazer um proxy, primeiro eu tentei com tcp raw localmente, e funcionou localmente, mas não em Heroku, então eu atualizei o código simular uma atualização HTTP, e funciona agora! depois de muitas horas de codificação e erros, consegui fazer Heroku feliz. Eu estou diferenciando usuários de um cliente especial com um token. Estou executando meu servidor localmente aqui arproxy.herokuapp.com e o código está aqui github.com/wolfram77/node-rproxy. - wolfram77
Legal, você poderia considerar postar uma resposta à sua própria pergunta e aceitá-la. Se você incluir algumas de suas pesquisas, pode ser uma resposta realmente útil. - Seth


Respostas:


Eu comecei, quando eu era criança, eu acho, procurando maneiras de hospedar um Servidor público a partir de Servidor local a NPM. Pesquisou por palavras-chave como:

  • Procuração reversa
  • Túnel Ws
  • HTTP reverso
  • Túnel TCP

Tentei ws-tunnel:
Precisava de um separado porta para Conexão WebSockete uma porta separada para hospedar um servidor web. Mesmo assim, poderia funcionar Heroku permitido apenas 1 porta para ser usado, e eu não sabia se algum outro Provedor de nuvem permitiria 2 portas públicas (eu senti que não era possível).

Tentei reverso-http:
Poderia agir como um Cliente HTTP reverso. O HTTP reverso é um protocolo fornecido pelo IETF. Mas então eu precisava de um Servidor HTTP reverso. No entanto, ainda havia um problema com HTTP reverso, como só poderia transmitir um pedido de cada vez. Foi basicamente uma conexão HTTP em sentido inverso Servidor público para Servidor local. Isso significava que eu teria de alguma forma serializar as solicitações de vários usuários para uma ou várias conexões (várias Conexões HTTP reversas teria que ser configurado entre Servidor local e Servidor público).

Tente usar pacotes TCP:
Então eu percebi que era possível fazer isso usando uma única conexão e um método não-bufferizado mais simples de proxy. HTTP reverso pode precisar de buffer se houvesse uma nova conexão, e todos Conexões HTTP reversas estavam em uso. Considere o uso de pacotes simples, do seguinte formato:

--------------------------------------
| Packet Size | Connection ID | Data |
--------------------------------------

Eu estava procurando uma maneira de fazer isso usando WebSockets, se eles tivessem algum recurso existente que eu poderia usar, mas então eu vi Heroku permitido qualquer Atualização HTTP, então eu decidi ir em frente com uma atualização TCP. Eu sei, eu inventei. Aqui está como o cabeçalho se parece, eu verifiquei que o Heroku o aceita:

GET / HTTP/1.1
Upgrade: tcp
Connection: Upgrade
Origin: XXX

Ok, então agora havia uma idéia de como você poderia atualizar a conexão entre o servidor local e o servidor público usando o TCP e, em seguida, comunicar usando pacotes. Ainda assim, o formato do pacote não nos diz se o usuário está conectado ou desconectado. Apenas nos informa quais dados o usuário enviou. Então eu adicionei outro campo ao pacote:

----------------------------------------------
| Packet Size | Event | Connection ID | Data |
----------------------------------------------

Um problema que ainda não foi resolvido, foi distinguir entre a conexão de um usuário e um servidor local, já que estamos usando a mesma porta para ambos. Poderia haver muitas maneiras de fazer isso, mas eu decidi ir com um específico User-Agent para o servidor local.

Mais dúvidas, seja para construir o código do servidor público usando o HTTP do Node ou usando o TCP do Nó. Desta vez, eu estava lendo sobre codificação em pedaços, trailers e decidi que seria melhor usar o TCP. Então, eu teria que analisar a solicitação inicial de uma conexão e, com base no tipo determinado, processar a solicitação como um usuário ou como um servidor local. Mas eu imaginei que haveria um problema de desempenho, pois eu estaria analisando os cabeçalhos HTTP de cada conexão. Mas se usarmos um método HTTP raro para uma distinção rápida, como HEAD, teríamos que ler apenas 4 caracteres apenas. Então, podemos agora fazer isso:

1. If first 4 characters not HEAD, process as User.
2. Parse all the HTTP headers.
3. If User-Agent is special value, process as Local server
4. Process as User.

Eu também adicionei o suporte para vários canais para isso agora, o que agora pode me permitir acessar como servidor SSH em execução em outra máquina (ip privado). Movido o código e decorado o README: https://github.com/nodef/rhost.

Algumas páginas interessantes que encontrei durante a pesquisa:


1