在OpenResty代理中使用websockets

我使用OpenResty创建了带有MFA的代理,主要正常工作。

但是我遇到了websockets的问题:Firefox说它"无法连接服务器wss://..."。查看浏览器的网络面板,我可以看到协议切换请求似乎是正常的。我的nginx.conf如下所示:

worker_processes  auto;

env TARGET_APPLICATION_HOST;
env TARGET_APPLICATION_PORT;
env TARGET_USE_SSL;

events {
    worker_connections  1024;
}

http {
    server {
        listen 80;
        server_name localhost;

        location / {
            resolver local=on ipv6=off valid=100s;

            content_by_lua_block {
                local http = require "resty.http"
                local httpc = http.new()

                httpc:set_timeout(500)
                local ok, err = httpc:connect(
                    os.getenv("TARGET_APPLICATION_HOST"),
                    os.getenv("TARGET_APPLICATION_PORT"))

                if not ok then
                    ngx.log(ngx.ERR, err)
                    return
                end

                if os.getenv("TARGET_USE_SSL") == "TRUE" then
                    -- 触发SSL握手
                    session, err = httpc:ssl_handshake(False, server, False)
                end

                httpc:set_timeout(2000)
                httpc:proxy_response(httpc:proxy_request())
                httpc:set_keepalive()
            }
        }
    }
}

这是生产代理的简化版本,但在websockets中返回相同的错误。我尝试过使用纯nginx代理,它可以正常使用websockets,但我需要OpenResty的功能(根据cookie值代理不同的主机)。

上面的文件中是否有任何简单的错误或OpenResty没有websocket功能?

点赞
用户9783845
用户9783845

lua-resty-http 是一个HTTP(S)客户端库,它不支持WebSocket协议,而且可能不会加入对其的支持。

WebSocket协议有另一个库:lua-resty-websocket。它实现了客户端和服务端,因此使用此库编写代理应该是可行的。

我需要OpenResty的能力(基于cookie值代理不同的主机)。

ngx.balancer 正是你需要的,可以查看示例这个答案

2021-04-27 10:05:22