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:
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?
Wie wäre es mit 'Standort/BOT1 /' mit einer Hinter '/' (nur als ein Experiment) –
Könnten Sie Ihre nginx teilen anmelden? –
@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. –