2017-04-10 9 views
5

私のWebサーバー上の1つのサブドメインから異なるWebhookを持つ(公式な)Kik Chatbotsに対して複数のNodeJsサーバーを実行しようとしています。1つのサブドメインで複数のNodeJsサーバーを実行できません

しかし、私はそれを行うことができません。 1つのbotに対してはうまく動作します。これだけ1台の作業NodeJsサーバのための私の設定です:

は、すべてのウェブフックがhttps://bots.mydomain.com

app.jsに位置していると仮定しましょう:

'use strict'; 
let util = require('util'); 
let http = require('http'); 
let request = require('request'); 
let Bot = require('@kikinteractive/kik'); 
let bot = new Bot({ 
    username: "foo", 
    apiKey: "bar", 
    baseUrl: "https://bots.mydomain.com" 
}); 
bot.updateBotConfiguration(); 

// ... code ... 

let server = http.createServer(bot.incoming()).listen(process.env.PORT || 8080); 

だから、これは、サーバーは基本的にポートで待機しているNodejs 8080 。そのため、サイトhttps://bots.mydomain.comのための私のnginxの設定は次のようになります。

server { 
    root /var/www/bots.mydomain.com/public_html; 
    index index.php index.html index.htm; 
    server_name bots.mydomain.com; 
    location/{ proxy_pass http://localhost:8080/; } # Port 8080 
} 

をこれまでのところは良いです。これは完璧に動作します!しかし、ここで来る問題

私はpublic_htmlフォルダにディレクトリを作ることによって、複数のNodeJsサーバを実行しようとすると、/bot1/bot2を言うと適応させることができますそのような私のnginxの設定ファイル:

server { 
    root /var/www/bots.mydomain.com/public_html; 
    index index.php index.html index.htm; 
    server_name bots.mydomain.com; 
    location /bot1 { proxy_pass http://localhost:8080/; } # Port 8080 
    location /bot2 { proxy_pass http://localhost:8090/; } # Port 8090 
} 

と最後に8080の代わりに8090ポートでリッスンするように2番目のサーバーを設定し、もちろんベースURLをhttps://bots.mydomain.com/bot1またはhttps://bots.mydomain.com/bot2に設定すると、何も動作しなくなります。そして、それはwebhooksがNodeJsサーバーにデータを渡さないことを意味します。彼らはしかし、実行中です!ボットがオフラインのの場合はhttps://bots.mydomain.comに移動すると、私は明らかにエラー502 Bad Gatewayを受け取りますが、ボットがのオンラインの場合です(サーバーが実際にリッスンしていることを意味します)。

Nginxは何か不足していますか、またはディレクトリの複数のwebhooksまたはproxy_passesを許可していませんか?

回避策は、各ボットのサブドメインを作成することです(これはうまくいくでしょう)。しかし、私はボットのサブドメインではなくサブディレクトリを使用したいと思います。

EDIT

私は奇妙な行動に気づいた:私は次のように/

ためproxy_passを設定した場合:ポート8080にlocation/{ proxy_pass http://localhost:8080; }

bots.mydomain.com/bot1にBOT1スクリプトでBASEURLを設定し、 Bot-1が動作します。

しかし、私はまだルート(/)を使用しているので、私は明らかにまだ他のボットも動作させることができません。

これは、Kik-APIのリスニングの方法に問題があることを意味しますか?

EDIT 2

私は今、nginxのログをチェックし、KIKラッパーが存在しないディレクトリをリッスンしようとするように思えます。私は次のようにしました。ポート8080 &にボットを起動します。これは、ログ出力されます:

https://pastebin.com/7G6TViHM

2017/04/13 09:07:05 [error] 15614#15614: *1 open() "/var/www/bots.mydomain.com/public_html/incoming" failed (2: No such file or directory), client: 107.XXX.XXX.XXX, server: bots.mydomain.com, request: "POST /incoming HTTP/1.1", host: "bots.mydomain.com" 
2017/04/13 09:07:13 [error] 15614#15614: *1 open() "/var/www/bots.mydomain.com/public_html/incoming" failed (2: No such file or directory), client: 107.XXX.XXX.XXX, server: bots.mydomain.com, request: "POST /incoming HTTP/1.1", host: "bots.mydomain.com" 

しかし、私はまだこの問題を解決する方法がわかりません。テストとして私はディレクトリincomingpublic_htmlに作成しました。これにより、ログに次のような結果が返されました。

2017/04/13 09:32:41 [error] 15614#15614: *10 directory index of "/var/www/bots.mydomain.com/public_html/incoming/" is forbidden, client: 107.XXX.XXX.XXX, server: bots.mydomain.com, request: "GET /incoming/ HTTP/1.1", host: "bots.mydomain.com" 

誰でも修正方法がありますか?

+0

「場所/ bot1 /」を末尾に '/'を付けて使用する(実験と同じように) –

+2

あなたのnginxログを共有できますか? –

+0

@NullDev 'baseUrl:https://bots.mydomain.com" ' を各ボットに変更しようとする可能性があります: ' baseUrl: "https://bots.mydomain.com/bot1" ' 'baseUrl:" https://bots.mydomain.com/bot2 "' とnginxログを投稿してください。 –

答えて

0

ターゲットサーバーが、予期しない可能性がある/bot1/bot2という接頭辞を含むパスを取得するため、おそらくwokしません。

多分試してみてください。

location /bot1 { 
    rewrite ^/bot1/(.*)$ /$1 break; 
    proxy_pass http://localhost:8080/; 

} 
location /bot2 { 
    rewrite ^/bot2/(.*)$ /$1 break; 
    proxy_pass http://localhost:8090/; 
} 
+0

悲しいことに何も変更しませんでした。とにかくありがとうございました – NullDev

1

私はあなたの問題は、一度(単なる/との両方を交換)上流へ渡さ/bot1/bot2プレフィックスを削除しproxy_passで最後にスラッシュ、である、そう、各botで考えますnodejsコードの結果が一致しないbaseUrlコードがあります(外部URLと一致するようにこれらの設定を適切に変更したと言われています)。

-location /bot1 { proxy_pass http://localhost:8080/; } # Port 8080 
-location /bot2 { proxy_pass http://localhost:8090/; } # Port 8090 
+location /bot1 { proxy_pass http://localhost:8080; } # Port 8080 
+location /bot2 { proxy_pass http://localhost:8090; } # Port 8090 
+0

私は実際にそれらの後ろにスラッシュを置いています。なぜなら、それはサブディレクトリのproxy_passであるからです。しかし、私は奇妙な振る舞いに気付きました。もし '/'のために '/'をポート8080に設定し、bot1スクリプトのbaseurlを 'bots.mydomain.com/bot1'に設定すれば動作します。しかし、私はまだルート( '/')を使っているので、他のボットも動作させることはできません。 – NullDev

+0

@ NullDev、他のコメントは、別のコンテキストでスラッシュを追加することを示唆していました(単なるランダムな提案でした)。私が言ったことを試してみてください。元のコードが100%機能しないため、kikが最初にこの作業を行うことができるのであれば、作業の可能性が非常に高いでしょう。 – cnst

+0

私はあなたが提案したものを試しましたが、うまくいきませんでした。また、私はここのコメントについて話していませんでした。別の質問の答えがそれを示唆しました(私は今見つけることができません)。 – NullDev

関連する問題