如何在 Rocky Linux 8.6 上配置并调优 Nginx 与 Lua 脚本,提升 API 网关的性能与并发处理能力

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

确保系统更新:

bash 复制代码
sudo dnf update -y
sudo reboot

安装基本依赖:

bash 复制代码
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 官方仓库

bash 复制代码
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

bash 复制代码
sudo dnf install openresty -y

验证版本:

bash 复制代码
openresty -v

回显示类似:

复制代码
nginx version: openresty/1.x.x

四、基础 Nginx + Lua API 网关配置

1. Nginx 主配置

编辑 /usr/local/openresty/nginx/conf/nginx.conf

nginx 复制代码
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)

安装依赖:

bash 复制代码
luarocks install lua-resty-jwt

脚本:

lua 复制代码
-- /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)

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)

lua 复制代码
-- 简单响应示例
ngx.header.content_type = "application/json"
ngx.say('{"status":"ok","message":"handled by lua"}')

六、性能调优

1. 操作系统级调优

编辑 /etc/sysctl.d/99-nginx.conf

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

使其生效:

bash 复制代码
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 {} 里开启:

nginx 复制代码
lua_code_cache on;

七、监控与指标采集

使用 Prometheus 导出器(如 ngx-lua-prometheus):

安装:

bash 复制代码
luarocks install lua-resty-prometheus

在配置中添加指标:

nginx 复制代码
init_by_lua_block {
    prometheus = require("resty.prometheus").init("prometheus_metrics", 1000000)
}
log_by_lua_block {
    prometheus:collect(ngx)
}

八、压力测试与性能评估

使用 wrk 进行基线测试:

bash 复制代码
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 脚本逻辑,可根据业务需要逐步构建复杂的网关功能。

相关推荐
Yana.nice18 小时前
Linux目录结构说明
linux
EndingCoder18 小时前
箭头函数和 this 绑定
linux·前端·javascript·typescript
食咗未18 小时前
Linux iptables工具的使用
linux·运维·服务器·驱动开发·网络协议·信息与通信
tech-share18 小时前
【无标题】IOMMU功能测试软件设计及实现 (二)
linux·架构·系统架构·gpu算力
时兮兮时18 小时前
Linux 服务器后台任务生存指南
linux·服务器·笔记
dz小伟18 小时前
从用户空间open()到驱动open()的完整调用链深度解析
linux
DeeplyMind18 小时前
第4章: MMU notifier内核实现机制
linux·驱动开发·mmu·mmu notifier
摸鱼仙人~18 小时前
RAG 系统中的 TOC Enhance:用“目录增强”提升检索与生成效果
linux·运维·服务器
xingzhemengyou118 小时前
Linux dmesg 查看系统启动日志
linux