「OpenResty最佳实践」读书记录
更新日期:
「OpenResty最佳实践」读书记录
Lua 入门
-
if/else
没有括号,所以
elseif
需要连起来写,如果中间带空格,就成了else
内嵌套另外一个if
了。 -
while/for/repeat
有
break
但无continue
。 没有do-while
,提供repeat
,但方式是相反的。for
模板:123for var = begin, finish, step do-- bodyend -
函数
允许函数返回多个值
-
Table库
不要在 Lua 的 table 中使用 nil 值,如果一个元素要删除,直接 remove,不要用 nil 去代替。
-
作用域
局部变量的作用域仅限于声明它的块(block)而非如
js
的function
。 -
调用代码前先定义函数
Nginx
-
nginx.conf
123456worker_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
123456$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 -
防盗链
123456location ~* \.(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
LuaNginxModule
-
变量的共享范围
建议不要使用模块中的全局变量,最好使用 ngx.ctx 或 shared dict 替代
-
动态限速
在 OpenResty 里面选择使用库的时候,有一个基本的原则:尽量使用 OpenResty 的库函数,尽量不用 Lua 的库函数,因为 Lua 的库都是同步阻塞的。
火焰图
从这里下载至系统相对应的包。如:
返回的是4.4.0-64-generic
,下载的包为linux-image-4.4.0-64-generic-dbgsym_4.4.0-64.85_amd64.ddeb
。
测试下是否OK
如果能打印出read performed
,则表示正常。
找出nginx的进程ID
比如为:19654,下面用到。
在浏览器中打开/tmp/flame.svg
即可看到。
注意:如果在上面的探测时间(如5秒)内worker
进程没有请求业务,则为空,不会生成火焰图。