2017-04-10 8 views
5

Ich versuche, mehrere NodeJs Server für (offizielle) Kik Chatbots mit verschiedenen Webhooks von einer Subdomain auf meinem Webserver zu betreiben.Kann nicht mehrere NodeJs Server auf einer Subdomain laufen

Allerdings kann ich das nicht tun. Für einen Bot funktioniert es gut. Das ist mein Setup für ein Arbeits NodeJS Server nur:

Nehmen wir an, alle webhooks bei https://bots.mydomain.com

app.js befinden:

'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); 

Also dieser NodeJS Server grundsätzlich auf Port hört 8080 . Daher sieht meine nginx Konfiguration für den Standort https://bots.mydomain.com wie folgt aus:

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 
} 

So weit so gut. Das funktioniert ganz gut! Aber hier kommt die Ausgabe:

Wenn ich versuche, mehrere NodeJS Server auszuführen, durch Verzeichnisse im public_html Ordner zu machen, sagen wir /bot1 und /bot2 und passen meine nginx Config wie folgt aus:

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 
} 

und schließlich den zweiten Server auf Port 8090 anstelle von 8080 zu überwachen und natürlich die Basis-URL auf https://bots.mydomain.com/bot1 oder https://bots.mydomain.com/bot2 setzt, funktioniert nichts mehr. Und damit meine ich, dass die Webhooks keine Daten an den NodeJs Server übergeben. Sie laufen jedoch! Ich weiß das, weil, wenn ich zu (zum Beispiel) https://bots.mydomain.com während der Bot offline offline gehe, erhalte ich offensichtlich den Fehler 502 Bad Gateway, aber wenn der Bot ist online bekomme ich ein Timeout (was bedeutet, dass der Server tatsächlich zuhört).

Fehle ich etwas oder lässt Nginx mehrere Webhooks oder proxy_passes für Verzeichnisse einfach nicht zu?

Ein Workaround wäre, eine Subdomain für jeden Bot, die funktionieren würde (ich habe es versucht). Aber ich würde lieber Unterverzeichnisse als Subdomains für die Bots verwenden.

EDIT:

ich ein seltsames Verhalten aufgefallen: Wenn ich einen proxy_pass Set für /

wie: location/{ proxy_pass http://localhost:8080; }

auf Port 8080 und stellen Sie die baseurl im BOT1 Skript bots.mydomain.com/bot1, Bot-1 funktioniert.

Aber ich kann offensichtlich immer noch andere Bots nicht arbeiten, weil ich die Wurzel (/) verwende.

Bedeutet das, dass es ein Problem mit der Art des Zuhörens von Kik-API ist?

EDIT 2:

überprüfte ich die Nginx Log jetzt und es scheint, wie die Kik-Wrapper auf einem Verzeichnis zu hören versucht, die nicht existiert. Ich habe Folgendes getan: Starten Sie den Bot auf Port 8080 & Nachricht es. Dies ist die Protokollausgabe:

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" 

Aber ich weiß noch nicht, wie dies zu beheben. Als Test habe ich das Verzeichnis incoming in public_html erstellt. Dies gab den folgenden im Protokoll:

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" 

Hat jemand eine Idee hat, wie man es beheben?

+0

Wie wäre es mit 'Standort/BOT1 /' mit einer Hinter '/' (nur als ein Experiment) –

+2

Könnten Sie Ihre nginx teilen anmelden? –

+0

@NullDev können Sie versuchen, die: 'baseUrl:" https://bots.mydomain.com "' auf jedem Bot zu: 'baseUrl:" https://bots.mydomain.com/bot1 "' 'baseUrl:" https://bots.mydomain.com/bot2 "' und das Nginx-Protokoll veröffentlichen. –

Antwort

0

Es ist wahrscheinlich nicht wok, weil Ihre Zielserver den Pfad erhalten, der die /bot1 und /bot2 Präfix enthält, die sie nicht erwarten können.

Vielleicht versuchen:

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

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

Habe nichts geändert, leider. Vielen Dank trotzdem – NullDev

1

Ich denke, das Problem liegt mit einem Schrägstrich in proxy_pass, die die /bot1 und /bot2 Präfixe einmal an vor- übergeben entfernt (beide mit bloßen / ersetzt), so, jeder bot in Ihr nodejs Code hat eine nicht übereinstimmende baseUrl Einstellung als Ergebnis (wie Sie erwähnen, dass Sie diese Einstellungen entsprechend geändert haben, um die externe URL zu entsprechen).

-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

Ich habe diese Schrägstriche da hingelegt, weil ein anderer Beitrag das versucht hat, weil es ein proxy_pass für ein Unterverzeichnis ist. Allerdings habe ich ein merkwürdiges Verhalten bemerkt: Wenn ich einen Proxy-Pass für '/' auf Port 8080 setze und das baseurl im bot1-Skript auf 'bots.mydomain.com/bot1' setze, funktioniert es. Aber ich kann offensichtlich auch andere Bots nicht zum Arbeiten bringen, weil ich die Wurzel ('/') benutze. – NullDev

+0

@NullDev, schlug der andere Kommentar das Hinzufügen von Schrägstrichen in einem anderen Kontext vor (und war nur ein zufälliger Vorschlag); Bitte versuche, was ich gesagt habe, ich bin mir ziemlich sicher, dass es eine sehr hohe Chance hat zu arbeiten (das heißt, wenn Kik das überhaupt kann), weil dein ursprünglicher Code 100% nicht funktioniert. – cnst

+0

Ich habe versucht, was Sie vorgeschlagen haben, aber es hat nicht funktioniert. Außerdem habe ich hier nicht über den Kommentar gesprochen. Eine Antwort auf eine andere Frage hat es vorgeschlagen (ich kann es jetzt nicht finden). – NullDev

Verwandte Themen