告别 Nginx 假死!Tengine 一键离线安装脚本 + 主动健康检查(附源码)

内网部署的痛,懂的都懂

作为一名运维或后端开发,最怕听到的一句话是什么?

“服务器在内网,不通外网,不能用 yum/apt,你去装个 Nginx 吧。”

哪怕是老手,面对离线环境的依赖缺失、GCC 版本不兼容、OpenSSL 库冲突,心态也容易崩。而且,普通的 Nginx 原生并不支持 “主动健康检查”(Active Health Check),当后端某个节点挂了,Nginx 往往要等到请求报错才能发现,导致用户体验受损。

今天,给大家分享一个生产级的解决方案:

Tengine 一键离线安装脚本(集成主动健康检查模块)

不仅彻底解决离线编译的繁琐,更开启了 Tengine 强大的后端“自愈”能力。


为什么要用 Tengine?

Tengine 是由淘宝发起的 Web 服务器项目。对于需要高可用的业务场景,它比原版 Nginx 多了一个杀手级功能:ngx_http_upstream_check_module

  • Nginx 原生: 被动检查。请求转发过去,报错了才知道节点挂了。
  • Tengine: 主动检查。定期发送心跳包探测后端,发现故障自动剔除,恢复后自动上线。

第一步:准备安装包

为了实现完全离线安装,我们需要按特定结构整理好安装包。
安装包:

百度网盘:
通过网盘分享的文件:install-tengine.zip
链接: https://pan.baidu.com/s/1pnUtSzRlA7XUZS8m1MjSFw?pwd=8888 提取码: 8888 复制这段内容后打开百度网盘手机App,操作更方便哦 
--来自百度网盘超级会员v9的分享

备用下载地址:
https://pan.alianga.com/s/48sO
提取码:alianga.com

脚本预设的目录结构如下:

/root/tengine-install/         # 你的工作目录
├── install-nginx.sh           # 一键安装脚本
├── tengine-3.1.0.tar.gz       # 主程序包
└── plugins/                   # 依赖插件目录
    ├── openssl-1.1.1v.tar.gz  # 必须是 1.1.1v (脚本指定)
    ├── pcre-8.42.tar.gz
    └── zlib-1.2.11.tar.gz

提示:脚本会自动解压 plugins 目录下的所有 .tar.gz 文件,请确保文件名与脚本中定义的版本变量一致。


第二步:一键安装脚本(核心脚本)

这是根据 Tengine 3.1.0 优化的脚本。它会自动编译 PCRE、OpenSSL (1.1.1v)、Zlib,并集成 ngx_http_upstream_check_module 模块。

新建文件 install-nginx.sh,粘贴以下内容:

#!/usr/bin/env bash
# ==================================================
# Tengine 3.1.0 Offline Installer
# ==================================================

# --- 1. 配置区域 ---
# Nginx 安装路径,根据实际要求进行修改
nginx_install_path=/opt/tengine
# 脚本及源码包所在路径
set_up_home=`pwd`
nginx_name=tengine-3.1.0

# --- 2. 准备工作 ---
echo -e "\033[32m[+] 开始解压 Tengine 主程序...\033[0m"
tar -zxvf "$nginx_name".tar.gz

echo -e "\033[32m[+] 准备依赖包...\033[0m"
cd $nginx_name
# 将外部 plugins 目录拷贝到解压后的 tengine 目录中
cp -a "$set_up_home/plugins" .

# 解压所有插件
cd plugins
ls *.tar.gz | xargs -n1 tar xzvf

# --- 3. 编译安装 PCRE ---
cd pcre-8.42
echo -e "\033[32m[+] 开始编译 pcre-8.42 ...\033[0m"
./configure
echo -e "install pcre complete !"
sleep 1s
cd ..

# --- 4. 编译安装 OpenSSL ---
# 指定 OpenSSL 版本
openssl_dir=openssl-1.1.1v
cd "$openssl_dir"
echo -e "\033[32m[+] 开始配置 openssl ($openssl_dir) ...\033[0m"
./config shared zlib
make depend
echo -e "install openssl complete!"
sleep 1s
cd ..

# --- 5. 编译安装 Zlib ---
echo -e "\033[32m[+] 开始配置 zlib-1.2.11 ...\033[0m"
cd zlib-1.2.11
./configure
echo "install zlib complete!"
sleep 1s
cd ..

# --- 6. 编译安装 Tengine ---
# 返回源码根目录
cd $set_up_home/$nginx_name

echo -e "\033[32m[+] 开始编译安装 Tengine (集成健康检查模块) ...\033[0m"
./configure \
  --prefix=$nginx_install_path \
  --with-http_stub_status_module \
  --with-http_ssl_module \
  --with-pcre=$set_up_home/$nginx_name/plugins/pcre-8.42 \
  --with-openssl=$set_up_home/$nginx_name/plugins/$openssl_dir \
  --with-zlib=$set_up_home/$nginx_name/plugins/zlib-1.2.11 \
  --add-module=$set_up_home/$nginx_name/modules/ngx_http_upstream_check_module \
  --with-ipv6 \
  --with-stream \
  --with-stream_ssl_module \
  --with-compat \
  --with-http_auth_request_module \
  --with-http_dav_module \
  --with-stream_ssl_preread_module

echo "begin to install nginx..."
make && make install

# --- 7. 验证安装 ---
echo -e "\033[32m[SUCCESS] 安装完成!版本信息如下:\033[0m"
$nginx_install_path/sbin/nginx -v

# 软连接(可选,取消注释以启用)
# ln -s $nginx_install_path/sbin/nginx /usr/bin/nginx

执行安装:

chmod +x install-nginx.sh
./install-nginx.sh

如果看到类似下面的输出,恭喜你,安装成功!🎉

install complete! the nginx version is:
Tengine version: Tengine/3.1.0
nginx version: nginx/1.24.0

第三步:配置“主动健康检查”

Tengine 相比 Nginx 原生版,最大的优势之一就是自带 ngx_http_upstream_check_module

它不像 Nginx 那样“撞了南墙才知道回头”(请求失败才切换),而是定期主动发送心跳包去问后端:“兄弟,你还活着吗?”

1. 修改 nginx.conf

编辑配置文件 /opt/tengine/conf/nginx.conf

http {
    # ... 其他配置 ...

    # 定义后端服务器组
    upstream my_backend_pool {
        server 192.168.1.101:80;
        server 192.168.1.102:80;
        server 192.168.1.103:80;

        # 【核心配置】主动健康检查
        # interval=3000: 每3秒检测一次 (生产环境建议 3000-5000)
        # rise=2: 成功2次视为节点复活
        # fall=3: 失败3次视为节点宕机 (用户配置为5亦可)
        # timeout=1000: 超时时间1秒
        check interval=3000 rise=2 fall=3 timeout=1000 type=http;

        # 发送的心跳包内容
        # 建议后端提供一个轻量级接口 /health_status
        check_http_send "GET /health_status HTTP/1.0\r\n\r\n";

        # 只要返回 2xx 或 3xx 都算活着
        check_http_expect_alive http_2xx http_3xx;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://my_backend_pool;
        }
    }

    # 【可视化】配置健康状态监控页面
    server {
        listen 8080; 
        location /check_status {
            check_status;     # 启用模块
            access_log off;   # 不记录日志
            allow 192.168.1.0/24; # 务必限制内网访问
            deny all;
        }
    }
}

2. 验证效果

重载配置后:

/opt/tengine/sbin/nginx -s reload

访问 http://你的IP:8080/check_status,你将看到一个清晰的 HTML 表格:

IndexUpstreamNameStatusRise countsFall counts
0my_backend_pool192.168.1.101:80up390
1my_backend_pool192.168.1.102:80down05
  • Status: 显示 up 代表正常,down 代表已自动摘除。
  • 全程无需人工干预!

进阶技巧:数据格式化 (CSV/JSON)

Tengine 的状态页不仅给人看,还支持给监控系统(如 Zabbix/Prometheus)看。

通过 URL 参数 format,你可以获取不同的数据格式:

1. CSV 格式 (适合脚本处理)
请求:/check_status?format=csv
输出:

0,my_backend_pool,192.168.1.101:80,up,46,0,http,80

2. JSON 格式 (适合对接监控大屏)
请求:/check_status?format=json
输出:

{"servers": {
    "total": 1,
    "generation": 3,
    "server": [
        {
            "index": 0, 
            "upstream": "my_backend_pool", 
            "name": "192.168.1.101:80", 
            "status": "up", 
            "rise": 58, 
            "fall": 0, 
            "type": "http"
        }
    ]
}}

模拟故障
停止一台后端服务器的服务(例如 192.168.1.103),等待几秒钟(超过 fall*interval 的时间),再次刷新状态页,你会发现这台服务器的状态变成了 down。此时,Tengine 将不再向这台服务器转发新的请求。
当你重新启动该后端服务,等待几秒钟(超过 rise*interval 的时间),它的状态会恢复为 up
这才是企业级负载均衡该有的样子!

结语

至此,你已经完成了 Tengine 的离线安装,并成功配置了强大的主动健康检查功能。这套方案能够显著提高你后端服务的可用性和稳定性,实现故障的自动摘除与恢复。记得在后端应用中实现一个轻量级的 /health_status 接口,以便 Tengine 进行准确的健康探测。

更多主动健康检查参数,可参考官方文档:

https://tengine.taobao.org/document/http_upstream_check.html

虽然 Nginx 官方版也在不断迭代,但在国内复杂的内网环境和对高可用严苛的要求下,Tengine 依然是不可多得的神器。

如果你觉得这个脚本有用,请点个“在看”或转发给你的运维/开发朋友,拯救他们的发际线!

Q.E.D.


寻门而入,破门而出