文章目录
  1. 1. Lua 入门
  2. 2. Nginx
  3. 3. LuaNginxModule
  4. 4. 火焰图
  5. 5. 传送门

「OpenResty最佳实践」读书记录

Lua 入门

  • if/else

    没有括号,所以elseif需要连起来写,如果中间带空格,就成了else内嵌套另外一个if了。

  • while/for/repeat

    break但无continue。 没有do-while,提供repeat,但方式是相反的。 for模板:

    1
    2
    3
    for var = begin, finish, step do
    -- body
    end

  • 函数

    允许函数返回多个值

  • Table库

    不要在 Lua 的 table 中使用 nil 值,如果一个元素要删除,直接 remove,不要用 nil 去代替。

  • 作用域

    局部变量的作用域仅限于声明它的块(block)而非如jsfunction

  • 调用代码前先定义函数

Nginx

  • nginx.conf

    1
    2
    3
    4
    5
    6
    worker_process # 表示工作进程的数量,一般设置为CPU的核数
    worker_connections # 表示每个工作进程的最大连接数
    server {} # 定义虚拟主机
    listen # 监听端口
    server_name # 监听域名
    location {} # 为匹配的URI进行配置

  • rewrite语法

    • last – 基本上都用这个 Flag
    • break – 中止 Rewirte,不再继续匹配
    • redirect – 返回临时重定向的 HTTP 状态 302
    • permanent – 返回永久重定向的 HTTP 状态 301
  • 判断表达式

    -f 和 !-f 用来判断是否存在文件 -d 和 !-d 用来判断是否存在目录 -e 和 !-e 用来判断是否存在文件或目录 -x 和 !-x 用来判断文件是否可执行

  • 全局变量

    例:http://localhost:88/test1/test2/test.php?k=v

    1
    2
    3
    4
    5
    6
    $host:localhost
    $server_port:88
    $request_uri:/test1/test2/test.php?k=v
    $document_uri:/test1/test2/test.php
    $document_root:D:\nginx/html
    $request_filename:D:\nginx/html/test1/test2/test.php

  • 防盗链

    1
    2
    3
    4
    5
    6
    location ~* \.(gif|jpg|swf)$ {
    valid_referers none blocked static.xxx.com asset.xxx.com;
    if ($invalid_referer) {
    rewrite ^/ http://$host/logo.png;
    }
    }

  • 开启gzip

  • 日志格式变量

    字段 作用
    $remote_addr$http_x_forwarded_for 记录客户端IP地址
    $remote_user 记录客户端用户名称
    $request 记录请求的URI和HTTP协议
    $status 记录请求状态
    $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小
    $bytes_sent 发送给客户端的总字节数
    $connection 连接的序列号
    $connection_requests 当前通过一个连接获得的请求数量
    $msec 日志写入时间。单位为秒,精度是毫秒
    $pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”
    $http_referer 记录从哪个页面链接访问过来的
    $http_user_agent 记录客户端浏览器相关信息
    $request_length 请求的长度(包括请求行,请求头和请求正文)
    $request_time 请求处理时间,单位为秒,精度毫秒
    $time_iso8601 ISO8601标准格式下的本地时间
    $time_local 记录访问时间与时区
  • 安装

Fedora25

1
2
3
sudo dnf -y install 'dnf-command(copr)'
sudo dnf -y copr enable openresty/openresty
sudo dnf -y install openresty

LuaNginxModule

  • 变量的共享范围

    建议不要使用模块中的全局变量,最好使用 ngx.ctx 或 shared dict 替代

  • 动态限速

    在 OpenResty 里面选择使用库的时候,有一个基本的原则:尽量使用 OpenResty 的库函数,尽量不用 Lua 的库函数,因为 Lua 的库都是同步阻塞的。

火焰图

1
sudo apt-get -y install systemtap

这里下载至系统相对应的包。如:

1
uname -r

返回的是4.4.0-64-generic,下载的包为linux-image-4.4.0-64-generic-dbgsym_4.4.0-64.85_amd64.ddeb

测试下是否OK

1
stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'

如果能打印出read performed,则表示正常。

找出nginx的进程ID

1
ps -ef |grep nginx | grep worker

比如为:19654,下面用到。

1
2
3
4
5
git clone https://github.com/openresty/openresty-systemtap-toolkit.git
cd openresty-systemtap-toolkit
sudo ./ngx-sample-lua-bt -p 19654 --luajit20 -t 5 > /tmp/tmp.bt # 探测时间为5秒。
./stackcollapse-stap.pl /tmp/flame.bt > /tmp/flame.cbt
./flamegraph.pl /tmp/flame.cbt > /tmp/flame.svg

在浏览器中打开/tmp/flame.svg即可看到。 注意:如果在上面的探测时间(如5秒)内worker进程没有请求业务,则为空,不会生成火焰图。

传送门

文章目录
  1. 1. Lua 入门
  2. 2. Nginx
  3. 3. LuaNginxModule
  4. 4. 火焰图
  5. 5. 传送门