Перейти к содержанию

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.