【原文】http://leafo.net/lapis/reference/configuration.html

Lapis 可以通过运行不同的环境获取不同的配置。比如在开发环境,你需要连接本地的数据库,关闭缓存以及单线程。线上环境连接线上数据库,开启缓存,开启8个 worker

通过 Lapis 的命令行工具的第二个参数启动指定的环境:

1
$ lapis server [environment]

上面的 environment 默认是 development 。这个名称决定加载不同的配置。当然只有你创建了指定环境名称的配置之后你的相关的环境才会生效。

创建配置

Lapis 运行时加载的配置依赖 "config" 模块。这个 "config" 模块用于定义你各个环境中的配置。这是一个标准的 Lua/MoonScript 文件。

注意:如果没有找到 config 模块也不会报错,但是只有默认的配置可以使用。

1
2
3
4
5
6
7
8
9
10
11
local config = require("lapis.config")

config("development", {
port = 8080
})

config("production", {
port = 80,
num_workers = 4,
code_cache = "on"
})

我们可以使用 "lapis.config" 下的说明创建我们的配置。它有一套自己的语法。在上面的例子中,我们定义了两套配置,分别设置了它们的端口。

配置是一个普通的 table。但是需要使用特定的语法构建这个配置 table

当然我们也可以批量设置相同的配置:

1
2
3
config({"development", "production"}, {
session_name = "my_app_session"
})

访问嵌套 table 的语法 LuaMoonScript 存在一定的差异,后续会继续介绍。

构建配置

大多数的配置的 key 都是可以直接使用的,但是也有部分会有限制。哪些能用哪些不能用这取决于服务器。

注意:为了避免后期可能存在的冲突,配置的作用域尽量控制在一个项目内。

名称 描述 默认值 服务器
server 你代码运行的服务器 nginx/cqueues nginx Any
port 端口 8080 Any
bind_host 服务器接口 0.0.0.0 cqueues
secret 用于签名的字符串 please-change-me Any
hmac_digest 用于Hash, SHA1/SHA256 SHA1 Any
session_name session 名称 lapis_session Any
code_cache 缓存,关系性能 off Any
num_workers 进程数 1 nginx
logging 关闭的话 false 就可以,开启的话配置有点多是个 table 后续介绍 Any
max_request_args 控制请求参数的个数。可以参考 get_uri_args 里面的 max_args nil Any
measure_performance 性能指标收集 false Any
postgres postgres数据库连接配置 后面会介绍 Any
mysql mysql数据库配置 后面会介绍 Any

日志配置

日志配置的信息存放在全局配置的 logging 下的 table 里。当然如果这个值设置为 false 所有的日志将被禁用。

注意:这个配置仅是控制 Lapis 应用下面的。OpenResty 的日志还是在 nginx 配置文件中。

名称 描述 默认值 服务器
server 记录信息开始的服务器 true queues
queries 记录发送数据库的查询 true any
requests 记录每个请求的路径以及状态 true Any

对于 OpenResty 而言,所有的日志将会使用 OpenRestyprint 函数打印出所有的 notice 日志。默认的 notice 日志会存储到 Nginxerror 日志位置。

日志的写入标准将采用 Luaprint 函数的。

配置和Nginx

这些配置的值将会在编译 nginx.conf 文件时塞入配置中。可插入的 Nginx 配置变量不区分大小写。但是通常我们会用大写,因为在配置检查之前还有 Shell 环境检查。

比如,这是一个 LapisNginx 配置块:

1
2
3
events {
worker_connections ${{WORKER_CONNECTIONS}};
}

覆盖环境变量

你可以覆盖任意的环境变量。当然需要加变量全部大小,同时加上 LAPIS_ 前缀。比如,覆盖上面的 worker_connections 变量:

1
$ LAPIS_WORKER_CONNECTIONS=5 lapis server

这些配置变量就可以使用了。但是需要注意的是,这些都是字符串类型,在你使用的位置可能需要做一些类型强制转换。

获取应用中的配置

以下是获取配置 table 里数据的事例:

1
2
local config = require("lapis.config").get()
print(config.port) -- shows

环境的名称存储在 _name 中,获取方式为:

1
print(config._name) -- development, production, etc...

性能分析

如果 measure_performance 配置变量设置为 true 的话,Lapis 会对 action 进行计时、计数的行为。

数据会存储在 ngx.ctx.performance 中。以下字段的数据会被收集:

  • view_time – 渲染视图花费的时间
  • layout_time – 渲染布局花费的时间
  • db_time – 执行查询话费的时间
  • db_count – 执行查询的次数
  • http_time – 执行的 HTTP 请求的时间
  • http_count – 发送的 HTTP 请求的次数

如果一个请求中没有相应的指标数据的话,这个字段会被设置为 nil。最好是在它们请求结束以确保所有的数据是可用的。after_dispatch 可以确保是在请求进程结束时派上用场。

下面的这个例子中,在请求结束后会打印性能数据到日志中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
local lapis = require("lapis")
local after_dispatch = require("lapis.nginx.context").after_dispatch
local to_json = require("lapis.util").to_json

local config = require("lapis.config")

config("development", {
measure_performance = true
})


local app = lapis.Application()

app:before_filter(function(self)
after_dispatch(function()
print(to_json(ngx.ctx.performance))
end)
end)

-- ...

return app