Tengine与OpenResty

Tengine与OpenResty均为nginx的二次开发版本,主要核心区别如下:

特性 Tengine OpenResty Nginx
负载均衡 增强型算法,动态上游,主动健康检查 依赖第三方模块或 Lua 脚本实现 基础算法,需额外配置
动态编程 支持 Lua 模块 深度集成 LuaJIT,原生支持 需额外编译 Lua 模块
模块生态 内置大量实用模块 丰富的 Lua 库生态 庞大的第三方 C 模块生态
运维特性 动态模块,热补丁,完善监控 热重载,动态配置 基础配置,需手动调整
适用场景 超大规模网站,高并发流量 API 网关,边缘计算,复杂业务逻辑 通用 Web 服务器,反向代理

一、Tengine的使用

1.Tengine 源码安装

(1)前置环境准备

bash 复制代码
# 安装编译工具和依赖库
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel wget

(2)下载并解压 Tengine 源码

bash 复制代码
# 下载源码包
wget https://tengine.taobao.org/download/tengine-2.4.0.tar.gz

# 解压
tar -zxvf tengine-2.4.0.tar.gz
cd tengine-2.4.0

(3)配置编译参数

bash 复制代码
./configure \
--prefix=/usr/local/tengine \    # Tengine安装根目录(核心,后续所有文件都在这)
--with-http_gzip_static_module \ # 预压缩静态资源,Tengine直接返回压缩包,减少CPU消耗
--with-http_sub_module \         # 支持请求/响应头替换(如修改后端返回的URL、状态码)
--with-http_stub_status_module \ # 开启Tengine基础状态监控(连接数、请求数、活跃进程)
--with-http_ssl_module \         # 开启HTTPS/SSL,支持443端口负载均衡(生产环境强制)
--with-stream \                  # 开启四层负载均衡(TCP/UDP,如转发MySQL/Redis/端口)
--with-stream_ssl_module \       # 四层负载均衡的SSL支持(如MySQL SSL、Redis SSL)

# 编译并安装(-j后接CPU核心数,加速编译)
make -j4 && make install

(4)配置系统服务(开机自启)

bash 复制代码
cat > /usr/lib/systemd/system/tengine.service << EOF
[Unit]
Description=Tengine Web Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/tengine/logs/nginx.pid  # PID文件路径,和安装目录对应
ExecStart=/usr/local/tengine/sbin/nginx    # 启动命令
ExecReload=/usr/local/tengine/sbin/nginx -s reload  # 重载配置
ExecStop=/usr/local/tengine/sbin/nginx -s quit      # 优雅停止
PrivateTmp=true
User=root          # master进程建议用root运行(绑定80/443端口需要root)
Group=root

[Install]
WantedBy=multi-user.target
EOF

# 重载服务配置,设置开机自启
systemctl daemon-reload
systemctl enable tengine --now

# 验证安装
/usr/local/tengine/sbin/nginx -v
# 输出:Tengine version: Tengine/2.4.0 (nginx/1.22.1) 即为成功

2.Tengine 负载均衡核心配置

Tengine 相比原生 Nginx,新增了主动健康检查、动态上游、VNSWRR 算法等核心能力,以下是最常用的 3 种负载均衡配置示例:

(1)基础配置:加权轮询 + 主动健康检查

编辑 Tengine 主配置文件/usr/local/tengine/conf/nginx.conf

bash 复制代码
# 全局块:自动匹配CPU核心数,充分利用多核性能
worker_processes auto;
# 错误日志:排查问题用,info级别足够,路径为Tengine安装目录下的logs
error_log  logs/error.log  info;

# events块:Linux高并发必配配置,强制必开
events {
    use epoll;                # Linux专属高性能I/O模型,大幅提升并发处理能力
    worker_connections  1024; # 单个工作进程最大并发连接数,基础场景足够
    multi_accept on;          # 允许单进程同时接受多个新连接,减少连接延迟
}

# http全局配置块:所有HTTP相关配置都在此处
http {
    include       mime.types; # 引入MIME类型映射,让Tengine识别文件类型(如js/png)
    default_type  application/octet-stream; # 未知文件类型默认按下载处理
    sendfile        on;        # 开启零拷贝技术,提升静态资源处理性能,减少CPU开销
    keepalive_timeout  65;     # 客户端与Tengine的TCP长连接保持时间,60-120秒为宜
    server_tokens off;         # 隐藏Tengine版本号,防止黑客针对性攻击,生产必开

    # 反向代理缓冲优化:避免慢客户端(低网速)拖慢后端服务器,生产必配
    proxy_buffering on;
    proxy_buffer_size 4k;      # 单个连接的响应头缓冲大小,匹配系统内存页
    proxy_buffers 8 4k;        # 响应体缓冲池,总大小32k,基础场景足够
    proxy_busy_buffers_size 8k;# 缓冲池满时的繁忙缓冲上限,一般为buffer_size的2倍

    # 负载均衡服务器池:定义后端所有业务服务器,名称与proxy_pass一致
    upstream my_backend {
        server 192.168.10.172:8080; # 后端服务器1:8080端口服务
        server 192.168.10.181:8080; # 后端服务器2:8080端口服务
        # 健康检查说明:3秒检测1次,连续2次成功则可用,连续3次失败则自动剔除
        keepalive 32;         # Tengine与后端的长连接数,减少TCP握手开销,20-50为宜
    }

    # 虚拟主机:监听80端口,绑定Tengine服务器IP,处理前端所有请求
    server {
        listen       80;
        server_name  192.168.10.171; # 你的Tengine服务器IP,可加域名(如www.xxx.com)

        # 所有前端请求:反向代理到后端服务器池,核心转发逻辑
        location / {
            proxy_pass http://my_backend; # 转发到定义的服务器池,名称必须完全一致

            # 反向代理请求头:让后端服务器能获取客户端真实IP/请求协议,生产必配
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr; # 客户端真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 多层代理时的真实IP
            proxy_set_header X-Forwarded-Proto $scheme; # 请求协议(http/https)

            # 代理超时配置:避免后端无响应导致Tengine连接泄漏,生产必配
            proxy_connect_timeout 30s; # Tengine与后端建立连接的超时时间
            proxy_send_timeout 30s;    # Tengine向后端发送请求数据的超时时间
            proxy_read_timeout 30s;    # Tengine从后端读取响应数据的超时时间
        }
    }
}

(2)进阶配置:一致性哈希(会话保持)

若需要会话粘滞(同一用户请求固定到同一后端节点),修改upstream块:

bash 复制代码
upstream backend_servers {
    # 一致性哈希算法(基于客户端IP)
    ip_hash;  # 简单版:基于IP哈希
    # 或Tengine增强版:一致性哈希(支持动态节点)
    # consistent_hash $remote_addr;

    server 192.168.1.100:80 weight=5;
    server 192.168.1.101:80 weight=3;
    server 192.168.1.102:80 backup;

    # 保留健康检查配置
    check interval=3000 rise=2 fall=3 timeout=2000 type=http;
}

(3)动态上游配置(无需重启 Tengine)

Tengine 支持动态修改上游节点(增删后端服务器),无需重启服务:

bash 复制代码
# 1. 开启动态上游模块(编译时已开启,配置文件中添加)
# 在http块中添加:
dynamic_upstream_module;

# 2. 通过命令动态添加节点
/usr/local/tengine/sbin/nginx -s reload -c /usr/local/tengine/conf/nginx.conf \
--add-upstream=backend_servers --server=192.168.1.103:80 --weight=4

# 3. 动态删除节点
/usr/local/tengine/sbin/nginx -s reload -c /usr/local/tengine/conf/nginx.conf \
--del-upstream=backend_servers --server=192.168.1.102:80

(4)配置生效与验证

bash 复制代码
# 检查配置语法
/usr/local/tengine/sbin/nginx -t

# 重载配置(无停机)
systemctl reload tengine

# 验证负载均衡状态
curl http://127.0.0.1/tengine_status
# 输出会包含:活跃连接数、后端节点健康状态、请求分发统计等

关键配置说明:

  • 主动健康检查check指令是 Tengine 核心优势,相比 Nginx 原生的被动健康检查(仅检测连接失败),能主动发送请求验证后端服务可用性,避免将请求转发到 "假活" 节点。
  • VNSWRR 算法:Tengine 优化的加权轮询算法,在后端节点数超过 100 个时,CPU 消耗比原生 Nginx 的 WRR 算法低 30% 以上,适合大规模集群。
  • 动态上游:无需重启 Tengine 即可增删后端节点,是运维大规模集群的核心便利特性,原生 Nginx 需修改配置并 reload(虽无停机,但仍有配置解析开销)。
相关推荐
曹天骄2 小时前
OpenResty 源站安全隔离设计在边缘计算架构中的工程实践
安全·边缘计算·openresty
快乐肚皮5 天前
OpenResty:Nginx的进化之路
nginx·junit·openresty
landonVM7 天前
OpenResty 的性能优化配置建议
性能优化·openresty
我发在否16 天前
OpenResty > Lua断点调试
vscode·lua·断点·openresty·luapanda
oMcLin22 天前
如何在 CentOS 7 上通过配置和调优 OpenResty,提升高并发 Web 应用的 API 请求处理能力?
前端·centos·openresty
笑笑�1 个月前
OpenResty + nginx_upstream_check_module 构建主动健康检查模块
运维·nginx·负载均衡·openresty
Wang's Blog1 个月前
Lua: Web应用开发之OpenResty与Lapis框架深度指南
lua·openresty
驯龙高手_追风1 个月前
OpenResty+NtripCaster实现挂载点负载均衡使用初探
junit·负载均衡·openresty
秃了也弱了。1 个月前
OpenResty+redis实现基于ip的代理层灰度发布
redis·tcp/ip·openresty