softmixx background

Pub/Sub Messaging Server

Webserver

nginx als Pub/Sub Server einsetzen

[ 17.12.2021 | Alex]
Ein Pub/Sub System eignet sich hervorragend für den Nachrichtenaustausch zwischen Anwendungen auf verteilten Geräten. Pub/Sub steht für Publisher/Subscriber und beschreibt damit eigentlich schon die Grundstruktur dieses Pattern. Damit sich das auch mit nginx realisieren läßt, benötigen wir jedoch ein AddOn.

Das bedeutet leider auch, dass nginx neu kompiliert werden muß. Eigentlich nutze ich immer lieber die vorkonfigurierten Pakete aus dem Debian Repository, einen Vorteil hat das ganze aber: um das Modul nginx-push-stream-module zu aktivieren, kann man auch gleich die aktuelle Stable Version von nginx installieren (in meinem Fall derzeit 1.20.x).

Sind die neuen Binaries erstmal mit der Konfiguration

./configure --with-http_auth_request_module --add-module=../nginx-push-stream-module ...und alle weiteren conf-Optionen

erstellt und installiert, nehmt ihr das Modul via nginx.conf in Betrieb. In meinem Fall nutze ich die Publisher Funktion mit einer vorgeschalteten Authorisierung und als Subscriber die websocket Option:

http {
 push_stream_shared_memory_size 64M;
 push_stream_max_channel_id_length 64;
....

Die Server Sektion sieht dann so aus:

 set $request_url $request_uri;

 location /auth {
  set $request_url /srvx/user/auth.json;
  rewrite ^/auth /srvx/index.php?$args;

 }
 
 location /pub {
  auth_request /auth;
  push_stream_publisher admin;
  push_stream_channels_path               $arg_id;
  
  push_stream_channel_info_on_publish  on;
  push_stream_store_messages  on;
  
  add_header Access-Control-Allow-Origin  "*";
  add_header Access-Control-Allow-Headers "Origin, Content-Type, X-DWT-UID, X-DWT-SIG, X-DWT-TOKEN";
 }

 location ~ /sub {

  push_stream_subscriber  websocket;
  push_stream_channels_path                   $arg_id;
  
  push_stream_message_template                "{\"i\":~id~,\"c\":\"~channel~\",\"m\":\"~text~\", \"t\":\"~time~\"}";
         push_stream_ping_message_interval           10s;

  add_header Access-Control-Allow-Origin  "*";
  add_header Access-Control-Allow-Headers "Origin, Content-Type, X-DWT-UID, X-DWT-SIG, X-DWT-TOKEN";

 }