質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • CentOS

    2823questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • nginx

    899questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • Docker

    803questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

  • WebSocket

    174questions

    WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

  • proxy

    127questions

    proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

Dockerコンテナ上のNginxから他コンテナへのWebsocketリバースプロキシについて

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 361

Aikikasa1

score 4

 前提・実現したいこと

🔶実現したいこと
1.CentOS7.4のファイアウォールからDockerコンテナ上のNginxへポートフォワーディング
2.Nginxから同じDocker Networkのコンテナ上で動くGottyへリバースプロキシ ← ここで詰まっています

🔶環境
・ホスト・コンテナOS : CentOS7.4(さくらVPS)
・Docker version : 18.05
・Nginx varsion : 1.15

🔶補足
・Docker Networkはデフォルトと別に作成(192.168.1.0/24)
・NginxコンテナのIPアドレス:192.168.1.240
・GottyコンテナのIPアドレス:192.168.1.151
・ホストCentOSのFirewall-zoneの設定については、Docker Network : Public, WAN側 : External となっています。
・GottyはブラウザからLinuxのbashを弄れるアプリです。バックエンドとWebsocket経由で同期しています。
→https://github.com/yudai/gotty

 発生している問題・エラーメッセージ

Gottyのバックエンド側で見えているエラー

2018/07/14 10:58:11 192.168.1.240:58714 200 GET /l6tfxuw6/
2018/07/14 10:58:11 192.168.1.240:58716 200 GET /l6tfxuw6/auth_token.js
2018/07/14 10:58:11 192.168.1.240:58718 200 GET /l6tfxuw6/config.js
2018/07/14 10:58:11 New client connected: 192.168.1.240:58720, connections: 1/0
2018/07/14 10:58:11 Connection closed by an error: failed to create backend: failed to start command `..`: exec: "..": executable file not found in $PATH: 192.168.1.240:58720, connections: 0/0


192.168.1.240が、Nginxが動くコンテナのIPアドレスです。
Websocketではないプロキシは上手く動いており、Gottyの黒い画面までは出て、Connection Closeとなります。
本エラー発生時にNetstatコマンドでNginxコンテナのポートを確認したところ、58720は閉じていました。
ブラウザ側には、101のコードが返っており、Javascriptのエラーは発生しておりません。
Websocketに詳しくないのですが、上記の通りハンドシェクは成功しているように見えます。
そのあとコネクションが維持されないようです。

 該当のソースコード

Nginxの設定ファイル
🔶/etc/nginx/nginx.conf(ほぼ弄っていません。)

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d以下の設定ファイル

server {
    listen       8080;
    server_name  localhost;

    proxy_set_header    Host    $host;
    proxy_set_header    X-Real-IP    $remote_addr;
    proxy_set_header    X-Forwarded-Host       $host;
    proxy_set_header    X-Forwarded-Server    $host;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_redirect      off;
    proxy_read_timeout 60000;

    location /l6tfxuw6/ {
        proxy_pass http://192.168.1.151:8080/l6tfxuw6/;
    }

    location /l6tfxuw6/ws {
        proxy_pass http://192.168.1.151:8080/l6tfxuw6/ws;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }


192.168.1.151はGottyコンテナのIPアドレスです。
l6tfxuw6はgottyの-rオプションで付加されるURLのランダム文字列です。

以上、アドバイスのほどよろしくお願いします。

 以下、追記

ブラウザにConnection closeと表示された後、
chromeのコンソールで、new websocket をすると通ることが分かりました。
Gottyで実装されている new websocket と全く同じ引数です。
したがって、おそらくGottyのフロント側の実装に問題があるような気がします。
TypeScriptで書かれているため、何をやってるかはわかりますが、問題箇所が特定できません。 

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • CentOS

    2823questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • nginx

    899questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • Docker

    803questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

  • WebSocket

    174questions

    WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

  • proxy

    127questions

    proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。