跳转至

Nginx

Nginx 中的 Lua 协程

在 Nginx 中:

  1. 每个请求是一个协程:Nginx 为每个请求创建一个独立的 Lua 协程
  2. 定时器回调也是协程:当定时器触发时,Nginx 会为回调函数创建一个新的协程来执行它
  3. 协程隔离:这个协程独立于任何请求协程,有自己的执行上下文
  • 所有协程都运行在同一个线程
  • 一个 worker 进程通常绑定到一个 CPU 核心
  • 协程之间是协作式调度,不是抢占式

ngx.worker.id() 为 0 的是第一个 worker 进程,而不是 master 进程。Master 进程根本不参与请求处理,也不会执行 Lua 代码。

上游服务配置

upstream store {
    {{range service "store"}}server {{.Address}}:{{.Port}} max_fails=2 fail_timeout=2s;
    {{else}}server 127.0.0.1:65535 down; # force a 502{{end}}
    keepalive 200;
}
  • {{range service "store"}} 为 Consul 模板语法,动态遍历名为 store 的服务在 Consul 服务注册表中的所有实例。每个实例会生成一行 server 配置

    • server {{.Address}}:{{.Port}} 将服务的 ip 地址和端口填充到 Nginx 配置中,
    • max_fails=2 fail_timeout=2 表示 2 秒内若请求失败 2 次,标记该服务器为暂不可用;被标记为不可用后,两秒内不再分配请求给他,之后重新尝试
  • {{else}} 表示如果 consul 中没有发现任何 store 服务实例,则生成一个 强制返回 502 错误的备用配置

    • server 127.0.0.1:65535 down 表示指向本地无效端口,并标记为 down,确保 Nginx 直接返回 502 错误
  • keepalive 200

    启用与后端服务的长连接。200 表示每个 Nginx worker 最多保持 200 个空闲长连接

location /title/ {  # For HTTP API
    lua_code_cache on;
    access_by_lua_file /usr/local/openresty/lua/check.lua;
    log_by_lua_file /usr/local/openresty/lua/counter.lua;
    proxy_next_upstream off;
    proxy_pass http://title/title_svr/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $http_x_forwarded_for;
    proxy_set_header X-Real-IP $http_x_real_ip;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
}