GET请求,获取url上的参数
1
2
3
4
5
6
7-- url: ?username=abc
-- 方法一
local username = ngx.var.arg_username
-- 方法二
local strider = ngx.req.get_uri_args["username"]POST请求,获取url-formdata中的参数
1
2
3ngx.req.read_body()
local args = ngx.req.get_post_args()
local username = args["username"]POST请求,获取json中的参数
1
2
3
4local cjson = require('cjson')
ngx.req.read_body()
local args = cjson.decode(ngx.req.get_body_data())
local username = args["username"]
Openresty中nil、null和ngx.null的区别
由于没有保留现场,本文直接转载另一篇文章做参考:https://pureage.info/2013/09/02/125.html
问题概述
今天第一次在nginx+lua架构下,写了个需要操作Redis的后台接口,但是在判断空值时,结果和预期不一样
主要代码如下
1 | local md5,err=red:hget(tasklist,"md5") |
当md5不为空时才赋值,如果为空就过滤掉,可实际结果是md5为空,但是仍然执行了tb.md5=md5
,然后猜测是不是null字符串导致的,于是将上面的几行代码改为:
1 | local md5,err=red:hget(tasklist,"md5") |
仍然过滤失败,再次猜测可能是类型不对导致的
1 | ngx.say("type of null is "..type(md5)) |
Openresty修改日志access.log中的时间格式
在OpenResty的access.log中,默认的时间格式是[13/Dec/2019:13:42:53 +0800]
,对于这种时间格式,不便于识别。所以打算修改成[2019-12-13 13:42:53]
这种便于识别的格式
方法有两种,一种是修改源码,然后重新编译,现在不考虑。另一种是新增一个日期函数。
在http模块下新增一个日期函数
1
2
3log_by_lua_block {
ngx.var.fmt_localtime = ngx.localtime();
}配置日期函数
1
2
3map $host $fmt_localtime {
default '';
}使用该函数
1
2log_format main '$remote_addr[$http_x_forwarded_for] [$fmt_localtime] "$http_host" "$content_type" "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log logs/access.log main;
Linux find和cp连用
场景:
拷贝指定目录下的部分文件到另外一个目录,如果是简单的前缀或者后缀匹配可以通过*.conf
等类似的方式来操作,但是如果有更复杂的需求,比如排除一些文件,只拷贝文件,简单的cp已经不能胜任了,就需要配置find一起使用
两个命令连用,第一个想到的就是xargs
,但是这里有点区别,xargs
默认会把上一个命令的执行结果带入到下一个命令的末尾,这样在使用cp
时就有问题了,举例说明:
1 | > find /data/ -type f -name "*.txt" | xargs cp ./dist |
这样执行结果会报错,和预期是相反的
OpenResty配置免费的HTTPS证书
如果是Nginx,可以参考上一篇文章Nginx配置永久免费的SSL证书,由于cerbot自带nginx的插件,所以nginx的话,一个命令就完成了,但是在使用operensty时,操作上还是有点差异
1、安装certbot
1 | > yum install certbot |
2、在openresty的根目录下新建.well-known
的目录,如果是默认安装,根路径是/usr/local/openresty/nginx/html/
1 | > cd /usr/local/openresty/nginx/html/ |
3、在openresty的server配置中新增.well-known/
的访问路径
1 | location /.well-known/ { |
awk中使用substr截取字符串
解释:substr($0,2)
: 从字符串中的的第2个字符开始,直到结尾substr($$0,2,10)
: 从字符串中的的第2个字符开始,到第10个字符
示例:
1、截取固定字符串
1 | > echo "this is a test,test" |awk -F ',' '{print substr($1,1,4)}' |
2、根据字符串长度截取字符串
1 | > echo "this is a test,test" |awk -F ',' '{print substr($0,1,length($0)-4)}' |
PostgreSQL常用命令
PostgreSQL性能不错,在部分场景下还可以弥补MySQL的不足,但是由于sql语法和mysql有较大的区别,而且增加了很多特性,所以稍微有一些学习成本。
更多PG的使用可以参考 PG手册
连接数据库
1 | > psql -h localhost -p 32770 -d postgres -U postgres |
数据库相关命令
1 | -- 列出所有数据库 |
Kudu在使用过程中的各种限制
首先声明:kudu是个好东西,为什么了,因为配合kafka、kafka-connector、kudu、presto可以构建实时数仓,这点就够了。数据通过kafka、kafka-connector实时进kudu,然后每日把kudu中的数据导入到hdfs,亿级数据耗时分钟级。相比每日凌晨再把源文件同步到hive中,能减少很多同步数据的耗时,同时数据实时进kudu,能提高查询当日数据的效率。尽管在使用过程中有很多限制,但是仍然不影响在实际使用过程中的落地