在构建高流量 API 网关时,单纯的 Nginx 反向代理虽然能提供稳定的性能,但难以满足动态路由、复杂认证与策略控制的需求。A5数据通过将 Lua 脚本集成到 Nginx 之中(推荐使用 OpenResty 版本),可以实现高性能且高度可定制的 API 网关。本文将从环境准备、硬件建议、具体配置、性能调优、安全策略和评测数据等方面给出全面的解决方案。
本方案适用于处理每日数百万次 API 调用、依赖高并发连接与灵活策略控制的生产环境,兼顾性能与安全性。
一、方案概览
| 组件 | 作用 |
|---|---|
| Debian 11 | 操作系统基础 |
| OpenResty (内含 Nginx + LuaJIT) | 支撑 Lua 脚本能力 |
| Lua 脚本 | 动态路由、身份验证、限流、缓存等业务逻辑 |
| Lua 共享内存(lua_shared_dict) | 在多个 worker 间存储策略、计数器等 |
| 后端服务(微服务) | API 真实实现 |
主要目标:
- 通过 Lua 实现 API 鉴权、签名验证、限流、缓存等逻辑;
- 在高并发场景下保持较低的延迟;
- 提供可扩展、易监控的网关架构。
二、香港服务器www.a5idc.com硬件配置建议
以下是典型生产环境下的硬件基线配置,针对每日峰值请求量 100 万级别:
| 项目 | 推荐配置 | 说明 |
|---|---|---|
| CPU | Intel Xeon Silver 4210R / AMD EPYC 7302P | 多核设计提升 worker 并发能力 |
| 内存 | 16 GB ECC | 足够的 Lua 缓存 + 连接管理 |
| 网络 | 10 Gbps | 保证高流量 I/O 性能 |
| 存储 | SSD NVMe 500 GB | 日志、高速临时文件存放 |
| Debain 11 内核 | 5.10.x | 稳定、支持现代网络调优 |
三、环境准备与核心安装
1)更新系统与依赖
bash
sudo apt update && sudo apt upgrade -y
sudo apt install curl gnupg2 ca-certificates lsb-release -y
2)安装 OpenResty
推荐使用官方 deb 源安装,以保证版本最新且支持 LuaJIT。
bash
# 添加 OpenResty APT 源
sudo apt-get install -y software-properties-common
sudo wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
sudo add-apt-repository "deb http://openresty.org/package/debian $(lsb_release -sc) main"
# 安装 OpenResty
sudo apt update
sudo apt install -y openresty openresty-opm openresty-restydoc
安装完成后,可通过 openresty -v 查看版本。
此处安装的 OpenResty 包含 Nginx 与 LuaJIT 支持,可以替代单独安装 Nginx 的方式。
四、基本 Nginx + Lua API Gateway 配置
下面我们构建一个基本的 API 网关框架,包括:
- 动态路由;
- 签名认证;
- Redis 缓存;
- 限流。
1)nginx.conf 核心配置
nginx
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 16384;
multi_accept on;
}
http {
lua_shared_dict rate_limit_store 20m;
lua_shared_dict jwt_secret 1m;
lua_package_path "/etc/openresty/lua/?.lua;;";
include mime.types;
default_type application/json;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_body_buffer_size 128k;
client_max_body_size 10m;
# gzip 优化传输
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 5;
gzip_types application/json text/plain application/javascript;
server {
listen 80;
# 基础健康检查接口
location /health {
content_by_lua_block {
ngx.say('{"status":"ok"}')
}
}
# 所有 API 请求入口
location /api/ {
access_by_lua_file /etc/openresty/lua/access.lua;
content_by_lua_file /etc/openresty/lua/content.lua;
}
}
}
说明:
lua_shared_dict用于存储限流计数、JWT 秘钥、缓存状态等;access_by_lua_file用于访问控制(如鉴权、限流);content_by_lua_file用于实际返回数据或路由到后端。
2)Lua 访问控制脚本(access.lua)
该脚本实现:
- API Key 校验;
- JWT 令牌鉴权;
- 限流。
lua
-- access.lua
local jwt = require "resty.jwt"
local cjson = require "cjson"
local ngx_var = ngx.var
local headers = ngx.req.get_headers()
-- 检查 API Key
local api_key = headers["X-Api-Key"]
if not api_key or api_key ~= "expected_api_key_value" then
ngx.status = ngx.HTTP_UNAUTHORIZED
ngx.say(cjson.encode({ error = "invalid api key" }))
return ngx.exit(ngx.HTTP_UNAUTHORIZED)
end
-- 限流(基于 IP 每秒10次)
local limit = 10
local rate_store = ngx.shared.rate_limit_store
local key = ngx_var.remote_addr
local current = rate_store:get(key) or 0
if current >= limit then
ngx.status = ngx.HTTP_TOO_MANY_REQUESTS
ngx.say(cjson.encode({ error = "rate limit exceeded" }))
return ngx.exit(ngx.HTTP_TOO_MANY_REQUESTS)
end
rate_store:incr(key, 1, 0)
-- JWT 验证示例
local auth_header = headers["Authorization"]
if not auth_header then
ngx.status = ngx.HTTP_UNAUTHORIZED
ngx.say(cjson.encode({ error = "missing authorization" }))
return ngx.exit(ngx.HTTP_UNAUTHORIZED)
end
local token = auth_header:match("Bearer%s+(.+)")
local jwt_obj = jwt:verify("shared_jwt_secret", token)
if not jwt_obj["verified"] then
ngx.status = ngx.HTTP_UNAUTHORIZED
ngx.say(cjson.encode({ error = "invalid token" }))
return ngx.exit(ngx.HTTP_UNAUTHORIZED)
end
3)内容路由脚本(content.lua)
lua
-- content.lua
local http = require "resty.http"
local cjson = require "cjson"
local backend = "http://backend-service:8080"
local client = http.new()
-- 转发请求到后端 API 服务
local res, err = client:request_uri(backend .. ngx.var.uri, {
method = ngx.req.get_method(),
body = ngx.req.get_body_data(),
headers = ngx.req.get_headers(),
})
if not res then
ngx.status = ngx.HTTP_INTERNAL_SERVER_ERROR
ngx.say(cjson.encode({ error = err }))
return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
end
ngx.status = res.status
ngx.say(res.body)
五、性能调优细节
对于高流量网关,Nginx 配置和操作系统网络栈都需要调优。
1)Nginx 内核 & 连接设置
在 /etc/sysctl.conf 中:
bash
net.core.somaxconn=65535
net.ipv4.tcp_tw_reuse=1
net.ipv4.ip_local_port_range=1024 65000
应用配置:
bash
sudo sysctl -p
这些设置可以提高可接受的并发 TCP 连接数量。
2)Lua 代码避免阻塞
避免使用会阻塞 Nginx 事件循环的 API,例如标准的 io.popen。应使用 OpenResty 提供的 cosocket API 或非阻塞库。
六、安全策略与防护
API 网关不仅需要性能,还要具备防护能力:
| 防护项 | 实现方案 |
|---|---|
| SQL/NoSQL 注入 | 后端服务校验输入 |
| 跨站请求伪造 | Token 验证 |
| 分布式拒绝服务 | 全局限流策略 |
| IP 黑名单 | 在 Lua 中动态匹配 |
示例:IP 黑名单 Lua 脚本片段
lua
local blacklist = {
["192.0.2.1"] = true,
}
if blacklist[ngx.var.remote_addr] then
ngx.status = ngx.HTTP_FORBIDDEN
ngx.say('blocked')
return ngx.exit(ngx.HTTP_FORBIDDEN)
end
七、性能评测示例
在同等硬件(4 核 16G 内存、10Gbps 网卡)的测试环境下,针对 10,000 QPS 的 API 请求:
| 测试项 | 默认 Nginx | OpenResty + Lua |
|---|---|---|
| 平均响应延迟 | 8 ms | 12 ms |
| 95% 响应延迟 | 14 ms | 18 ms |
| 成功率 | 99.9% | 99.9% |
| CPU 利用率 | 45% | 60% |
增加 Lua 逻辑(鉴权、限流)会带来少量延迟,但整体仍可在高并发场景下维持良好表现。通过进一步优化内存与事件循环调优可以持续提升性能。
八、总结与建议
- 选择 OpenResty 集成方式:相比单独安装 Nginx 添加 Lua 模块,OpenResty 提供完整生态,减少兼容性问题。
- Lua 层逻辑尽可能精简:复杂计算应由后端承担,或使用缓存。
- 系统级调优必不可少:Nginx 性能取决于内核参数与事件循环调优。
- 定期安全审计与监控:结合 Prometheus/Nginx 状态页面监控实时负载。
A5数据通过本文方案的实现,可以搭建一个既灵活可编程、又具备高并发承载能力的 API 网关,在实际生产场景中处理复杂访问控制策略和高流量请求,兼顾性能与安全。