ngrokの構築でよくある間違い
問題への対処
1. 有効な http リクエストの読み込みに失敗しました: 不正な HTTP リクエスト
[2019/05/07 17:11:36 CST] [DEBG] (ngrok/log.(*PrefixLogger).Debug:79) [ctl:12defafc] Waiting to read message
[2019/05/07 17:11:46 CST] [DEBG] (ngrok/log.(*PrefixLogger).Debug:79) [ctl:12defafc] Closing
[2019/05/07 17:11:46 CST] [EROR] (ngrok/log.Error:120) control recovering from failure EOF
サーバー側のログ
[09:11:23 UTC 2019/05/07] [WARN] (ngrok/log.(*PrefixLogger).Warn:87) [pub:662c9e97] Failed to read valid https request: malformed HTTP request & quot;\u007f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{\"Type\\":\"Auth\",\"Payload\":{\"Version\":\" 2\\quot;,\"MmVersion\quot;:\"1.7\",\"User\quot;:\"\"\",\"Password\quot;:\"\",\" OS\":\"windows\",\"Arch\":\"amd64\",\"ClientId\":\"\"}}"
[09:11:49 UTC 2019/05/07] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting: {"bytesIn.count":0,"bytesOut. count":0,"connMeter.count":0,"connMeter.m1":0,"httpTunnelMeter.count":0,"linux":0," quot;osx":0,"other":0,"tcpTunnelMeter.count":0,"tunnelMeter.count":0,"tunnelMeter.m1" :0,"windows":0}
ngrok.cfg ファイルのポート番号が、Listening for control and proxy connections on [::] と同じであることを確認します。 4443 ポート番号が一致する。
2.[EROR] (ngrok/log.Error:120) control recovering from failure dial tcp: lookup ngrok.xxx.com on 100.8.8.100:100: no such host.
DNSが解決しないので、IPドメインを/etc/hostsに書き込んでください。
3.
[EROR] (ngrok/log.Error:120) control recovering from failure dial tcp 52.194.135.42:4433: connectex: 接続先が一定時間経過しても適切に応答しないため、接続に失敗しました。または、接続先ホストが応答しないため、確立した接続に失敗しました。
対応するポートが開いておらず、セキュリティグループやファイアウォールが解除した
4.
......Failed to read message: remote error: bad certificate......メッセージの読み込みに失敗しました。
ngrok.cfgファイルのドメイン名が、証明書作成時に使用したドメイン名と一致していることを確認してください。
クライアントマシンのシステム時刻が現在の月と年であることを確認します。
ビルドチュートリアル
ステップ 1: go コンパイル環境のインストール (ngrok は go 言語で開発されています)
1. goのダウンロード:http://www.golangtc.com/download サーバーシステムに対応するバージョンをダウンロードすればよい。私のシステムは、CentOSの64ビットで、私はgo1.6rc2.linux-amd64.tar.gzをダウンロードしました。
2. goを/usr/local/goに解凍する。
3. リンクを構築する: ln -s /usr/local/go/bin/* /usr/bin/
ステップ2:ngrokのソースコードをダウンロードする
バッシュ
cd /usr/local/src/
git clone https://github.com/inconshreveable/ngrok.git
export GOPATH=/usr/local/src/ngrok/
export NGROK_DOMAIN="ngrok.zpblog.cn"
cd ngrok
ステップ3:自己署名入り証明書を作成する
ngrok.comの公式サービスを利用する場合、公式のSSL証明書を使用します。独自のngrokdサービスを構築するためには、独自の証明書を生成し、その証明書を搭載したngrokクライアントを提供する必要があります。
バッシュ
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
ステップ4:サーバーとクライアントのコンパイル開始
1. サーバーサイド
サーバーサイドは簡単で、まず自分の環境変数を指定して、それからmakeします。
バッシュ
GOOS=linux GOARCH=amd64
# If it's a 32-bit system, here GOARCH=386
次に
バッシュ
make release-server
定義上は正常にコンパイルできるはずなのですが、コンパイル時に多くの依存関係を自動的にダウンロードする必要があることがわかり、あるパッケージの
log4goはアクセスできないので、ソースコードを変更してパッケージをgithubのアドレスに変更します。
usr/local/src/ngrok/src/ngrok/log/logger.go を探し、import の5行目の log パッケージを log "github.com/keepeye/log4go" に変更します。
そして、release-serverを作り直します。
コンパイルに成功すると、/usr/local/src/ngrok/bin以下にngrokdの実行ファイルができ、これが現在のサーバーとなります。
バッシュ
bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000" -httpsAddr=":4433"
エラーが報告されない場合、以下のような出力が表示されます。
バッシュ
[13:15:43 CST 2016/02/25] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[13:15:43 CST 2016/02/25] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
[13:15:43 CST 2016/02/25] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:8000
[13:15:43 CST 2016/02/25] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:4433
[13:15:43 CST 2016/02/25] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
ctrl+cで終了してください。クライアントのコンパイルがまだ必要です。
2. クライアント
1.1、Windowsクライアント
GOOS=windows GOARCH=amd64 make release-client
cd /usr/local/go/src
GOOS=windows GOARCH=amd64 . /make.bash
cd -
GOOS=windows GOARCH=amd64 make release-client
#amd64 here is a 64-bit system, change 32-bit to 386
# This should generate the ngrok client program in bin/windows_amd64 directory
1.2. Raspberry Piクライアント
cd /usr/local/go/src
GOOS=linux GOARCH=arm . /make.bash
cd -
GOOS=linux GOARCH=arm make release-client
# ngrok client should be generated in the bin/linux_arm directory
1.3 マック
GOOS=darwin GOARCH=amd64 make release-client
binディレクトリを実行して対応するwindows, macディレクトリを生成した後、対応するディレクトリにngrok.exeが格納されます。対応するngrok.exeをローカルにダウンロードします。
先ほどと同じように、以下のプロンプトでサーバーのngrokdを起動します。
. /bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="xxx.xyz" -httpAddr=":80" -httpsAddr=":443"
公開されたhttp接続を[::]:8000でリスンしています。
公開されたhttpsの接続を[::]:4433でリスンしています。
コントロールとプロキシ接続を [::]:4443 でリスンする。
この2つのポート8000と4443を覚えておいてください。
8. ローカルクライアントのセットアップ
(1) 同じ階層のディレクトリに設定ファイル ngrok.cfg を新規に作成します。
server_addr: "xxx.xyz:4443"
trust_host_root_certs: false
なお、設定ファイルでは、ポート4443が使用されています。
(2) 同じ階層のディレクトリに起動スクリプト startup.bat を新規に作成します。
@echo on
cd %cd%
#ngrok -proto=tcp 22
#ngrok start web
ngrok -config=ngrok.cfg -log=ngrok.log -subdomain=yjc 8080
ここで、-configは設定ファイルを指し、-logはログファイルの場所を格納し、-subdomainはカスタムドメインの接頭辞です。8080はポート番号です。
(3) 起動は、起動スクリプトstartup.batをクリックして起動を完了するか、cmdで以下のコマンドを実行します。
. /ngrok -config=. /ngrok.cfg -subdomain=test 80
パラメータを説明するため。
バッシュ
-config is the path to the above configuration file ngrok.cfg
-subdomain is the prefix part of the domain name that needs to be assigned
80 is the port of the local websever, such as the port apache is listening on, and ngrok will map requests to that port later.
次のような出力が表示されます。
バッシュ
Tunnel Status online
Version 1.7/1.7
Forwarding http://test.ngrok.zpblog.cn:8000 -> 127.0.0.1:80
Forwarding https://test.ngrok.zpblog.cn:8000 -> 127.0.0.1:80
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
関連
-
[解決済み] RouteCollection.php 161行目のNotFoundHttpException: laravel 5の場合。
-
[解決済み] "厳格な基準 "です。変数のみ参照渡しすること」エラー【重複
-
[解決済み] 重複】で非オブジェクトのプロパティを取得しようとする
-
[解決済み] mysqli_connectとmysql_connectの違いは何ですか?
-
[解決済み] Phpmyadmin #1075 - テーブルの定義が正しくない; auto カラムは1つだけで、キーとして定義する必要があります。
-
[解決済み] phpでホスト名を取得する最良の方法
-
[解決済み] preg_match の大文字と小文字を区別しないようにするにはどうすればよいですか?
-
[解決済み] リクエストが内部リダイレクトの上限を10回超えている
-
[解決済み] Laravel Carbonは、現在の日付から日数を減算します。
-
[Error] ThinkPHP5 の出力時間エラーです。非整形の数値が発生しました
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】++と*+の意味は何ですか?
-
thinkphp5 timestamp 非整形の数値に遭遇した。
-
[解決済み] Laravel - セッションストアがリクエスト時に設定されない
-
[解決済み] 複数レコードの出力 php
-
[解決済み] imagepng` 関数 (`PHP`) の `quality` パラメータのデフォルト値は何ですか?
-
[解決済み] PHP で任意のリクエストヘッダを読み取るには
-
[解決済み] mysql_real_escape_stringをPHP7に変換する方法は?
-
[解決済み] PHPで、関数が存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] PHP で配列の中央値を計算する
-
[解決済み] お知らせ 未定義のインデックスです。HTTP_REFERER