nginx lua 笔记

本文介绍了nginx在配置中使用美元符号"$"的场景,平滑升级的官方说明,以及nginx.vim的配置。深入讨论了内存对齐的定义和用途,并展示了如何访问目录文件、打印body以及使用ngx API。在lua部分,讲解了url转义、执行系统命令、获取时间和处理请求参数的方法,特别提到了flv直播回源时遇到的302重定向问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nginx

配置中使用“$”
  • geo http模块
geo $KK {default"$"; } 
set $ss $kk;
平滑升级
官方说明
  • kill -USR2 8936 (master) 创建新的master worker
  • kill -WINCH 8936 (master) 停止旧的worker
  • kill -QUIT 8936 (master) 停止旧的master

    createnewworker () {
    masternum1=`ps -ef |grep nginx |grep master |wc -l`
    pidnum2=`ps -ef |grep nginx |grep master |awk '{print $2}'`
    if [ $masternum1 -eq 1 ];then
    echo "one master, update master..."
    kill -USR2 $pidnum2
    sleep 1
    kill -WINCH $pidnum2
    sleep 1
    kill -QUIT $pidnum2
    sleep 1
    echo "New worker create success"
    ps -ef |grep 'nginx: ' |grep -v grep
    elif [ $masternum1 -eq 0 ];then
    echo "no master, start master..."
    /usr/local/sms/sbin/nginx -c /usr/local/sms/conf/nginx.conf
    sleep 3
    ps -ef |grep 'nginx: ' |grep -v grep
    elif [ $masternum1 -eq 2 ];then
    echo "two master, kill old worker..."
    pidnum2=`cat /usr/local/sms/logs/nginx.pid.oldbin`
    kill $pidnum2
    sleep 1
    pidnum2=`ps -ef |grep nginx |grep master |awk '{print $2}'`
    kill -USR2 $pidnum2
    sleep 1
    kill -WINCH $pidnum2
    sleep 1
    kill -QUIT $pidnum2
    sleep 1
    echo "New worker create success"
    ps -ef |grep 'nginx: ' |grep -v grep
    elif [ $masternum1 -gt 2 ];then
    echo "Create new worker is Faild ..........."
    sleep 3
    ps -ef |grep 'nginx: ' |grep -v grep
    fi
    }
nginx.vim
  • Download nginx.vim to ~/.vim/syntax/
  • add this line to ~/.vim/filetype.vim:
au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft == '' | setfiletype nginx | endif 
内存对齐
  • #define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1))
    //// 将 m 对其到内存对齐地址
    align这是一个常见的宏\R\N
    • 功能:把d已a为最小单位对齐。d为要操作的目标,a为对齐单位,2的n次方。\R\N
    • 用途:一般用于内存、数据对齐。\R\N
    • 简介:((d) + (a - 1))的结果就是如果d小于a的低几位(log2 a位)部分如果不是0,就规整为a。用& ~(a - 1)操作,把低位设成0。总的结果就是,把d规整为a的倍数,不足a的1倍的部分则补足为1(类似与近似运算时的1进制)。从而保证align(d,a)的低log2 a位为零。
    • 比如把12和2规整为8的倍数(2进制第三位对齐)。12=8+4,低3位部分4规整为8,algn(12,8)=16。24本身就是8的倍数,规整后还是24。
    • offsetof
    • #define offsetof(type,member) (size_t)&(((type *)0)->member)
访问目录文件
client_max_body_size 100m;
client_body_buffer_size 100000k;  #太小会影响上传速度

location /{
    autoindex on;  #访问目录
    autoindex_localtime on;  #默认off GMT时间。on为服务器时间
    autoindex_exact_size off;  #默认on 详细大小,off单位k或者M
    root $dir;
}
打印body
location /test {
    content_by_lua '
        ngx.req.read_body()
        local args = ngx.req.get_post_args()
        for key, val in pairs(args) do
            ngx.log(ngx.INFO,key.. val)
        end
    ';
}
nginx打印
/*
 * supported formats:
 *    %[0][width][x][X]O        off_t
 *    %[0][width]T              time_t
 *    %[0][width][u][x|X]z      ssize_t/size_t
 *    %[0][width][u][x|X]d      int/u_int
 *    %[0][width][u][x|X]l      long
 *    %[0][width|m][u][x|X]i    ngx_int_t/ngx_uint_t
 *    %[0][width][u][x|X]D      int32_t/uint32_t
 *    %[0][width][u][x|X]L      int64_t/uint64_t
 *    %[0][width|m][u][x|X]A    ngx_atomic_int_t/ngx_atomic_uint_t
 *    %[0][width][.width]f      double, max valid number fits to %18.15f
 *    %P                        ngx_pid_t
 *    %M                        ngx_msec_t
 *    %r                        rlim_t
 *    %p                        void *
 *    %V                        ngx_str_t *
 *    %v                        ngx_variable_value_t *
 *    %s                        null-terminated string
 *    %*s                       length and string
 *    %Z                        '\0'
 *    %N                        '\n'
 *    %c                        char
 *    %%                        %
 *
 *  reserved:
 *    %t                        ptrdiff_t
 *    %S                        null-terminated wchar string
 *    %C                        wchar
 */
ngx api 详细api
ngx.arg[index]              #ngx指令参数,当这个变量在set_by_lua或者set_by_lua_file内使用的时候是只读的,指的是在配置指令输入的参数.  
ngx.var.varname             #读写NGINX变量的值,最好在lua脚本里缓存变量值,避免在当前请求的生命周期内内存的泄漏  
ngx.config.ngx_lua_version  #当前ngx_lua模块版本号  
ngx.config.nginx_version    #nginx版本  
ngx.worker.exiting          #当前worker进程是否正在关闭  
ngx.worker.pid              #当前worker进程的PID  
ngx.config.nginx_configure  #编译时的./configure命令选项  
ngx.config.prefix           #编译时的prefix选项  

core constans:              #ngx_lua 核心常量  
    ngx.OK (0)  
    ngx.ERROR (-1)  
    ngx.AGAIN (-2)  
    ngx.DONE (-4)  
    ngx.DECLINED (-5)  
    ngx.nil  
http method constans:       #经常在ngx.location.catpure和ngx.location.capture_multi方法中被调用.  
    ngx.HTTP_GET  
    ngx.HTTP_HEAD  
    ngx.HTTP_PUT  
    ngx.HTTP_POST  
    ngx.HTTP_DELETE  
    ngx.HTTP_OPTIONS    
    ngx.HTTP_MKCOL      
    ngx.HTTP_COPY        
    ngx.HTTP_MOVE       
    ngx.HTTP_PROPFIND   
    ngx.HTTP_PROPPATCH   
    ngx.HTTP_LOCK   
    ngx.HTTP_UNLOCK      
    ngx.HTTP_PATCH     
    ngx.HTTP_TRACE    
http status constans:       #http请求状态常量   
    ngx.HTTP_OK (200)  
    ngx.HTTP_CREATED (201)  
    ngx.HTTP_SPECIAL_RESPONSE (300)  
    ngx.HTTP_MOVED_PERMANENTLY (301)  
    ngx.HTTP_MOVED_TEMPORARILY (302)  
    ngx.HTTP_SEE_OTHER (303)  
    ngx.HTTP_NOT_MODIFIED (304)  
    ngx.HTTP_BAD_REQUEST (400)  
    ngx.HTTP_UNAUTHORIZED (401)  
    ngx.HTTP_FORBIDDEN (403)  
    ngx.HTTP_NOT_FOUND (404)  
    ngx.HTTP_NOT_ALLOWED (405)  
    ngx.HTTP_GONE (410)  
    ngx.HTTP_INTERNAL_SERVER_ERROR (500)  
    ngx.HTTP_METHOD_NOT_IMPLEMENTED (501)  
    ngx.HTTP_SERVICE_UNAVAILABLE (503)  
    ngx.HTTP_GATEWAY_TIMEOUT (504)   

Nginx log level constants:      #错误日志级别常量 ,这些参数经常在ngx.log方法中被使用.  
    ngx.STDERR  
    ngx.EMERG  
    ngx.ALERT  
    ngx.CRIT  
    ngx.ERR  
    ngx.WARN  
    ngx.NOTICE  
    ngx.INFO  
    ngx.DEBUG  

##################  
#API中的方法:  
##################  
print()                         #与 ngx.print()方法有区别,print() 相当于ngx.log()  
ngx.ctx                         #这是一个lua的table,用于保存ngx上下文的变量,在整个请求的生命周期内都有效,
ngx.location.capture()          #发出一个子请求,详细用法参考官方文档。  
ngx.location.capture_multi()    #发出多个子请求,详细用法参考官方文档。  
ngx.status                      #读或者写当前请求的相应状态. 必须在输出相应头之前被调用.  
ngx.header.HEADER               #访问或设置http header头信息,详细参考官方文档。  
ngx.req.set_uri()               #设置当前请求的URI,详细参考官方文档  
ngx.set_uri_args(args)          #根据args参数重新定义当前请求的URI参数.  
ngx.req.get_uri_args()          #返回一个LUA TABLE,包含当前请求的全部的URL参数  
ngx.req.get_post_args()         #返回一个LUA TABLE,包括所有当前请求的POST参数  
ngx.req.get_headers()           #返回一个包含当前请求头信息的lua table.  
ngx.req.set_header()            #设置当前请求头header某字段值.当前请求的子请求不会受到影响.  
ngx.req.read_body()             #在不阻塞ngnix其他事件的情况下同步读取客户端的body信息.[详细]  
ngx.req.discard_body()          #明确丢弃客户端请求的body  
ngx.req.get_body_data()         #以字符串的形式获得客户端的请求body内容  
ngx.req.get_body_file()         #当发送文件请求的时候,获得文件的名字  
ngx.req.set_body_data()         #设置客户端请求的BODY  
ngx.req.set_body_file()         #通过filename来指定当前请求的file data。  
ngx.req.clear_header()          #清求某个请求头  
ngx.exec(uri,args)              #执行内部跳转,根据uri和请求参数  
ngx.redirect(uri, status)       #执行301或者302的重定向。  
ngx.send_headers()              #发送指定的响应头  
ngx.headers_sent                #判断头部是否发送给客户端ngx.headers_sent=true  
ngx.print(str)                  #发送给客户端的响应页面  
ngx.say()                       #作用类似ngx.print,不过say方法输出后会换行  
ngx.log(log.level,...)          #写入nginx日志  
ngx.flush()                     #将缓冲区内容输出到页面(刷新响应)  
ngx.exit(http-status)           #结束请求并输出状态码  
ngx.eof()                       #明确指定关闭结束输出流  
ngx.escape_uri()                #URI编码(本函数对逗号,不编码,而php的urlencode会编码)  
ngx.unescape_uri()              #uri解码  
ngx.encode_args(table)          #将tabel解析成url参数  
ngx.decode_args(uri)            #将参数字符串编码为一个table  
ngx.encode_base64(str)          #BASE64编码  
ngx.decode_base64(str)          #BASE64解码  
ngx.crc32_short(str)            #字符串的crs32_short哈希  
ngx.crc32_long(str)             #字符串的crs32_long哈希  
ngx.hmac_sha1(str)              #字符串的hmac_sha1哈希  
ngx.md5(str)                    #返回16进制MD5  
ngx.md5_bin(str)                #返回2进制MD5  
ngx.today()                     #返回当前日期yyyy-mm-dd  
ngx.time()                      #返回当前时间戳  
ngx.now()                       #返回当前时间  
ngx.update_time()               #刷新后返回  
ngx.localtime()                 #返回 yyyy-mm-dd hh:ii:ss  
ngx.utctime()                   #返回yyyy-mm-dd hh:ii:ss格式的utc时间  
ngx.cookie_time(sec)            #返回用于COOKIE使用的时间  
ngx.http_time(sec)              #返回可用于http header使用的时间        
ngx.parse_http_time(str)        #解析HTTP头的时间  
ngx.is_subrequest               #是否子请求(值为 true or false)  
ngx.re.match(subject,regex,options,ctx)     #ngx正则表达式匹配,详细参考官网  
ngx.re.gmatch(subject,regex,opt)            #全局正则匹配  
ngx.re.sub(sub,reg,opt)         #匹配和替换(未知)  
ngx.re.gsub()                   #未知  
ngx.shared.DICT                 #ngx.shared.DICT是一个table 里面存储了所有的全局内存共享变量  
    ngx.shared.DICT.get    
    ngx.shared.DICT.get_stale      
    ngx.shared.DICT.set    
    ngx.shared.DICT.safe_set       
    ngx.shared.DICT.add    
    ngx.shared.DICT.safe_add       
    ngx.shared.DICT.replace    
    ngx.shared.DICT.delete     
    ngx.shared.DICT.incr       
    ngx.shared.DICT.flush_all      
    ngx.shared.DICT.flush_expired      
    ngx.shared.DICT.get_keys  
ndk.set_var.DIRECTIVE           #不懂

lua

url转义
ngx.escape_uri
ngx.unescape_uri
ngx.req.read_body()
local body = ngx.req.get_body_data()
--local header =  ngx.req.get_headers()
if not body then
    local file = ngx.req.get_body_file()
    body = common_lib:read_file_data(file)
end
执行系统命令
  • os.execute(“mkdir dir”)
时间
os.date("%Y-%m-%d_%H:%M:%S", os.time()- 8*3600 

Lua 定义了两个常量: LUA_MININTEGER 和
LUA_MAXINTEGER 来表示这个类型可以表示的最小和最大值。

time_tab = os.date("%Y-%m-%d_%H:%M:%S", date + time)    
date = os.time{year=year, month=month, day=day, hour=0, min=0, sec=0}
请求参数
local urlargs = {}
local agrstr = ngx.encode_args(urlargs)
req_url = req_url.."?"..agrstr
local req_args = {}
ngx_var.args = nil
ngx.req.set_uri_args(req_args)
req_url = req_url.."?"..ngx.unescape_uri(ngx_var.args)
flv直播 回源 302
   upstream tx.flv.huya.bak {
        server  tx.flv.huya.com:80;
        localfirst;
        keepalive 1024;
        }
    server {
        listen       8080;
        server_name  tx.flv.huya.com;

        proxy_intercept_errors on;
        recursive_error_pages on;
        location  / {
            proxy_pass http://tx.flv.huya.bak;
            proxy_set_header Host tx.flv.huya.com;
            error_page 302 = @error_page_302;
        }
        location ~ /proxyto/([^/]+)(.*) {
            proxy_pass http://$1$2$is_args$query_string;
            error_page 302 = @error_page_302;
        }
        location @error_page_302 {
            rewrite_by_lua '
               local _, _, upstream_http_location = string.find(ngx.var.upstream_http_location, "^http:/(.*)$")
               ngx.header["cnkedao"] = "/proxyto" .. upstream_http_location
               ngx.exec("/proxyto" .. upstream_http_location);
                ';
        }
}

######################################
    upstream tx.flv.huya {
        server  127.0.0.1:8080;
        keepalive 1024;
    }
    server {
        listen       80;
        server_name  tx.flv.huya.com;
        http_billing_withname on;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_http_version 1.1;
            proxy_pass http://tx.flv.huya;
            proxy_set_header Host tx.flv.huya.com;
        }
        location ~* \.flv$  {
            http_live on;
            gop_enable on;
            gop_min 250;
            zero_timestamp on;
            stream_type live_flv;

            live_proxy_connect_timeout 10s;
            live_proxy_http_version 1.1;
            live_proxy_ignore_client_abort off;
            live_proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;
            add_header Cache-Control no-cache;
            add_header Content-Type video/x-flv;
            live_proxy_pass http://tx.flv.huya;
            live_proxy_set_header Host tx.flv.huya.com;
            live_proxy_set_header User-Agent SMS;

        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值