A5IDC本文提供一套可落地的高性能 API 网关解决方案,在 Rocky Linux 8.6 上构建基于 Nginx + Lua 的动态请求处理服务,该服务支持认证、限流、路由、缓存等功能,并通过调优达到高并发能力。文章包含具体产品参数、系统调优方法、代码示例以及性能评估数据。
一、方案概览与组件选择
1. 方案组成
| 组件 | 作用 | |
|---|---|---|
| Rocky Linux 8.6 | 操作系统,稳定企业级发行版 | |
| OpenResty | 内嵌 Nginx + LuaJIT,推荐用于高性能 Lua 扩展 | |
| lua-resty-* 系列 | Lua 库,提供限流、JWT、缓存等扩展能力 | |
| Redis | 外部状态存储,用于分布式限流和缓存 | |
| Prometheus / Grafana | 性能监控与可视化 |
2. 目标性能指标(设计值)
| 指标 | 说明 | 目标 |
|---|---|---|
| 并发连接数 | Nginx 同时处理的 TCP 连接数 | ≥ 100,000 |
| QPS(请求/秒) | API 端点峰值承载 | ≥ 30,000 |
| P99 响应延迟 | 响应时间的 99% 百分位 | < 50 ms |
| 认证处理逻辑执行时间 | Lua 代码执行时间 | < 2 ms |
二、环境准备
1. 服务器www.a5idc.com硬件配置建议
| 项 | 建议配置 |
|---|---|
| CPU | 16 核 Intel Xeon 或同等 AMD EPYC |
| 内存 | 32 GB DDR4 |
| 网络 | 10 Gbps 以太网 |
| 存储 | SSD NVMe 500 GB |
高并发场景下,CPU 核数、网络带宽和内存直接影响 Nginx 的工作能力。
2. 安装 Rocky Linux 8.6
确保系统更新:
sudo dnf update -y
sudo reboot
安装基本依赖:
sudo dnf groupinstall "Development Tools" -y
sudo dnf install epel-release -y
sudo dnf install redis unzip git wget -y
三、部署 OpenResty(包含 Nginx + LuaJIT)
相比直接安装 Nginx,自行编译 Lua 模块复杂,推荐使用 OpenResty,它内置 Nginx、LuaJIT 和常用 Lua 模块。
1. 添加 OpenResty 官方仓库
cat <<EOF | sudo tee /etc/yum.repos.d/openresty.repo
[openresty]
name=OpenResty Repository
baseurl=https://openresty.org/package/rocky/8/x86_64/
gpgcheck=1
gpgkey=https://openresty.org/package/pubkey.gpg
enabled=1
EOF
2. 安装 OpenResty
sudo dnf install openresty -y
验证版本:
openresty -v
回显示类似:
nginx version: openresty/1.x.x
四、基础 Nginx + Lua API 网关配置
1. Nginx 主配置
编辑 /usr/local/openresty/nginx/conf/nginx.conf:
worker_processes auto;
worker_rlimit_nofile 200000;
events {
worker_connections 32768;
multi_accept on;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
client_body_timeout 10;
client_header_timeout 10;
send_timeout 10;
lua_shared_dict rate_limit_store 50m;
lua_shared_dict jwt_pubkeys 20m;
# Lua package search path
lua_package_path "/usr/local/openresty/lualib/?.lua;;";
upstream backend_pool {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
server {
listen 80 backlog=65536;
location /api/ {
access_by_lua_file /etc/openresty/lua/access.lua;
content_by_lua_file /etc/openresty/lua/content.lua;
proxy_pass http://backend_pool;
}
}
}
五、Lua 脚本实现核心功能
1. JWT 认证脚本(access.lua)
安装依赖:
luarocks install lua-resty-jwt
脚本:
-- /etc/openresty/lua/access.lua
local jwt = require "resty.jwt"
local headers = ngx.req.get_headers()
local auth = headers["Authorization"]
if not auth then
ngx.status = ngx.HTTP_UNAUTHORIZED
ngx.say("Authorization required")
return ngx.exit(ngx.HTTP_UNAUTHORIZED)
end
local token = string.gsub(auth, "Bearer ", "")
local jwt_obj = jwt:verify("your_jwt_secret", token)
if not jwt_obj.verified then
ngx.status = ngx.HTTP_UNAUTHORIZED
ngx.say("Invalid Token")
return ngx.exit(ngx.HTTP_UNAUTHORIZED)
end
2. 限流逻辑(同 access.lua)
local dict = ngx.shared.rate_limit_store
local ip = ngx.var.remote_addr
local reqs, _ = dict:get(ip)
if reqs and reqs > 100 then -- 每分钟限制 100 请求
ngx.status = ngx.HTTP_TOO_MANY_REQUESTS
ngx.say("Rate Limit Exceeded")
return ngx.exit(ngx.HTTP_TOO_MANY_REQUESTS)
else
dict:incr(ip, 1, 0, 60)
end
3. 自定义内容处理(content.lua)
-- 简单响应示例
ngx.header.content_type = "application/json"
ngx.say('{"status":"ok","message":"handled by lua"}')
六、性能调优
1. 操作系统级调优
编辑 /etc/sysctl.d/99-nginx.conf:
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.ip_local_port_range=1024 65535
net.ipv4.tcp_tw_reuse=1
使其生效:
sudo sysctl --system
2. Nginx 层优化
| 调优项 | 建议值 | 说明 |
|---|---|---|
| worker_processes | auto | 使 Nginx 根据 CPU 核自动设定 |
| worker_connections | 32768 | 单 worker 最大连接 |
| tcp_nopush/tcp_nodelay | on | 提升网络 I/O 性能 |
| lua_code_cache | on | 避免 Lua 在生产中反复编译 |
在 http {} 里开启:
lua_code_cache on;
七、监控与指标采集
使用 Prometheus 导出器(如 ngx-lua-prometheus):
安装:
luarocks install lua-resty-prometheus
在配置中添加指标:
init_by_lua_block {
prometheus = require("resty.prometheus").init("prometheus_metrics", 1000000)
}
log_by_lua_block {
prometheus:collect(ngx)
}
八、压力测试与性能评估
使用 wrk 进行基线测试:
wrk -t12 -c10000 -d60s http://your-server/api/test
| 并发线程 | 并发连接 | 平均延迟 | 请求数 | 错误率 |
|---|---|---|---|---|
| 12 | 10,000 | ~30ms | ~1.8M | < 0.1% |
| 24 | 20,000 | ~45ms | ~3.2M | < 0.5% |
上表仅为示例,实际结果取决于后端服务性能、硬件及网络环境。
九、扩展功能建议
1. LRU 缓存实现
结合 lua-resty-lrucache 提升对热点数据的响应速度。
2. 分布式限流
将限流状态放入 Redis,多个网关实例共享限流数据。
十、总结
A5IDC通过使用 OpenResty + Nginx + Lua,在 Rocky Linux 8.6 上构建高性能 API 网关是可行且高效的。本文包含从安装部署、Lua 脚本编写、系统与 Nginx 调优到压力测试的完整流程与性能参数,适合用于线上高并发场景。利用 Lua 脚本的灵活性,可以在网关层实现认证、限流、动态路由、缓存等功能,使架构更轻量且具备高扩展能力。 ([Medium][1
如需结合具体业务(如 OAuth2、JWT 黑名单、分级限流等),可进一步拓展 Lua 脚本逻辑,可根据业务需要逐步构建复杂的网关功能。
1598

被折叠的 条评论
为什么被折叠?



