最近搭建流媒体服务器,其中涉及到一些http服务api的操作, 之前一直使用的是python django框架来处理这些信息, 这次编译的是nginx添加了lua模块, 就想着使用lua来完成这些功能, 减少服务的搭建。好久没有lua开发了,现在突然发现好多东西都记不住了, 所以就借着这次开发, 记录下经历的开发经历, 及必备所需的东西, 以备后续查找翻阅以及分享给大家。
日志, 是一个开发必备的东西, 特别是服务器,处理并发的服务器所一定调试要用到的。之前刚开始的时候还曾使用过使用文件io创建, 文件进行记录相关日志, 结果过程中出现的好多问题, 自己给自己弄得焦头烂额,后来主攻了这部分内容,最近在写lua接口的时候不知道怎么用了, 查询日志类型的时候,没有找到正确的地方, 日志类型也只查到了error级别, 造成了困扰,所以才有了写这系列的想法。
废话少说, 在学习一个领域的时候一定要有相应好的学习的网址来学习, 不管谁写的博客,资料,还是最原始的比较好
https://github.com/openresty/lua-nginx-module
nginx 所有模块说明
http://nginx.org/en/docs/
这都是最原始的资料, 里面也是最官方的说明, 内容非常好,必备网址
openresty是nginx lua的打包程序并对其做了优化, 所以openresty的说明也是官方,必备, 有一点特别好, 中国人自己写的, 所以有中文版,对于像我这样英文不怎么好的人来说就是一个福音
https://legacy.gitbook.com/book/moonbingbing/openresty-best-practices/details
http://openresty.org/cn/
那搭建openresy nginx+lua开发环境呢,我本身是做流媒体开发的,所以我都是整体编译的。环境搭建过程请看我之前博客
https://blog.csdn.net/u012618915/article/details/81180421
以下是正题:
日志级别:
ngx.STDERR 标准输出
ngx.EMERG 紧急报错
ngx.ALERT 报警
ngx.CRIT 严重,系统故障, 触发运维告警系统
ngx.ERR 错误,业务不可恢复性错误
ngx.WARN 提醒, 业务中可忽略错误
ngx.NOTICE 提醒, 业务中比较重要信息
ngx.INFO 信息, 业务琐碎日志信息, 包含不同情况判断等
ngx.DEBUG 调试
这些都是常量, 越往上等级越高。
函数原型
ngx.log(level, …)
基本都是在content阶段使用
示例
ngx.log(ngx.ERR, “num:”, num)
ngx.log(ngx.INFO, ” string:”.. str)
注意 print语句是INFO级别
lua中日志完成了, 那如何设置日志格式,日志格式呢, 那就需要使用nginx本身的log_format 进行设置了
log_format 属于 ngx_http_log_module
示例:
log_format main ‘
r
e
m
o
t
e
a
d
d
r
−
remote_user [
t
i
m
e
l
o
c
a
l
]
"
request” ’
‘
s
t
a
t
u
s
body_bytes_sent “
h
t
t
p
r
e
f
e
r
e
r
”
′
‘
”
http_user_agent" "$http_x_forwarded_for”’;
这是我使用的日志格式
语法:
log_format name [escape=default|json|none] string …;
默认的log_format 为
log_format combined ‘
r
e
m
o
t
e
a
d
d
r
−
remote_user [
t
i
m
e
l
o
c
a
l
]
′
‘
”
request"
s
t
a
t
u
s
body_bytes_sent ’
‘”
h
t
t
p
r
e
f
e
r
e
r
"
"
http_user_agent”’;
现在开始设置日志输出level, 那如何设置日志级别呢, 那就需要使用nginx本身的error_log进行设置了,
error_log属于ngx_core_module
示例:
error_log logs/error.log error;
语法
:
error_log file [level];
默认的error_log为
error_log logs/error.log error;
上下文为:
main, http, mail, stream, server, location
level 等级
debug, info, notice, warn, error, crit, alert, emerg
大于等于设置等级的日志均会被记录
若要设置debug level则在编译的时候添加–with-debug 即 ./configure –with-debug
以上为日志基本常用的功能均已经介绍完,以下为高阶功能, 不常用
远程日志:
lua-resty-logger-socket
以非阻塞 IO 方式推送 access log 到远程服务器上。 对远程服务器的要求是支持 syslog-ng 的日志服务
示例
log_by_lua_block {
local logger = require “resty.logger.socket”
if not logger.initted() then
local ok, err = logger.init{
host = ‘xxx’,
port = 1234,
flush_limit = 1234,
drop_limit = 5678,
}
if not ok then
ngx.log(ngx.ERR, “failed to initialize the logger: “,err)
return
end
end
local bytes, err = logger.log(msg)
if err then
ngx.log(ngx.ERR, “failed to log message: “, err)
return
end
优点:
基于 cosocket 非阻塞 IO 实现
日志累计到一定量, 集体提交, 增加网络传输利用率
短时间的网络抖动, 自动容错
日志累计到一定量, 如果没有传输完毕, 直接丢弃
日志传输过程完全不落地, 没有任何磁盘 IO 消耗
选择记录客户端debug日志 加编译选项(–with-debug)
示例
events {
debug_connection 192.168.1.1;
debug_connection 192.168.10.0/24;
}
日志为循环内存
error_log memory:32m debug;
这样做不影响高并发情况
gdb时可以这么用
set $log = ngx_cycle->log
while
l
o
g
−
>
w
r
i
t
e
r
!
=
n
g
x
l
o
g
m
e
m
o
r
y
w
r
i
t
e
r
s
e
t
最近搭建流媒体服务器,其中涉及到一些http服务api的操作, 之前一直使用的是python django框架来处理这些信息, 这次编译的是nginx添加了lua模块, 就想着使用lua来完成这些功能, 减少服务的搭建。好久没有lua开发了,现在突然发现好多东西都记不住了, 所以就借着这次开发, 记录下经历的开发经历, 及必备所需的东西, 以备后续查找翻阅以及分享给大家。日志, 是一个开发必备...
◆
ngx
.
log
():
函数
ngx
.
log
(
log
_level,…)记录
OpenResty
的运行
日志
,用法很类似
Lua
的标准库
函数print,可以接受任意多个参数,记录任意信息。
ngx
.
log
(
ngx
.INFO,"hello
openresty
")
ngx
.
log
的第一个参数是
日志
级别,只有高于配置文件里error_
log
指令设定级别的消息才会被真正地写入
日志
(通常都是error级),取值...
对于一个web服务器程序来说,对字符串处理的需求是必须的。由于web环境下的各种编码,也导致了web服务器程序字符串处理的繁杂性。在
nginx
源码中,
ngx
_string.c 这个文件就是来应对字符串处理的一些源码,源码中经常的使用到了这里中的函数,本文对
ngx
_string.c 进行一些简单的分析,以方便阅读其他源码。
我们来看它的基本数据结构:
typedef struct ...
1,
OpenResty
(
Nginx
)
Nginx
(engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。
Nginx
是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)
开发
的。
Nginx
是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特
ngx
.CRIT -- 严重,系统故障,触发运维告警系统
ngx
.ERR -- 错误,业务不可恢复性错误
ngx
.WARN -- 告警,业务中可忽略错误
ngx
.NOTICE --...
Nginx
日志
对于统计、系统服务排错很有用。
Nginx
日志
主要分为两种:access_
log
(访问
日志
)和error_
log
(错误
日志
)。通过访问
日志
我们可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息。错误
日志
记录了访问出错的信息,可以帮助我们定位错误的原因。本文将详细描述一下如何配置
Nginx
日志
。
设置access_
log
访问
日志
主要记录客户端的请求...
ngx
_
log
_mod
nginx
独立
日志
模块
输出
日志
到独立的
日志
文件,由于对
nginx
日志
格式不喜欢,加上
nginx
日志
不带有文件及行号等信息,
开发
了这个模块。主要用于在
开发
系统时,业务系统相关的
日志
独立输出到不同的文件,其中DEBUG
日志
与ERROR(包含INFO,WARN)是分开存储的。
biz
log
[on|off];
on 打开
日志
输出,off关闭
日志
输出,默认为off.
log
_level [0|1|2|3|4|5]
log
_level [error|warn|info|debug|debug2|all]
0: error 输出错误级别的
日志
,使用N
LOG
_ERRROR 输出。
1: warn 输出警告级别(包含错误
日志
)的
日志
,使用N
LOG
_WARN输出。
2: info 输出提示级别(包含警告
日志
)的
日志
,使用N
LOG
_INFO输出。
3: de
用
Openresty
作反向代理,有时候需要通过
日志
观察所有进来的请求信息,包括请求头、请求体等,可以通过以下方式将
日志
输出到
log
文件中。
编辑
nginx
.conf文件
error_
log
log
s/error.
log
info;
http {
include mime.types;
default_type application/octet-stream;
log
_format main '$remote_addr - $remote_user [$time
nginx
+
lua
+redis单机模式是指在一个服务器上部署
nginx
、
lua
和redis,使用
lua
脚本通过
nginx
与redis进行通信和数据操作。这种模式适用于小型应用或者测试环境,因为在单机模式下,
nginx
、
lua
和redis都运行在同一台服务器上,可以方便地进行调试和管理。
在单机模式下,可以通过安装
nginx
的
lua
模块,在
nginx
配置文件中添加
lua
脚本,通过
lua
脚本调用redis接口实现与redis的通信和数据存取。
lua
脚本可以直接连接本地的redis实例,通过调用redis命令来读写数据。
集群模式是指将
nginx
、
lua
和redis部署在多台服务器上,将它们组成一个集群来处理更多的并发请求和存储大量数据。在集群模式下,可以通过
nginx
的upstream模块将请求分发到不同的redis节点上,实现负载均衡和高可用性。
在集群模式下,需要使用
lua
的redis连接库来连接redis集群。该库通过redis集群的节点地址和端口来进行连接,实现对集群中各个节点的数据操作。通过在
lua
脚本中调用redis连接库的方法,可以实现与redis集群的通信和数据操作。
总而言之,
nginx
+
lua
+redis单机模式适用于小型应用或测试环境,而
nginx
+
lua
+redis集群模式适用于处理更多并发请求和存储大量数据的场景,可以通过
lua
脚本和redis连接库来实现与redis集群的通信和数据操作。