websocket-proxy: Обратное проксирование вебсокетных фреймов
Установка
Если вы еще не настроили подписку на RPM-репозиторий, зарегистрируйтесь. Затем вы можете перейти к следующим шагам.
CentOS/RHEL 7 или 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-websocket-proxy
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-websocket-proxy
Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что установлен nginx-module-lua.
Этот документ описывает lua-resty-websocket-proxy v0.0.1, выпущенную 4 апреля 2022 года.
Обратное проксирование вебсокетных фреймов с поддержкой инспекции/обновления/удаления на лету и агрегации фреймов.
Ресурсы:
Синопсис
http {
server {
listen 9000;
location / {
content_by_lua_block {
local ws_proxy = require "resty.websocket.proxy"
local proxy, err = ws_proxy.new({
aggregate_fragments = true,
on_frame = function(origin, typ, payload, last, code)
-- origin: [string] "client" или "upstream"
-- typ: [string] "text", "binary", "ping", "pong", "close"
-- payload: [string|nil] полезная нагрузка, если есть
-- last: [boolean] флаг fin для фрагментированных фреймов; true, если включена агрегация фрагментов
-- code: [number|nil] код для фреймов "close"
if update_payload then
-- изменить полезную нагрузку + код перед пересылкой
return "new payload", 1001
end
-- переслать как есть
return payload
end
})
if not proxy then
ngx.log(ngx.ERR, "не удалось создать прокси: ", err)
return ngx.exit(444)
end
local ok, err = proxy:connect("ws://127.0.0.1:9001")
if not ok then
ngx.log(ngx.ERR, err)
return ngx.exit(444)
end
-- Начать двустороннее вебсокетное проксирование между
-- этим клиентом и upstream
local done, err = proxy:execute()
if not done then
ngx.log(ngx.ERR, "не удалось проксировать: ", err)
return ngx.exit(444)
end
}
}
}
}
Ограничения
- Создано с использованием lua-resty-websocket, который поддерживает только
Sec-Websocket-Version: 13(без расширений) и обозначает свой клиентский компонент как в процессе разработки.
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-websocket-proxy.