跳转至

websocket-proxy: Websocket帧的反向代理

安装

如果您尚未设置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

要在NGINX中使用此Lua库,请确保已安装 nginx-module-lua

本文档描述了lua-resty-websocket-proxy v0.0.1,于2022年4月4日发布。


支持对正在传输的WebSocket帧进行检查/更新/丢弃和帧聚合的反向代理。

资源:

概述

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]  如果有,payload
                        --    last: [boolean]     片段帧的fin标志;如果aggregate_fragments开启则为true
                        --    code: [number|nil]  "close"帧的代码

                        if update_payload then
                            -- 在转发之前更改payload + code
                            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

                -- 在此客户端和上游之间启动双向WebSocket代理
                local done, err = proxy:execute()
                if not done then
                    ngx.log(ngx.ERR, "代理失败: ", err)
                    return ngx.exit(444)
                end
            }
        }
    }
}

限制

GitHub

您可以在 nginx-module-websocket-proxy的GitHub仓库中找到此模块的其他配置提示和文档。