ToB企服应用市场:ToB评测及商务社交产业平台

标题: 深入解析 Tengine:高性能 Web 服务器与反向署理的企业级应用 [打印本页]

作者: 郭卫东    时间: 2025-1-8 04:04
标题: 深入解析 Tengine:高性能 Web 服务器与反向署理的企业级应用
Tengine 的目标

Tengine 是由淘宝技术团队(现阿里巴巴)基于 Nginx 开发的一款高性能 Web 服务器和反向署理服务器。它的主要目标是在 Nginx 的基础上加强性能、扩展功能、提拔稳定性,并为大规模、高并发的互联网应用提供更高效的解决方案。
以下是 Tengine 的主要目标及其相关实现:

1. 提拔高并发场景下的性能

目标:

在处理高并发毗连和大流量哀求时,提供比 Nginx 更高的性能,可以或许更好地满意企业级应用(如电商、社交媒体、搜刮引擎等)的需求。
实现方式:



2. 提供企业级功能扩展

目标:

扩展 Nginx 的功能,满意企业级应用的复杂需求,比方动态负载均衡、健康检查、缓存、流量控制等。
实现方式:



3. 支持动态模块加载

目标:

降低开发和维护成本,允许在无需重新编译的情况下动态加载新功能模块。
实现方式:



4. 提拔稳定性和可靠性

目标:

针对大流量、高并发场景下的异常情况,提供更高的容错本领和系统稳定性。
实现方式:



5. 满意互联网场景的特别需求

目标:

根据中国互联网企业的业务特点和需求,在 Nginx 的基础上增加针对性的优化和扩展。
实现方式:



6. 保持与 Nginx 的兼容性

目标:

在加强功能的同时,包管与原生 Nginx 的设置、模块、生态的兼容性,便于用户从 Nginx 平滑迁徙到 Tengine。
实现方式:



8. 提拔开发与运维服从

目标:

通过功能优化和工具支持,降低开发和运维的复杂度,紧缩上线周期。
实现方式:



Tengine 项目利用指南

Tengine 是一个基于 Nginx 的高性能 Web 服务器和反向署理服务器,实用于高并发、高流量的场景。它继续了 Nginx 的功能,并增加了许多扩展功能,如动态负载均衡、健康检查、WAF(Web 应用防火墙)等。本指南将先容 Tengine 的安装、设置和常见功能的利用。

一、Tengine 的安装

Tengine 支持源码编译安装和预编译包安装,以下是两种方式的具体步骤。
1.1 源码编译安装

步骤:


1.2 利用预编译包安装

步骤:


二、Tengine 的根本设置

Tengine 的设置文件默认路径为 /usr/local/tengine/conf/nginx.conf,其语法与 Nginx 根本同等,同时增加了一些 Tengine 独有的设置选项。
以下是一个简单的 Tengine 设置文件示例:
  1. # 全局配置
  2. worker_processes  4;            # 启动的工作进程数
  3. worker_rlimit_nofile 65535;     # 每个进程的最大文件句柄数
  4. events {
  5.     worker_connections  1024;   # 每个进程的最大连接数
  6. }
  7. http {
  8.     include       mime.types;
  9.     default_type  application/octet-stream;
  10.     sendfile      on;
  11.     keepalive_timeout  65;
  12.     # Gzip 压缩
  13.     gzip  on;
  14.     gzip_min_length 1k;
  15.     gzip_comp_level 6;
  16.     gzip_types text/plain application/json text/css;
  17.     # 日志格式
  18.     log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  19.                     '$status $body_bytes_sent "$http_referer" '
  20.                     '"$http_user_agent" "$http_x_forwarded_for"';
  21.     access_log logs/access.log main;
  22.     # 负载均衡配置
  23.     upstream backend {
  24.         server 192.168.1.101:8080 weight=5;  # 后端服务器1
  25.         server 192.168.1.102:8080 weight=3;  # 后端服务器2
  26.         server 192.168.1.103:8080 backup;    # 备用服务器
  27.     }
  28.     # 服务器配置
  29.     server {
  30.         listen       80;
  31.         server_name  example.com;
  32.         location / {
  33.             proxy_pass http://backend;         # 转发请求到 upstream 定义的后端
  34.             proxy_set_header Host $host;
  35.             proxy_set_header X-Real-IP $remote_addr;
  36.         }
  37.         # 错误页面
  38.         error_page 404 /404.html;
  39.         location = /404.html {
  40.             root /usr/local/tengine/html;
  41.         }
  42.     }
  43. }
复制代码

三、Tengine 的常见功能利用

3.1 负载均衡

Tengine 提供了强大的负载均衡功能,支持多种策略,包括轮询(默认)、权重、IP 哈希等。
设置示例:

  1. # 定义后端服务组
  2. upstream backend {
  3.     server 192.168.1.101:8080 weight=5;  # 权重为5
  4.     server 192.168.1.102:8080 weight=3;  # 权重为3
  5.     server 192.168.1.103:8080 backup;    # 备用服务器
  6. }
  7. # 使用负载均衡
  8. server {
  9.     listen 80;
  10.     location / {
  11.         proxy_pass http://backend;
  12.     }
  13. }
复制代码
负载均衡策略:


IP 哈希示例:
  1. upstream backend {
  2.     ip_hash;                          # 启用 IP 哈希
  3.     server 192.168.1.101:8080;
  4.     server 192.168.1.102:8080;
  5. }
复制代码

3.2 健康检查

Tengine 加强了 Nginx 的健康检查功能,可以定期检测后端服务器状态,并剔除故障服务器。
健康检查设置:

  1. http {
  2.     upstream backend {
  3.         server 192.168.1.101:8080;
  4.         server 192.168.1.102:8080;
  5.         # 开启健康检查
  6.         check interval=3000 rise=2 fall=5 timeout=1000 type=http;
  7.         check_http_send "HEAD / HTTP/1.0\r\n\r\n";
  8.         check_http_expect_alive http_2xx http_3xx;
  9.     }
  10.     server {
  11.         listen 80;
  12.         location / {
  13.             proxy_pass http://backend;
  14.         }
  15.     }
  16. }
复制代码
参数阐明:


3.3 动态模块

Tengine 支持动态加载模块,无需重新编译即可加载新功能模块。
加载动态模块:

在设置文件中利用 load_module 指令加载模块:
  1. load_module modules/ngx_http_lua_module.so;
复制代码
生成动态模块:

通过添加 --add-dynamic-module 参数编译模块:
  1. ./configure --add-dynamic-module=/path/to/module
  2. make modules
复制代码
生成的动态模块文件通常位于 objs/ 目次下。

3.4 启用 HTTP/2

Tengine 支持 HTTP/2,可以通过以下设置启用:
  1. server {
  2.     listen 443 ssl http2;      # 启用 HTTP/2
  3.     server_name example.com;
  4.     ssl_certificate /path/to/cert.pem;
  5.     ssl_certificate_key /path/to/key.pem;
  6.     location / {
  7.         root /usr/share/nginx/html;
  8.     }
  9. }
复制代码

3.5 WAF(Web 应用防火墙)

Tengine 提供了 Web 应用防火墙模块,可以防御常见的安全威胁,如 SQL 注入、XSS 攻击等。
启用 WAF 模块:

安装并加载 WAF 模块(如 ngx_http_lua 模块),然后在设置文件中启用:
  1. location / {
  2.     access_by_lua_block {
  3.         -- Lua 脚本实现 WAF 规则
  4.         local args = ngx.req.get_uri_args()
  5.         if args["id"] and tonumber(args["id"]) < 0 then
  6.             ngx.exit(403)
  7.         end
  8.     }
  9. }
复制代码

四、Tengine 的管理命令

Tengine 提供了一些管理命令,用于控礼服务器的运行状态。
启动 Tengine

  1. /usr/local/tengine/sbin/nginx
复制代码
重新加载设置

  1. /usr/local/tengine/sbin/nginx
  2. -s reload
复制代码
停止 Tengine

  1. /usr/local/tengine/sbin/nginx
  2. -s stop
复制代码
平滑升级

  1. /usr/local/tengine/sbin/nginx
  2. -s quit
复制代码
**检查设置

检查设置文件合法性

在修改设置文件后,可以利用以下命令检查其合法性:
  1. /usr/local/tengine/sbin/nginx
  2. -t
复制代码
输出结果:


五、Tengine 的高级功能利用

5.1 动态负载均衡

Tengine 支持动态调整后端服务器的负载均衡权重,无需重启服务即可生效。
动态负载均衡设置:

  1. http {
  2.     upstream backend {
  3.         server 192.168.1.101:8080;
  4.         server 192.168.1.102:8080;
  5.         server 192.168.1.103:8080;
  6.     }
  7.     server {
  8.         listen 80;
  9.         location / {
  10.             proxy_pass http://backend;
  11.         }
  12.     }
  13. }
复制代码
动态调整权重:

通过 tengine_upstream.conf 文件,动态调整后端服务器的权重。比方:
  1. echo "192.168.1.101:8080 weight=10" > /usr/local/tengine/conf/tengine_upstream.conf
复制代码
然后通过以下指令重新加载设置:
  1. nginx -s reload
复制代码
动态负载均衡可以结合健康检查模块利用,以包管流量分发到健康的服务器节点。

5.2 流量限速

Tengine 提供了流量限制功能,可以限制每个 IP 的并发哀求数或每秒哀求数,防止恶意哀求或流量突增。
限速设置:

  1. http {
  2.     # 定义限速区域
  3.     limit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s;
  4.     server {
  5.         listen 80;
  6.         location / {
  7.             limit_req zone=req_zone burst=5;  # 每秒限制 10 个请求,允许 5 个突发请求
  8.             proxy_pass http://backend;
  9.         }
  10.     }
  11. }
复制代码
参数阐明:


5.3 缓存加快

Tengine 支持内容缓存功能,可以将后端服务器的相应存储到当地磁盘或内存中,从而加快用户的访问。
缓存设置:

  1. http {
  2.     proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
  3.     server {
  4.         listen 80;
  5.         location / {
  6.             proxy_cache my_cache;                   # 启用缓存
  7.             proxy_cache_valid 200 302 10m;          # 状态码 200 和 302 的内容缓存 10 分钟
  8.             proxy_cache_valid 404 1m;               # 状态码 404 的内容缓存 1 分钟
  9.             proxy_pass http://backend;
  10.         }
  11.     }
  12. }
复制代码
参数阐明:


5.4 日志切割与管理

Tengine 提供了强大的日志功能,可以记载访问日志、错误日志,并支持日志的自动切割。
日志设置:

  1. http {
  2.     log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  3.                     '$status $body_bytes_sent "$http_referer" '
  4.                     '"$http_user_agent" "$http_x_forwarded_for"';
  5.     access_log /var/log/nginx/access.log main;
  6.     server {
  7.         listen 80;
  8.         location / {
  9.             proxy_pass http://backend;
  10.         }
  11.     }
  12. }
复制代码
日志切割:

可以利用外部工具(如 logrotate)实现日志切割,以下是一个 logrotate 设置示例:
/etc/logrotate.d/nginx 设置:
  1. /var/log/nginx/*.log {    daily    missingok    rotate 14    compress    delaycompress    notifempty    create 0640 www-data www-data    sharedscripts    postrotate        /usr/local/tengine/sbin/nginx
  2. -s reopen    endscript}
复制代码
此设置会每天切割日志,保留 14 天的历史日志,并在切割后自动关照 Tengine 重新打开日志文件。

5.5 防盗链设置

Tengine 支持防盗链功能,可以限制某些外部链接直接访问服务器上的资源。
防盗链设置:

  1. http {
  2.     server {
  3.         listen 80;
  4.         server_name example.com;
  5.         location /images/ {
  6.             valid_referers none blocked *.example.com;
  7.             if ($invalid_referer) {
  8.                 return 403;
  9.             }
  10.             root /var/www/html;
  11.         }
  12.     }
  13. }
复制代码
参数阐明:


六、Tengine 的常见标题与解决

6.1 设置文件错误

执行 nginx -t 检查时提示设置文件错误:
  1. nginx: [emerg] "server" directive is not allowed here
复制代码
原因:

解决方法:
检查设置文件的层级结构,确保 server 块在 http 块中定义。

6.2 服务启动失败

启动 Tengine 时提示端口占用:
  1. nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
复制代码
原因:

解决方法:

6.3 高并发下性能下降

原因:

解决方法:

这句话是关于 Tengine 在微服务场景下的实用性形貌,主要是指出 Tengine 并没有像 Spring Cloud Gateway 那样为微服务架构提供原生支持(比如直接与 Eureka、Consul 等服务发现组件集成),但 Tengine 仍旧可以通过 反向署理的方式 与微服务架构组合利用,尤其是在 Kubernetes 环境中,通过 Ingress 的方式实现负载均衡和路由功能。
以下将具体表明这句话的含义,以及 Tengine 在微服务架构中的应用方式。

1. 什么是“无原生微服务支持”?

Tengine 是一个高性能的 Web 服务器和反向署理服务器,基于 Nginx 开发,定位是传统的 Web 和 API 网关解决方案,主要提供:

然而,今世 微服务架构 中,经常需要 API 网关具有以下功能:
Tengine 的范围性



2. 怎样通过反向署理与微服务结合?

虽然 Tengine 缺乏原生的微服务支持,但它可以通过反向署理的方式与微服务结合,尤其是在 Kubernetes 环境中,通过 Ingress 设置实现简单的微服务流量管理。
反向署理的核心头脑


3. 在 Kubernetes 中作为 Ingress Controller

在 Kubernetes 中,Ingress 是一种 API 对象,用于定义 HTTP(S) 路由规则,将外部哀求转发到集群内部的服务(Service)。
Tengine 可以作为 Ingress Controller 的实现,接受 Kubernetes 的流量入口。
Tengine + Kubernetes Ingress 的架构

  1. 客户端(外部请求)
  2.         ↓
  3. Tengine(Ingress Controller)
  4.         ↓
  5. Kubernetes Service(微服务的负载均衡)
  6.         ↓
  7. 微服务实例(Pod)
复制代码
怎样通过反向署理支持微服务?

3.1 静态设置示例

在 Tengine 中,设置静态反向署理,将差别的路径转发到对应的微服务。
示例 nginx.conf:
  1. http {
  2.     upstream service_a {
  3.         server 10.0.0.1:8080;  # 微服务 A 的实例 1
  4.         server 10.0.0.2:8080;  # 微服务 A 的实例 2
  5.     }
  6.     upstream service_b {
  7.         server 10.0.0.3:9090;  # 微服务 B 的实例 1
  8.     }
  9.     server {
  10.         listen 80;
  11.         # 路由规则
  12.         location /service-a/ {
  13.             proxy_pass http://service_a;
  14.         }
  15.         location /service-b/ {
  16.             proxy_pass http://service_b;
  17.         }
  18.     }
  19. }
复制代码


3.2 在 Kubernetes 中利用 Tengine Ingress

Tengine 可以作为 Kubernetes 的 Ingress Controller,通过 Ingress 资源动态设置路由规则。
摆设步骤:
示例 Ingress 设置:
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: example-ingress
  5.   annotations:
  6.     nginx.org/force-ssl-redirect: "true"
  7. spec:
  8.   rules:
  9.   - host: example.com
  10.     http:
  11.       paths:
  12.       - path: /service-a/
  13.         pathType: Prefix
  14.         backend:
  15.           service:
  16.             name: service-a
  17.             port:
  18.               number: 8080
  19.       - path: /service-b/
  20.         pathType: Prefix
  21.         backend:
  22.           service:
  23.             name: service-b
  24.             port:
  25.               number: 9090
复制代码

4. 动态署理服务实例的解决方案

4.1 利用第三方工具更新 Tengine 设置

对于服务实例动态变化的场景,可以利用第三方工具(如 Consul Template 或 Lua 脚本)自动更新 Tengine 的设置文件并重新加载。
示例:利用 Consul Template


设置模板:
  1. upstream service_a {
  2.     {{ range service "service-a" }}
  3.     server {{ .Address }}:{{ .Port }};
  4.     {{ end }}
  5. }
  6. server {
  7.     listen 80;
  8.     location /service-a/ {
  9.         proxy_pass http://service_a;
  10.     }
  11. }
复制代码

4.2 利用动态反向署理(OpenResty/Lua)

通过引入 Lua 模块(如 OpenResty),实现动态服务发现和负载均衡。
示例:动态服务发现
  1. location /service-a/ {
  2.     content_by_lua_block {
  3.         local service_a = {
  4.             "10.0.0.1:8080",
  5.             "10.0.0.2:8080"
  6.         }
  7.         local backend = service_a[math.random(#service_a)]
  8.         ngx.var.target = backend
  9.     }
  10.     proxy_pass http://$target;
  11. }
复制代码

5. 总结

Tengine 的微服务支持特点

对于复杂的微服务架构(如动态服务发现、大量路由规则、认证和限流),可以结合 Spring Cloud Gateway 或其他微服务网关组件利用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4