Heroku를 사용하여 로컬 서버를 호스팅하는 방법은 무엇입니까?

Heroku를 사용하여 로컬 서버를 호스팅하는 방법은 무엇입니까?

다른 사람들이 액세스할 수 있도록 내 노트북에서 실행되는 Node.js 웹사이트를 호스팅하고 싶습니다. 나는 시도했다포트 포워딩내 라우터에 있지만 내 ISP가 일반 사용자에게 공용 IP 주소 제공을 중단했기 때문에 작동하지 않습니다. 내가 생각할 수 있는 또 다른 해결책은 다음을 사용하는 것입니다.헤로쿠어떤 유형의 호스트를 호스팅하기 위해역방향 프록시, 이를 통해 웹사이트에 접속할 수 있습니다.

나는 다음과 같이 작성된 일부 역방향 프록시를 보았습니다.가다그리고Node.js~에NPM, 그러나 터널과 공용 서버에 별도의 포트를 사용하는 것으로 보입니다.헤로쿠는 허용하지 않습니다. Heroku는 하나의 포트만 허용하지만 여전히 이것이 작동할 수 있는 몇 가지 방법이 있다고 생각합니다.

  • 첫 번째 웹소켓 사용자를 클라이언트(웹사이트)로 간주합니다.
  • 특정 URL을 가진 websocket 사용자를 클라이언트(웹사이트)로 간주합니다.

여러 사용자가 동시에 프록시에 연결할 수 있으므로 다음을 포함해야 할 수도 있습니다.ID클라이언트(웹사이트)에 대한 모든 요청/응답에서.

이를 제공하거나 다른 방식으로 하나의 포트만 사용하면서 NAT 뒤의 클라이언트를 허용하는 패키지가 있습니까?

답변1

저는 어렸을 때부터 호스팅할 방법을 찾기 시작했습니다.공용 서버~에서로컬 서버~에NPM. 다음과 같은 키워드를 검색했습니다.

  • 역방향 프록시
  • Ws 터널
  • 역방향 HTTP
  • TCP 터널

ws-tunnel을 시도했습니다.
그것은 필요했다분리된포트웹소켓 연결및 호스팅을 위한 별도의 포트웹 서버. 그런 식으로 작동할 수도 있지만,헤로쿠만 허용됨1개의 포트사용해야 하는데 다른 것이 있는지는 몰랐습니다클라우드 제공업체허용 할공용 포트 2개(나는 그것이 불가능하다고 느꼈다).

역방향 http를 시도했습니다.
그것은 다음과 같은 역할을 할 수 있습니다.역방향 HTTP 클라이언트. 역방향 HTTP는 IETF에서 제공하는 프로토콜입니다. 하지만 그때 나는역방향 HTTP 서버. 그러나 여전히 문제가 있었습니다역방향 HTTP, 스트리밍만 가능하므로한 번에 하나의 요청. 기본적으로 HTTP 연결과 반대의 HTTP 연결이었습니다.공용 서버에게로컬 서버. 이는 여러 사용자의 요청을 하나 또는 여러 연결(여러 연결)로 어떻게든 직렬화해야 함을 의미합니다.역방향 HTTP 연결사이에 설정해야합니다로컬 서버그리고공용 서버).

TCP 패킷을 사용해 보십시오:
그런 다음 단일 연결과 버퍼링되지 않은 간단한 프록시 방법을 사용하여 이 작업을 수행하는 것이 가능하다는 것을 깨달았습니다.역방향 HTTP새로운 연결이 있는 경우 버퍼링이 필요할 수 있습니다.역방향 HTTP 연결사용 중이었습니다. 다음 형식의 단순 패킷 사용을 고려하십시오.

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

WebSocket을 사용하여 이 작업을 수행할 수 있는 방법을 찾고 있었는데, WebSocket에 사용할 수 있는 기존 기능이 있는 경우 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 방법을 사용한다면 HEAD4글자만 읽으면 됩니다. 이제 우리는 이것을 할 수 있습니다:

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.

또한 이제 여기에 여러 채널에 대한 지원을 추가하여 이제 다른 컴퓨터(개인 IP)에서 실행되는 SSH 서버로 액세스할 수 있습니다. 코드를 이동하고 README를 장식했습니다.https://github.com/nodef/rhost.

검색 중에 발견한 몇 가지 흥미로운 페이지:

관련 정보