配置及环境

Lapis 被设计于依据不同环境载入不同的配置来运行服务器。例如,可能您开发环境的配置设置为本地数据库的URL,禁用代码缓存和单个worker。然后,您生产环境的配置可能设定为远程数据库的 URL,启用代码缓存和8个worker

当启动服务器时,lapis 命令行工具接受第二个参数:

$ lapis server [environment] 

默认情况下,环境是development。环境名称仅影响加载的配置。如果你没有任何配置,这绝对没有效果,所以让我们创建一些。

创建配置

每当 Lapis 执行依赖于配置的代码时,它会尝试加载 config 模块。 config 模块是我们定义环境特定的变量的地方。它是一个标准的 Lua/MoonScript 文件,所以让我们创建它。

如果未找到 config 模块,则不会抛出错误,此时则会使用默认的配置。

local config = require("lapis.config")

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

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

我们使用 lapis.config 中提供的配置助手来创建我们的配置。在上面的例子中,我们定义了两个配置,并为每个配置设置端口。

配置只是一个简单的表。使用上面的特殊构建器语法构建配置表。

我们可以通过传递环境名称的数组表 来一次 配置多个环境:

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

配置文件对于访问组合嵌套的表有着不错的语法。 MoonScriptLua 都有自己的变体,有关语法的更多细节,请查看相应的指南。[lua配置语法]()

配置和Nginx

编译 nginx.conf 时使用配置中的值。插入的Nginx配置变量不区分大小写。它们通常以所有大写形式编写,因为在检查配置之前会先检查 shell 的环境是否有值。

例如,这里有一个 Lapis Nginx 的配置块:

events {
  worker_connections ${{WORKER_CONNECTIONS}};
}

编译时,首先检查环境变量 LAPIS_WORKER_CONNECTIONS。如果它没有值,那么将检查当前环境的配置的 worker_connections

在应用程序中访问配置

该配置也可在应用程序中使用。我们可以像下面这样来访问配置表:

local config = require("lapis.config").get()
print(config.port) 

当前环境的名称存储在 _name 中。

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

默认配置

所有配置都有一些默认值,下面这些是他们在表中的语法:

default_config = {
  port = "8080",
  secret = "please-change-me",
  session_name = "lapis_session",
  num_workers = "1",
  logging = {
    queries = true,
    requests = true
  }
}

可用配置

虽然大多数配置键是随意使用的,但是有一些名称是被保留用于配置 Lapis 和支持库。这里是他们的列表:

portnumber) - Nginx 的端口,在nginx.conf 中默认定义

num_workersnumber) - Nginx 启动的work数,在 nginx.conf 中默认定义

session_namestring) - 将存储会话的 cookie 的名称

secretstring) - encode_with_secret使用的秘密密钥,也用于签署会话
cookie

measure_performancebool) - 用于启用性能时间和查询跟踪

loggingtable) - 配置要记录到控制台或日志文件的事件

配置日志

logging 配置键可用于禁用 Lapis 默认情况下执行的各种日志记录。logging配置的默认值为:

{
  queries = true,
  requests = true
}

所有日志都使用 OpenResty 提供的 print 函数 对 Nginxnotice 日志进行记录。默认 notice 日志记录位置设置为 stderr ,在默认的 Lapis Nginx 配置中指定。它可以使用 error_log 指令进行配置。

性能测量

如果 measure_performance 配置值设置为 trueLapis 可以收集各种操作的计时和计数。

这些数据存储在 ngx.ctx.performance 中。在以下字段将被收集到表中:

view_time - 呈现视图所用的时间(以秒为单位)

layout_time - 呈现布局所用的时间(以秒为单位)

db_time - 执行查询所花费的时间(以秒为单位)

db_count - 执行的查询数

http_time - 执行 HTTP 请求所花费的时间(以秒为单位)

http_count - 发送的 HTTP 请求数

如果在请求中未执行相应的操作,则字段将为 nil。这些字段在请求过程中填写,因此最好只在请求结束时访问它们,以确保所有数据可用。 after_dispatch 助手可以用来注册一个函数,以便在请求处理的最后阶段运行。

在此示例中,性能数据在每个请求结束时打印到日志中:

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

youyu岁月
489 声望45 粉丝

不要用执行上的勤奋来掩盖思考上的懒惰