Configuration de Aedes Websocket MQTT avec Plesk (Phusion Passenger)
L'utilisation de WebSocket et MQTT via Plesk nécessite quelques réglages. Voici les points principaux à retenir.
nginx Setup
Dans les paramètres Apache & nginx Settings, désactiver Proxy mode:

Puis, ajouter les paramètres suivants dans la section Additional nginx directives pour permettre le support de Websocket à travers nginx et Passenger :
add_header X-Robots-Tag "noindex, nofollow" always;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
Point d'entrée Phusion Passenger
Si l'application est configurée comme un module ES Javascript dans app.js file, alors Phusion Passengeger tentera de trouver un fichier .bootstrap.cjs pour démarrer. L'erreur suivante sera affichée :
Error: Cannot find module '/your/projet/path/.bootstrap.cjs'
Pour résoudre ce problème, créez un fichier utilisant la syntaxe CommunJS et importez votre module :
(async () => {
await import('./app.mjs'); // Point to your actual ESM entry file
})();
Exemple d'application basique
Voici un exemple minimal d'application app.mjs qui permet le MQTT sur WebSocket et qui est compatible avec Phusion Passenger. L'application peut être exécutée en utilisant le support built-in node.js de Plesk.
import express from 'express';
import {Aedes} from 'aedes'
import http from 'node:http';
import {WebSocketServer, createWebSocketStream} from 'ws'
import dotenv from 'dotenv';
dotenv.config({quiet: true});
const app = express();
const server = http.Server(app);
const aedes = await Aedes.createBroker({persistence: 0})
/**
* Enable if you're behind a reverse proxy (Heroku, Bluemix, AWS ELB, Nginx, etc)
* see https://expressjs.com/en/guide/behind-proxies.html
*/
app.set('trust proxy', ((parseInt(process.env.BEHIND_PROXY) === 1)));
// Index page
app.get(["/"], (req, res) => {
res.send("200");
});
// Create Websocket server
const wss = new WebSocketServer({
server: server
})
// Bind the websocket server with Aedes
wss.on('connection', (websocket, req) => {
const stream = createWebSocketStream(websocket)
aedes.handle(stream, req)
})
// Launch app.
const PORT = process.env.PORT || 8080;
server.listen(PORT, () => {
console.log(`App listening on port ${PORT}`);
console.log('Press Ctrl+C to quit.');
});