美文网首页Lua
OpenResty常见问题

OpenResty常见问题

作者: MOIC_Qu | 来源:发表于2020-02-11 17:08 被阅读0次

近期使用openresty,用Lua 进行开发,这里总结了一些开发时遇到的问题和解决方法
主要围绕着OR的配置文件 nginx.conf ,lua访问mysql数据库操作,lua访问下游接口

整体搭建完服务,OR给我的感觉是,高效便捷易上手

openresty解决请求跨域问题

​ 在配置文件中增加参数即可 见示例一

​ add_header Access-Control-Allow-Origin $http_origin;
​ add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
​ add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";

lua脚本如何在openresty引用

​ 在当前openresty框架的配置文件 ./conf/nginx.conf中引用即可 见示例一

openresty创建接口

​ 在配置文件中配置即可 见示例一

服务调用外部接口

​ 在配置文件配置后,在lua脚本中进行访问即可 配置见示例一 调用接口见示例二

示例一

./conf/nginx.conf

worker_processes 1; #进程数
error_log /home/moic/or/simple_or/logs/error.log; #error日志位置

events {
  worker_connections 1024; #允许worker进程的连接数
}

http {
  server {
    listen 8888; #服务端口
    access_log /home/moic/or/simple_or/logs/access.log; #access日志位置
    location /api/test { #服务接口
      #解决跨域访问问题
      add_header Access-Control-Allow-Origin $http_origin;
            add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
            add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; #允许跨域访问的请求方式
      log_subrequest on;
      proxy_pass_request_headers on;
      default_type 'text/html;charset=utf-8';
      content_by_lua_file 'lua/test_1.lua'; # 习惯于将lua脚本都放在 跟conf平级的lua目录下
    }
    location ^~ /waibujiekou {
      proxy_pass http://waibujiekou:8282/test; #外部接口
      proxy_connect_timeout 10s;
    }
  }
}
示例二

./lua/test_1.lua 这里我们将调用外部接口的部分 封装为一个函数

local function request_waibuhanshu()
  local resp = ngx.location.capture("/waibujiekou",{
      method = ngx.HTTP_GET,
      args = { --这里是调用接口所需的参数
        word_1 = 1,
        tt = 2,
        kk = 1
      }
    })
  if (resp) then
    local ret = cjson.decode(resp.body)
    ngx.say(ret) --调试查看返回数据
  end
    return "ok"
end

lua获取请求方式,uri,请求参数

local request_method = ngx.var.request_method --请求方式
local request_uri = ngx.var.request_uri --uri
--假设你的本地服务请求为 http:/rest:8333/api/test?kk=1&tt=2
--拿到uri中的参数
local kk = ngx.var.arg_kk
local tt = ngx.var.arg_tt
ngx.say(kk) --输出参数 调试使用
ngx.say(tt)

--[[此时输出展示
1
2
]]--

lua对于开发者来说,还是很友好的,除了连接字符串是使用".." 和 初始下标为1 可能程序员思维有点不习惯

lua访问mysql数据库

这里是lua代码 将连接数据库的操作封装,具体步骤说明见代码注释

local function con_mysql(sql_str)
  local mysql = require "resty.mysql" --引入mysql模块
  local db, err = mysql:new() --lua函数支持返回多个值 也可以以这种形式保存返回的多个值
  if not db then
    ngx.say("db error")
        return 
  end
  db:set_timeout(10000)
  local ok, err, errno, sqlstate = db:connect{
    host = "你的数据库ip地址"
    port = 3306,
    database = "your_database",
    user = "your",
    password = "yourpassword"
  }
  if not ok then
    ngx.say("db connect err")
    return
  end
  local res, err, errcode, sqlstate = db:query(sql_str)
  if not res then
    ngx.say("select err")
  end
  db:close()
  return ok,errno,res
end

--调用mysql
local sql_str = "select * from test1"
local ok, errno, result = con_mysql(sql_str)
--返回的结果 是table类型
for i,row in ipairs(result) do
  ngx.say(row[1]) --获取数据
end

相关文章

网友评论

    本文标题:OpenResty常见问题

    本文链接:https://www.haomeiwen.com/subject/cwixfhtx.html