Как разместить локальный сервер с помощью Heroku?

720
wolfram77

Я хочу разместить на своем ноутбуке веб-сайт Node.js, чтобы он был доступен для других людей. Я пробовал переадресацию портов на моем маршрутизаторе, но он не работает, потому что мой провайдер прекратил предоставлять общедоступный IP-адрес домашним пользователям. Еще одно решение, о котором я могу подумать, - это использовать Heroku для размещения некоторого типа обратного прокси-сервера, через который можно было бы получить доступ к веб-сайту.

Я видел несколько обратных прокси, написанных на Go и Node.js в NPM, но они, похоже, используют отдельные порты для туннеля и общедоступного сервера, что Heroku не позволяет . Несмотря на то, что Heroku допускает только один порт, я все же думаю, что есть некоторые способы, которыми это может работать:

  • Рассмотрим первого пользователя websocket как клиента (веб-сайт).
  • рассматривать пользователя websocket со специфическим URL-адресом в качестве клиента (веб-сайта).

Поскольку возможно, что несколько пользователей одновременно подключаются к прокси-серверу, может потребоваться включить идентификатор в каждый запрос / ответ клиенту (веб-сайту).

Существует ли какой-либо пакет, который обеспечивает это или каким-либо другим образом позволяет клиенту работать за NAT, при этом все еще используя только один порт?

0
Обратный прокси-сервер также не будет работать, если пользователи / прокси-сервер не сможет установить с вами соединение. Seth 6 лет назад 0
Но я могу подключиться к нему, если он находится в Heroku. Я новичок в этом, но если он ведет себя как обратный туннель SSH, я думаю, что он может работать. wolfram77 6 лет назад 0
@ Пока я пытался создать прокси-сервер, сначала я попробовал локально использовать raw tcp, и он работал локально, но не в Heroku, поэтому я обновил код, имитирующий обновление HTTP, и теперь он работает! после многих часов кодирования и ошибок я смог порадовать Heroku. Я отличаю пользователей от специального клиента с токеном. Я запускаю свой сервер локально здесь https://arproxy.herokuapp.com/, а код здесь https://github.com/wolfram77/node-rproxy. wolfram77 6 лет назад 1
Хорошо, вы могли бы опубликовать ответ на свой вопрос и принять его. Если вы включите некоторые из ваших исследований, это может быть действительно полезным ответом. Seth 6 лет назад 0

1 ответ на вопрос

1
wolfram77

Я начал, еще в детстве, думаю, искать способы размещения публичного сервера с локального сервера в NPM . Поиск по ключевым словам, как:

  • Обратный прокси
  • Туннель
  • Обратный HTTP
  • TCP-туннель

Пробовал ws-tunnel: ему
нужен отдельный порт для подключения WebSocket и отдельный порт для размещения веб-сервера . Несмотря на то, что таким образом это могло работать, Heroku разрешил использовать только 1 порт, и я не знал, позволит ли какой-либо другой провайдер Cloud разрешить 2 открытых порта (я чувствовал, что это невозможно).

Пробовал reverse-http:
он может действовать как обратный HTTP-клиент . Обратный HTTP - это протокол, предоставленный IETF. Но тогда мне нужен был обратный HTTP-сервер . Однако по-прежнему была проблема с обратным HTTP, поскольку он мог передавать только один запрос за раз . В основном это было HTTP-соединение в обратном направлении от публичного сервера к локальному . Это означало, что мне нужно было бы каким-либо образом сериализовать запросы нескольких пользователей к одному или нескольким соединениям ( необходимо установить несколько обратных HTTP-соединений между локальным сервером и публичным сервером ).

Попробуйте использовать TCP-пакеты:
Затем я понял, что это можно сделать, используя одно соединение и более простой небуферизованный метод проксирования. Обратному HTTP может потребоваться буферизация, если было новое соединение, и все обратные HTTP-соединения использовались. Рассмотрите возможность использования простых пакетов следующего формата:

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

Я искал способ сделать это с помощью WebSockets, если бы у них была какая-то существующая функция, которую я мог бы использовать, но потом я увидел, что Heroku разрешил любое обновление HTTP, поэтому я решил вместо этого продолжить обновление TCP. Я знаю, я сделал это. Вот как выглядит заголовок, я проверил, что Heroku принимает его:

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

Итак, теперь появилась идея, как можно обновить соединение между Локальным сервером и Общедоступным сервером с помощью TCP, а затем обмениваться данными с помощью пакетов. Тем не менее, однако, формат пакета не сообщает нам, был ли пользователь подключен или отключен. Это только говорит нам, какие данные отправил пользователь. Поэтому я добавил еще одно поле в пакет:

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

Одной из проблем, которая еще не была решена, было различие между соединением между пользователем и локальным сервером, поскольку мы используем один и тот же порт для них обоих. Там может быть много способов сделать это, но я решил пойти с определенным User-Agentдля локального сервера.

Больше сомнений, строить ли код общедоступного сервера, используя Node HTTP или используя Node TCP. На этот раз я читал о чанкованном кодировании, трейлерах и решил, что будет лучше использовать TCP. Таким образом, я должен был бы проанализировать начальный запрос на соединение и, основываясь на определенном типе, обработать запрос как пользователь или как Локальный сервер. Но я предполагал, что возникнет проблема с производительностью, так как я буду анализировать заголовки HTTP каждого соединения. Но если мы используем редкий метод HTTP для быстрого различения, например HEAD, нам нужно будет прочитать только 4 символа. Итак, теперь мы можем сделать это:

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. 

Я также добавил поддержку нескольких каналов к этому сейчас, что теперь позволяет мне получить доступ как SSH-сервер, работающий на другом компьютере (частный ip). Переместил код и украсил README: https://github.com/nodef/rhost .

Несколько интересных страниц, которые я нашел во время поиска:

Похожие вопросы