Heroku を使用してローカル サーバーをホストするにはどうすればよいですか?

Heroku を使用してローカル サーバーをホストするにはどうすればよいですか?

私は自分のラップトップでNode.jsのウェブサイトをホストし、他の人がアクセスできるようにしたいと考えています。私は試してみましたポート転送ルーターで設定しましたが、ISPがホームユーザーへのパブリックIPアドレスの提供を停止したため機能しません。私が考えられる別の解決策は、ヘロク何らかの形でホストするリバースプロキシ、これを通じてウェブサイトにアクセスできるようになります。

私はいくつかのリバースプロキシを次のように書いてきました行くそしてNode.js国立博物館しかし、トンネルとパブリックサーバーには別々のポートを使用しているようで、Herokuでは許可されませんHeroku では 1 つのポートしか許可されませんが、それでも機能する方法がいくつかあると思います。

  • 最初の Websocket ユーザーをクライアント (Web サイト) として扱います。
  • 特定の URL を持つ Websocket ユーザーをクライアント (Web サイト) として扱います。

複数のユーザーが同時にプロキシに接続する可能性があるため、idクライアント (Web サイト) へのすべてのリクエスト/レスポンスで。

これを提供するパッケージ、または他の方法で、1 つのポートのみを使用しながら NAT の背後にあるクライアントを許可するパッケージはありますか?

答え1

私は子供の頃から、パブリックサーバーからローカルサーバー国立博物館次のようなキーワードを検索しました:

  • リバースプロキシ
  • Wsトンネル
  • リバースHTTP
  • TCPトンネル

ws-tunnelを試しました:
それはポートWebSocket接続、およびホスト用の別のポートウェブサーバーたとえそれがうまくいくとしても、ヘロク許可されているのは1 ポート使用するために、私は他のクラウドプロバイダー許可するパブリックポート 2 個(それは不可能だと思いました)。

リバースhttpを試しました:
それは、リバースHTTPクライアントリバースHTTPはIETFが提供するプロトコルです。しかし、私はリバースHTTPサーバーしかし、まだ問題がありましたリバースHTTPストリーミングのみ可能だったため一度に1つのリクエスト基本的にはHTTP接続を逆にしたもので、パブリックサーバーローカルサーバーつまり、複数のユーザーのリクエストを1つまたは複数の接続(複数のリバースHTTP接続間に設定する必要があるローカルサーバーそしてパブリックサーバー)。

TCP パケットを使用してみてください:
その後、単一の接続と、より単純なバッファなしのプロキシ方法を使用してこれを行うことが可能であることに気付きました。リバースHTTP新しい接続があった場合、バッファリングが必要になる可能性があり、リバースHTTP接続使用中の場合、次の形式の単純なパケットの使用を検討してください。

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

私はWebSocketを使ってこれを行う方法を探していました。既存の機能があれば使えるのですが、HerokuではどれでもHTTP アップグレードなので、代わりに TCP アップグレードを進めることにしました。わかっています、私が作ったものです。ヘッダーは次のようになります。Heroku がこれを受け入れることを確認しました。

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

さて、これで、TCP を使用してローカル サーバーとパブリック サーバー間の接続をアップグレードし、パケットを使用して通信する方法がわかりました。ただし、パケットの形式は、ユーザーが接続したか切断したかを伝えません。伝えられるのは、ユーザーが送信したデータだけです。そこで、パケットに別のフィールドを追加しました。

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

まだ解決されていない問題の 1 つは、ユーザーからの接続とローカル サーバーからの接続を区別することです。これは、両方に同じポートを使用しているためです。これを行うにはさまざまな方法がありますが、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

検索中に見つけた興味深いページをいくつか紹介します。

関連情報