Lua脚本本地调试

news2024/11/27 14:52:50

这里主要使用日志的方式进行debug

环境依赖

项目对openresty包的依赖比较高,所以环境基础都在openresty下进行

openresty的使用

openresty下载地址

下载完成后解压,具体使用方式和nginx没有什么区别,主要依赖文件是一下几个

nginx.exe # 负责启动服务
conf/nginx.conf  # nginx的配置文件 使用lua脚本主要也是在这里配置
logs  # 日志查看 排错

lua链接mysql校验用户

这里拿lua链接mysql为例

 -- utils_mysql
 local mysql = require "resty.mysql"
local cjson = require "cjson"
local _M = {}

local function getUser(userNo, orgCode)
    db = _M:new()
    if not db then
        return false, {}

    end
    local userRes, err, errcode, sqlstate = db:query(
        "SELECT COUNT(F_user_account) F_count FROM t_user WHERE F_user_account = " .. userNo .. " AND F_deleted='0'")
    -- 目前用户不存在放行  只存入相关信息 设置匿名用户
    if not userRes then
        ngx.log(ngx.ERR, "用户--" .. userNo .. "-- 不存在" .. err)
        return false, {
            status = 401,
            message = "Bad token; " .. tostring(err)
        }
    end
    local orgUserRes, err, errcode, sqlstate = db:query(
        "SELECT COUNT(F_user_account) F_count, F_status FROM t_org_user WHERE F_user_account = " .. userNo .. " AND F_org_code = " ..
            orgCode .. " AND F_deleted='0'")
    if not orgUserRes then
        ngx.log(ngx.ERR, "用户--" .. userNo .. "--和--" .. orgCode .. "--组织关系不存在"..err)
        return false, {
            status = 4060,
            message = "用户需要登录"
        }
    end


    ngx.log(ngx.ERR, "orgUserRes Is" .. cjson.encode(orgUserRes))

    -- lua脚本似乎不遵循index=0的原则 [{"F_count":"1","F_status":"0"}]
    if orgUserRes[1]["F_status"] ~= '0' then
        ngx.log(ngx.ERR, "该组织下角色已被禁用,请联系管理员".. err)
        return false, {
            status = 7025,
            message = "该组织下角色已被禁用,请联系管理员"
        }
    end
    ngx.log(ngx.WARN, "UserRes Is "..cjson.encode(userRes).. "orgUserRes Is" .. cjson.encode(orgUserRes))
    -- 校验成功的返回信息
    ngx.say('CheckUser Success')
    return true, {}
end

function _M.new(self)
    local db, err = mysql:new()
    if not db then
        ngx.log(ngx.ERR, "failed to instantiate mysql: ", err)
        return nil
    end
    -- 1 sec
    db:set_timeout(1000)
    local ok, err, errcode, sqlstate = db:connect{
        host = "xxxx",
        port = "xxxx",
        database = "xxxx",
        user = "xxxx",
        password = "xxxx"
    }
    if not ok then
        ngx.log(ngx.ERR, "failed to connect:  ", err, errcode, sqlstate)
        return nil
    end
    return db
end

function _M.close(self)
    local sock = self.sock
    if not sock then
        return nil, "not initialized"
    end
    if self.subscribed then
        return nil, "subscribed state"
    end
    -- put it into the connection pool of size 100,
    -- with 10 seconds max idle timeout
    local ok, err = self.sock:set_keepalive(10000, 100)
    if not ok then
        ngx.log(ngx.ERR, "failed to set keepalive:", err)
        return
    end
end

getUser('username', 'org_code')
-- return _M

修改配置文件nginx.conf


#user  nobody;
worker_processes 1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
events {
    worker_connections 1024;
}


http {
    include mime.types;
    default_type application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;
    sendfile on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout 65;

    #gzip  on;

    server {
        # 修改原本的80端口为8765
        listen 8765;
        server_name localhost;

        #charset koi8-r;

        # 添加的lua脚本校验路径
        location /testlua {
            default_type 'text/html';  # 默认文本方式返回
            charset utf-8;
            lua_code_cache off;  # 不使用缓存
            content_by_lua_file  luaScript/utils_mysql.lua;  # 需要执行的lua脚本文件路径,这里的路径是相对于压缩包的路径,也可以使用绝对路径 注意windows下 \ 需要变成 /
        }

        #access_log  logs/host.access.log  main;
        location / {
            root html;
            index index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;

        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}


启动openresty

双击 nginx.exe即可,浏览器输入http://localhost:8765进入启动页面

调试过程中,每次点击nginx.exe都会启动新的线程,导致有时候更新的项目但是打到的请求还是在老的配置服务上,为确保每次请求都是最新的,最好把线程都删掉

windows
# 展示线程
tasklist /fi "imagename eq nginx.exe"
# 杀掉线程
taskkill /fi "imagename eq nginx.exe" -f

image-20230705184426041

Lua脚本校验

浏览器输入http://localhost:8765/testlua进入插件校验页面

运行的日志和错误信息都可以在logs/access.log&error.log中找到,由于这里已经是处理完成的脚本信息,如何解决问题这里不做展示。

需要注意的是,在脚本文件中ngx.log(ngx.ERR, "xxxx")最好都设置成err级别,别的级别好像不会展示在日志中

image-20230705184337283

校验

Error

image-20230706104405576

Success

日志和错误信息都可以在logs/access.log&error.log中找到,由于这里已经是处理完成的脚本信息,如何解决问题这里不做展示。

需要注意的是,在脚本文件中ngx.log(ngx.ERR, "xxxx")最好都设置成err级别,别的级别好像不会展示在日志中

[外链图片转存中…(img-PpfLXDLJ-1689328661208)]

校验

Error

[外链图片转存中…(img-j6J54ZsA-1689328661209)]

Success

image-20230705183759286

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/753187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt开发技巧之嵌入式linux点击触发两次

1.问题 移植qt5.12.9到嵌入式linux系统,tslib作为触摸输入,开发平台是imx6ull,点击pushbutton按钮会出现触发两次点击的情况。 2.解决 vi /etc/profile,在 /etc/profile里添加环境变量,禁止QT自带输入检测&#xff0…

数据结构---手撕图解堆的实现和TopK的应用

文章目录 重要的概念树的存储方式顺序存储链式存储 堆的概念堆的实现向上调整算法一些实现过程中的技巧实现搭建堆实现出堆的操作向下调整算法 堆排序TopK 重要的概念 要讲到堆,先要说两个关于二叉树的概念 满二叉树:一个二叉树如果每一层的节点数都是最…

ylb_学习笔记02

1.随机4位数: String random RandomStringUtils.randomNumeric(4);System.out.println("注册验证码的随机数 random"random);2.使用http时判断响应的状态为ture(200): response.getStatusLine().getStatusCode() Htt…

在阿里云linux上安装MySql数据库

我们先远程连接服务器 然后输入 sudo yum update重新运行一下 然后 sudo yum install mysql-server安装 mysql 服务 其中有两次 y n 选择 都选y就好了 然后 运行 sudo service mysqld start启动MySql 然后 我们查看一下MySql sudo service mysqld status

谷歌浏览器,网站多账号登陆的方法

在测试系统某些功能的时候,不同的模块,需要不同的权限,所以需要登陆不同的账号,以下有两种办法,可以快速切换账号方便进行测试。 1,使用SessionBox插件 SessionBox是一款可以方便地切换网站的session&…

Android开发笔记

一、知识点 1、Notification 通知的创建流程 1)创建一个NotificationManager,获取系统服务,getSystemService()方法; 2)使用Builder构造器来创建Notification对象,设置通知的各种属性; 3&#…

postgresql还原bak

1、第一步肯定是要新建自己还原的目标数据库,例如: 2、进入postgresql的安装目录下的bin目录下 然后地址栏输入cmd进入命令 输入以下 psql -h localhost -U postgres -p 5432 -d SamsinoYardStandard_karamay -f "D:\desktop\zk\20230628.bak&quo…

CEO对今天的CIO们真正的要求是什么?

在当今数字化和信息时代,企业的首席信息官(CIO)的角色变得至关重要。CIO不仅需要具备深厚的技术知识,还需要在商业战略、创新和领导力方面展现出卓越的能力。作为企业的首席执行官(CEO),他们对C…

【Distributed】分布式Ceph存储系统

文章目录 一、存储基础1. 单机存储设备1.1 DAS1.2 NAS1.3 SAN1.4 单机存储的问题1.5 商业存储解决方案 2. 分布式存储(软件定义的存储 SDS )分布式存储的类型 3. Ceph 简介4. Ceph 优势5. Ceph 架构6. Ceph 核心组件7. OSD 存储后端7.1 Filestore7.2 Blu…

单轴机器人的结构与特点

单轴机器人是由马达驱动的移动平台,由滚珠螺杆和 U型线性滑轨导引构成,其滑座同时为滚珠螺杆的驱动螺帽及线性滑轨的导引滑块,可用半导体、光电、交通运输业、环保节能产业、精密工具机、机械产业、智慧自动化、生技医疗上。 相对于传统的模组…

Yalmip工具箱使用教程(1)-入门学习

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译:YALMIP 1.Yalmip工具箱的下载与安装 1.1下载 Yalmip的作者是Johan Lfberg,是由Matlab平台编程实现的一个免费开源数学优化工具箱,在官网上就可以下载。官方下载…

LeetCode 0931. 下降路径最小和:通俗思路讲解

【LetMeFly】931.下降路径最小和:通俗思路讲解 力扣题目链接:https://leetcode.cn/problems/minimum-falling-path-sum/ 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一…

LeetCode 142.环形链表II

142. 环形链表 II - 力扣(LeetCode) /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *detectCycle(ListNode …

Java前端开发工程师的职责

Java前端开发工程师的职责1 职责: 1.负责公司现有软件的二次使用开发、测试; 2.负责公司信息化管理软件的开发; 3.修改已有的系统方案,以维持优良的操作性能及正常的信息沟通; 4.完善公司系统,完成项目接口、开发工作; 5. 能单独根据需求…

【yarn】 ‘husky install‘ fails if ‘.git‘ directory does not exists解决方法

问题描述 环境:win10 yarn 1.22.19 问题:在使用yarn安装前端依赖时,yarn install 出现错误: .git can’t be found (see https://git.io/Jc3F9) error Command failed with exit code 1. 截图 原因分析 根据设计,husky安装必…

数据结构-双向带头循环链表

链表的分类实现带有哨兵位的双向的循环链表**定义节点的结构**初始化单个节点初始化带有哨兵位的双向循环链表打印链表销毁链表尾插尾删头插头删find函数在任意位置之前插入任意位置的删除全部代码list.hlist.ctest.c 链表和顺序表的区别 链表的分类 如下 根据上述的三种组合…

线性调频信号公式推导及matlab仿真

线性调频信号的数学表达式: 其中,t是时间变量,单位为秒(s);T为脉冲持续时间(周期);K是线性调频率,单位是Hz/s; 角度(单位为弧度&…

【通过粒子滤波进行地形辅助导航】用于地形辅助导航的粒子滤波器和 PCRB研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【MySQL异常解决】MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案

MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案 一、背景描述二、报错原因三、解决方案3.1 升级 MySQL 数据库版本3.2 修改字符集为 一、背景描述 从服务器MySQL中导出数据为SQL执行脚本后,在本地电脑执行导出的SQL脚本,…

【数据结构---排序】庖丁解牛式剖析常见的排序算法

排序算法 一、常见的排序算法二、常见排序算法的实现1. 直接插入排序2. 希尔排序3. 直接选择排序4. 堆排序5. 冒泡排序6. 快速排序6.1 递归实现快速排序思路一、hoare 版本思路二、挖坑法思路三、前后指针法 6.2 非递归实现快速排序 7. 归并排序7.1 归并排序的递归实现7.2 归并…