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()
			}
		}

客户端





  


    调用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;
            }
    

    你可能感兴趣的:(lua,websocket,nginx,openresty)