Zum Inhalt

socket: Automatisches Kompatibilitätsmodul für LuaSocket/cosockets

Installation

Wenn Sie das RPM-Repository-Abonnement noch nicht eingerichtet haben, melden Sie sich an. Dann können Sie mit den folgenden Schritten fortfahren.

CentOS/RHEL 7 oder Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-socket

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-socket

Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.

Dieses Dokument beschreibt lua-resty-socket v1.0.0, das am 18. Januar 2019 veröffentlicht wurde.


Das cosocket/LuaSocket automatische Kompatibilitätsmodul für lua-resty-Module, die mit reinem Lua oder OpenRestys init-Kontext kompatibel sein möchten.

Der Anwendungsfall für diese Bibliothek ist: Sie entwickeln ein lua-resty-Modul, das auf cosockets basiert, möchten es jedoch auch im init-Kontext von OpenResty oder sogar in reinem Lua verwendbar machen. Dieses Modul zielt darauf ab, Ihrer Bibliothek immer Sockets bereitzustellen, die im aktuellen Kontext kompatibel sind, wodurch Sie Zeit und Mühe sparen und die API von LuaSocket erweitern, um der von cosockets zu entsprechen, sodass Sie Ihren Code immer so schreiben können, als wären Sie in einem cosocket-kompatiblen OpenResty-Kontext.

Funktionen

  • Ermöglicht es Ihren lua-resty-Modulen, automatisch cosockets/LuaSocket zu verwenden
  • Bietet einen sslhandshake-Proxy bei Verwendung von LuaSocket, mit einer Abhängigkeit von LuaSec
  • Wird nicht blockiert, um LuaSocket in weiteren Kontexten zu verwenden, wenn es im ngx_lua init geladen wird (leicht zu machender Fehler)
  • Memoisiert die zugrunde liegenden Socket-Methoden für die Leistung
  • Gibt ein Warnprotokoll für Ihre Benutzer aus, wenn ein Socket mit LuaSocket im OpenResty erzeugt wird

Motivation

Ziel dieses Moduls ist es, einen automatischen Fallback auf LuaSocket bereitzustellen, wenn [ngx_lua]'s cosockets nicht verfügbar sind. Das heißt: - Wenn nicht in ngx_lua verwendet - In ngx_lua-Kontexten, in denen cosockets nicht unterstützt werden (init, init_worker, usw...)

Beim Fallback auf LuaSocket stellt es Ihnen Shims für nur cosocket-spezifische Funktionen wie getreusedtimes, setkeepalive usw. zur Verfügung.

Es ist nützlich, wenn man ein Modul/Bibliothek entwickelt, das darauf abzielt, entweder mit ngx_lua und reinem Lua kompatibel zu sein, oder in ngx_lua-Kontexten wie init.

Bibliotheken, die es verwenden

Hier sind einige konkrete Beispiele für die Verwendung dieses Moduls. Sie können sehen, wie wir nur Code schreiben, als wären wir ständig in einem cosocket-kompatiblen OpenResty-Kontext, was unsere Arbeit erheblich vereinfacht und sofortige Kompatibilität mit reinem Lua bietet.

  • lua-cassandra: sehen Sie, wie das cassandra Modul sowohl in OpenResty als auch in reinem Lua ohne Aufwand oder spezielle Codepfade, die cosockets und LuaSocket unterscheiden, kompatibel ist.

Wichtiger Hinweis

Die Verwendung von LuaSocket innerhalb von ngx_lua wird sehr stark abgeraten aufgrund seiner blockierenden Natur. Es ist jedoch in Ordnung, es im init-Kontext zu verwenden, wo Blockierungen nicht als schädlich angesehen werden.

In Zukunft wird nur die init-Phase einen Fallback auf LuaSocket erlauben.

Es unterstützt derzeit nur TCP-Sockets.

Verwendung

Alle verfügbaren Funktionen folgen demselben Prototyp wie die cosocket-API, sodass dieses Beispiel in jedem ngx_lua-Kontext oder außerhalb von ngx_lua insgesamt ausgeführt werden kann:

local socket = require 'resty.socket'
local sock = socket.tcp()

getmetatable(sock) == socket.luasocket_mt ---> true/false abhängig vom zugrunde liegenden Socket

sock:settimeout(1000) ---> 1000ms übersetzt in 1s, wenn LuaSocket

sock:getreusedtimes(...) ---> 0, wenn LuaSocket

sock:setkeepalive(...) ---> ruft close() auf, wenn LuaSocket

sock:sslhandshake(...) ---> LuaSec-Abhängigkeit, wenn LuaSocket

So kann man ein Modul schreiben, das auf TCP-Sockets basiert, wie:

local socket = require 'resty.socket'

local _M = {}

function _M.new()
  local sock = socket.tcp() -- ähnlich wie ngx.socket.tcp()

  return setmetatable({
    sock = sock
  }, {__index = _M})
end

function _M:connect(host, port)
  local ok, err = self.sock:connect(host, port)
  if not ok then
    return nil, err
  end

  local times, err = self.sock:getreusedtimes() -- cosocket API
  if not times then
    return nil, err
  elseif times == 0 then
    -- Verbindung behandeln
  end
end

return _M

Der Benutzer eines solchen Moduls könnte es in Kontexten mit cosocket-Unterstützung oder in der init-Phase von ngx_lua mit wenig Aufwand vom Entwickler verwenden.

GitHub

Sie finden zusätzliche Konfigurationstipps und Dokumentation für dieses Modul im GitHub-Repository für nginx-module-socket.