2017-04-10 94 views
5

我正嘗試運行多個NodeJs服務器,用於從我的網絡服務器上的一個子域中訪問不同webhook的(官方)Kik Chatbots。無法在一個子域上運行多個NodeJs服務器

但是,我無法做到這一點。對於一個機器人它工作得很好。這是我的設置爲一個工作只的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 
} 

到目前爲止好。這工作非常好!但是這裏來了問題

如果我嘗試運行多個的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 
} 

和最後將第二臺服務器設置爲偵聽端口8090而不是8080,當然也可以將基本URL設置爲https://bots.mydomain.com/bot1https://bots.mydomain.com/bot2,但沒有任何工作了。我的意思是,webhook不會將任何數據傳遞給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的包裝試圖聽上不存在的目錄。我做了以下操作:啓動機器人端口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" 

但我仍然不知道如何解決這個問題。作爲測試,我在public_html中創建了目錄incoming。這在日誌中返回以下內容:

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

如何使用'location/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,這是他們可能不期望的。

也許嘗試:

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

我覺得你的問題在於在proxy_pass結尾的斜線,從而消除了/bot1/bot2前綴一次傳遞到上游(均與單純/更換),所以,每個bot在您的nodejs代碼與baseUrl設置不匹配(因爲您提到您已更改了相應的設置以匹配外部網址)。

-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,另一條評論建議在不同的上下文中添加斜槓(並且僅僅是一個隨機的建議);請嘗試我所說的話,我敢肯定它會有很高的工作機會(也就是說,如果kik能夠做到這一點),因爲您的原始代碼100%不會工作。 – cnst

+0

我試過你的建議,但沒有奏效。另外,我並沒有在這裏談論評論。對另一個問題的回答表明它(我現在找不到它)。 – NullDev

相關問題