`
haoningabc
  • 浏览: 1477850 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

openresty websocket

阅读更多
mac安装openresty
brew install openssl

./configure --prefix=/usr/local/openresty --with-openssl=/usr/local/Cellar/openssl/1.0.2o_1
make
make install
 


openssl还是有问题 shared等
参考
https://blog.csdn.net/csdncqmyg/article/details/73835354

bundle/nginx-x-x-x(版本号)/auto/lib/openssl/conf
把.openssl删掉 ,只删这个单词





几年前调过的

http://haoningabc.iteye.com/blog/2168717

参考教程如下
openresty
http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html

https://www.openresty.net.cn/

https://github.com/openresty/lua-nginx-module
http://wiki.jikexueyuan.com/project/openresty/openresty/get_url_param.html

https://www.cnblogs.com/scotoma/p/3330190.html

nginx.conf添加
		location /1.0/websocket {
			lua_socket_log_errors off;
			lua_check_client_abort on;
			content_by_lua_block {
				local server = require "resty.websocket.server"
				local wb, err = server:new{
				    timeout = 5000,  -- in milliseconds
				    max_payload_len = 65535,
				}
				if not wb then
					ngx.log(ngx.ERR, "failed to new websocket: ", err)
					return ngx.exit(444)
				end
				while true do
					local data, typ, err = wb:recv_frame()
					if wb.fatal then
						ngx.log(ngx.ERR, "failed to receive frame: ", err)
						return ngx.exit(444)
					end
					if not data then
						local bytes, err = wb:send_ping()
						if not bytes then
						  	ngx.log(ngx.ERR, "failed to send ping: ", err)
						  	return ngx.exit(444)
						end
					elseif typ == "close" then break
					elseif typ == "ping" then
						local bytes, err = wb:send_pong()
						if not bytes then
						  	ngx.log(ngx.ERR, "failed to send pong: ", err)
						  	return ngx.exit(444)
						end
					elseif typ == "pong" then
						ngx.log(ngx.INFO, "client ponged")
					elseif typ == "text" then
						local bytes, err = wb:send_text("from nginx:"..data)
						if not bytes then
						  	ngx.log(ngx.ERR, "failed to send text: ", err)
						  	return ngx.exit(444)
						end
					end
				end
				wb:send_close()
			}
		}

客户端
<html>
<head>
<script>
var ws = null;
function connect() {
  if (ws !== null) return log('already connected');
  ws = new WebSocket('ws://localhost/1.0/websocket');
  ws.onopen = function () {
    log('connected');
  };
  ws.onerror = function (error) {
    log(error);
  };
  ws.onmessage = function (e) {
    log('recv: ' + e.data);
  };
  ws.onclose = function () {
    log('disconnected');
    ws = null;
  };
  return false;
}
function disconnect() {
  if (ws === null) return log('already disconnected');
  ws.close();
  return false;
}
function send() {
  if (ws === null) return log('please connect first');
  var text = document.getElementById('text').value;
  document.getElementById('text').value = "";
  log('send: ' + text);
  ws.send(text);
  return false;
}
function log(text) {
  var li = document.createElement('li');
  li.appendChild(document.createTextNode(text));
  document.getElementById('log').appendChild(li);
  return false;
}
</script>
</head>
<body>
  <form onsubmit="return send();">
    <button type="button" onclick="return connect();">
      Connect
    </button>
    <button type="button" onclick="return disconnect();">
      Disconnect
    </button>
    <input id="text" type="text">
    <button type="submit">Send</button>
  </form>
  <ol id="log"></ol>
</body>
</html>


调用url的例子

function max(mystr)
	local sock = ngx.socket.tcp()
	--ngx.say("hello I am in /data/www/lua/ ")
	ngx.say(mystr)
--	local ai_url = "http://10.22.57.168:8080/interaction"
	local ok, err = sock:connect("www.baidu.com", 80)
	--local ok, err = sock:connect(ai_url, 80)
	if not ok then
	    ngx.say("failed to connect to baidu: ", err)
	    return
	end

	local req_data = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n"
--	local req_data = '{"misid":"12345","content":{"type":"manual","text":"附近有什么外卖"},"tm":1524130703583}'
	local bytes, err = sock:send(req_data)
	if err then
	    ngx.say("failed to send to baidu: ", err)
	    return
	end

	local data, err, partial = sock:receive()
	if err then
	    ngx.say("failed to recieve to baidu: ", err)
	    return
	end

	sock:close()
	ngx.say("successfully talk to baidu! response first line: ", data)
end
max("hello world ya")

简单点的
local res = ngx.location.capture(
                        'http://10.22.57.168:8080/interaction',
                        {
                           method = ngx.HTTP_POST,
--                           args = ngx.encode_args({a = 1, b = '2&'}),
                           --body = ngx.encode_args({c = 3, d = '4&'})
                           body = '{"misid":"12345","content":{"type":"manual","text":"附近有什么外卖"},"tm":1524130703583}'
                       }
                    )
ngx.say(res.body)

websocket 的
local server = require "resty.websocket.server"
local wb, err = server:new{
    timeout = 5000,  -- in milliseconds
    max_payload_len = 65535,
}
if not wb then
	ngx.log(ngx.ERR, "failed to new websocket: ", err)
	return ngx.exit(444)
end
while true do
	local data, typ, err = wb:recv_frame()
	if wb.fatal then
		ngx.log(ngx.ERR, "failed to receive frame: ", err)
		return ngx.exit(444)
	end
	if not data then
		local bytes, err = wb:send_ping()
		if not bytes then
		  	ngx.log(ngx.ERR, "failed to send ping: ", err)
		  	return ngx.exit(444)
		end
	elseif typ == "close" then break
	elseif typ == "ping" then
		local bytes, err = wb:send_pong()
		if not bytes then
		  	ngx.log(ngx.ERR, "failed to send pong: ", err)
		  	return ngx.exit(444)
		end
	elseif typ == "pong" then
		ngx.log(ngx.INFO, "client ponged")
	elseif typ == "text" then
		local cjson = require "cjson"
		--local json_str = '{"name": "hao.ning", "age": 25}'
		--local json = cjson.decode(json_str)
		local json = cjson.decode(data)

		if not json then
		  	ngx.log(ngx.ERR, "failed json: ", err)
		  	return ngx.exit(444)
		end
--		local bytes, err = wb:send_text("from nginx /data/www/lua: "..data)
		ngx.ctx.wb_list={}
		ngx.ctx.wb_list["hao"]="abc"
		ngx.ctx.wb_list[json['name']]="aaaa"

		--local bytes, err = wb:send_text("from nginx save wb:"..json['name'])
		--local bytes, err = wb:send_text("from nginx save wb:"..table.getn(ngx.ctx.wb_list))
		local bytes, err = wb:send_text("from nginx save wb:"..ngx.ctx.wb_list["Bruce.Lin"])
		if not bytes then
		  	ngx.log(ngx.ERR, "failed to send text: ", err)
		  	return ngx.exit(444)
		end
	end
end
wb:send_close()



nginx.conf配置执行lua


location /hellolua {
            content_by_lua_file /data/www/lua/luatest.lua;
        }
分享到:
评论

相关推荐

    基于websocket的多人多聊天室服务器

    在本文中,我们将深入探讨如何基于WebSocket构建一个支持多人多聊天室的服务器,以及如何利用OpenResty这一强大的Web服务器平台来实现这一目标。 首先,WebSocket API允许Web应用程序在单个TCP连接上进行全双工通信...

    lua-resty-websocket, 对ngx_lua模块( 和 OpenResty )的web socket支持.zip

    lua-resty-websocket, 对ngx_lua模块( 和 OpenResty )的web socket支持 电子邮件名称lua-resty-websocket - ngx_lua模块的Lua web socket实现 table-内容名称状态描述概要说明模块resty.websocket.server方法新插件...

    基于openresty的多人聊天室

    在部署过程中,开发者需要安装OpenResty环境,配置WebSocket支持,编写 Lua 脚本处理业务逻辑,然后将静态资源部署到相应的路径,最后启动OpenResty服务。用户则通过浏览器打开聊天室页面,连接WebSocket服务器,就...

    openresty-1.11.2.5.tar.gz

    OpenResty是一款基于Nginx与LuaJIT的高性能Web平台,它将强大的Lua脚本语言集成到了Nginx中,使得开发者可以利用Lua轻松构建出高性能的HTTP服务器、反向代理服务器以及WebSocket服务等。在`openresty-1.11.2.5.tar....

    OpenResty与语⾳交互 — OpenResty及其组件的全栈开发.zip

    4. Websocket编程:理解WebSocket协议,能够在OpenResty中实现WebSocket服务器。 5. 数据库操作:熟悉SQL语言,使用lua-resty-mysql或其他库进行数据库交互。 6. 安全性:了解常见的Web安全问题,如XSS、CSRF等,并...

    KONG OPENRESTY.pdf

    OpenResty 是一个基于 Nginx 的 Web 服务器,它提供了许多有用的功能,例如 Lua 脚本、SSL/TLS 支持、Websocket 支持等。OpenResty 是 Kong 的一个重要组件,它提供了 Kong 的核心功能。 Mashape 是 Kong 的背后...

    openresty-web-dev:openresty网站演示

    openresty 前端开发进阶六之websocket篇 openresty 前端开发高级应用一之性能优化 openresty 前端开发高级应用一之动态追踪技术 openresty 简单应用 openresty 灰度发布 openresty 定时任务 openresty 应用打包并...

    基于 OpenResty 和 Node.js 的微服务架构实践.pdf

    - **后端服务**:构建 RESTful API 服务器、WebSocket 服务器等。 - **实时通信**:实现聊天应用、在线游戏等实时交互系统。 - **微服务架构**:作为微服务的一部分,提供特定的功能或服务。 ### 二、微服务架构...

    OpenResty功能齐全的Web应用程序服务器.rar

    3. **丰富的模块库**:OpenResty提供了许多预装的Nginx模块,如lua-nginx-module、resty.http、resty.redis等,用于HTTP、WebSocket、数据库连接、缓存、负载均衡等功能。这些模块简化了与各种后端服务的交互,如...

    Python-openresty和lua多功能模板

    此外,OpenResty还支持WebSocket,可以构建实时通信应用,如聊天室或在线游戏。 总结起来,Python-openresty和lua的结合提供了一种高效且灵活的开发模式,通过Lua在Nginx层进行轻量级的处理,借助Python处理复杂的...

    基于OpenResty的百万级长连接推送.zip

    OpenResty可以轻松集成WebSocket,通过lua-nginx-module模块,实现WebSocket的握手和数据传输。 构建百万级长连接系统,需要考虑的关键点包括: 1. **连接管理**:为了有效地管理和维护大量连接,可以使用连接池,...

    OpenResty可伸缩的Web平台 v1.19.9.1 rc1.gz

    3. **Web服务开发**:开发人员可以使用OpenResty轻松地构建RESTful API服务、WebSocket服务器、实时流媒体服务器、动态内容生成、API网关、负载均衡器等。 4. **高效的数据处理**:通过Lua的语法,OpenResty可以...

    OpenResty在又拍云容器平台中的应用.zip

    首先,OpenResty通过Nginx的模块化设计,可以处理HTTP、HTTPS、WebSocket等多种协议,这使得它能够作为容器平台的前端入口,接收来自客户端的请求,并进行初步的处理。在又拍云的容器环境中,OpenResty扮演了重要的...

    基于OpenResty的LuaWeb框架Lor.zip

    Lor是一个运行在[OpenResty](http://openresty.org)上的基于Lua编写的Web框架. 路由采用[Sinatra](http://www.sinatrarb.com/)风格,结构清晰,易于编码和维护. API借鉴了[Express](http://expressjs.com)的思路...

    1-4+DataVisor风控架构设计&OpenResty实战.pdf

    OpenResty的`capture_multi`和`cosocket`特性,结合coroutine(协程)和socket技术,能有效地处理TCP/UDP协议的上下游连接,包括MySQL、Redis、WebSocket和DNS查询等,从而实现高效的并发查询。 面对新型攻击手段,...

    openresty-ingress

    2. **HTTP/2 & WebSocket 支持**: 由于 OpenResty 基于 Nginx,因此它天生支持 HTTP/2 和 WebSocket 协议,这对于现代 Web 应用是至关重要的。 3. **性能优化**: OpenResty 提供了高效的 LuaJIT 编译器,使得在处理...

    proxyee:HTTP代理服务器,支持HTTPS&websocket.MITM隐含,拦截和篡改HTTPS流量

    Proxyee是JAVA编写的HTTP代理服务器库,它支持HTTP,HTTPS,Websocket协议,并支持MITM(中间人),它可以捕获和篡改HTTP,HTTPS数据包。 用法 &lt; groupId&gt;com.github.monkeywie&lt;/ groupId&gt; &lt; artifactId&gt;proxyee ...

    chat:socket.io 客户端 + openresty

    在IT行业中,网络通信是关键的一环,而`socket.io`和`openresty`都是在这一领域中非常重要的工具。本项目是一个基于`socket.io`客户端和`openresty`服务器的实时聊天示例,旨在展示如何在JavaScript环境下利用这两种...

    openresty

    连接到websocket端点 websocat -E -b tcp-l:127.0.0.1:2288 ws://example.com/websocat 连接到localhost SSH隧道 ssh -i ~ /.ssh/id_ecdsa -p 2288 -v -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null...

Global site tag (gtag.js) - Google Analytics