无法在一个子域上运行多个NodeJs服务器

Nul*_*Dev 5 port nginx proxypass node.js kik

我正在尝试使用来自我的网络服务器上的一个子域的不同webhook为(官方)Kik Chatbots运行多个NodeJs服务器.

但是,我无法做到这一点.对于一个机器人,它工作得很好.这是我对一个正在运行的NodeJs服务器的设置:

让我们假设所有的webhook都位于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);
Run Code Online (Sandbox Code Playgroud)

所以这个Nodejs服务器基本上是在侦听端口8080.因此,我对该网站的nginx配置https://bots.mydomain.com如下所示:

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
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.这很好用!但问题出现了:

如果我尝试运行多个服务器的NodeJS,通过在制作目录public_html的文件夹,可以说/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
}
Run Code Online (Sandbox Code Playgroud)

最后将第二台服务器设置为侦听端口8090而不是8080当然将基本URL设置为https://bots.mydomain.com/bot1或者https://bots.mydomain.com/bot2,不再有效.我的意思是webhooks不会将任何数据传递给NodeJs服务器.然而,它们正在运行!我知道这是因为如果我https://bots.mydomain.com在机器人离线时导航到(例如),我显然会收到错误502 Bad Gateway但是如果机器人在线我会得到超时(这意味着服务器确实正在收听).

我错过了什么或Nginx不允许多个webhooks或proxy_passes目录?

一个解决方法是为每个机器人制作一个子域,这可以工作(我试过).但我想为机器人使用子目录而不是子域.

编辑:

我注意到一个奇怪的行为:如果我设置了一个proxy_pass /

喜欢: location / { proxy_pass http://localhost:8080; }

到端口8080并将bot1脚本中的baseurl设置为bots.mydomain.com/bot1,Bot-1工作.

但我显然仍然无法让其他机器人工作,因为我正在使用根(/).

这是否意味着Kik-API的收听方式存在问题?

编辑2:

我现在检查了Nginx日志,看起来Kik Wrapper试图侦听一个不存在的目录.我做了以下操作:在端口上启动机器人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"
Run Code Online (Sandbox Code Playgroud)

但我仍然不知道如何解决这个问题.作为一个测试,我创建的目录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"
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何解决它?

Nul*_*Dev 1

如果有人遇到这个问题:

Kik 的API 设计根本不可能做到这一点。

当你初始化你的机器人时

let bot = new Bot({
    username: "foo",
    apiKey:   "bar",
    baseUrl:  "https://bots.mydomain.com"
});
Run Code Online (Sandbox Code Playgroud)

baseUrl本质上是一个 webhook,不能重复使用。它必须有些独特。
一种可能的解决方法是直接在基本 URL 中指定端口。