高性能 Web 服務器之Tengine

一、概述

在這里插入圖片描述
??Tengine 是一個由淘寶網發起的 Web 服務器項目。它基于 Nginx 然后針對大訪問量網站的需求,添加了很多高級功能和特性,從 2011 年 12 月開始,Tengine 正式開源。Tengine 的性能和穩定性已經100多家大型網站如淘寶網,天貓商城、Youku、AliExpress、 Lazada 、Alibaba Cloud等得到了生產型檢驗。Tengine定位于打造一個高效、穩定、安全、易用的 Web 平臺 目前已100% 兼容 Nginx的配置語法和模塊,用戶還可無縫遷移現有Nginx服務,同時享受增強功能,但需要注意安全漏洞,近期安全通報顯示部分版本存在漏洞,請及時加固更新。另外,Tengine 沒有像 Spring Cloud Gateway 那樣為微服務架構提供原生支持(比如直接與 Eureka、Consul 等服務發現組件集成),但 Tengine 仍然可以通過 反向代理的方式 與微服務架構組合使用,尤其是在 Kubernetes 環境中,通過 Ingress 的方式實現負載均衡和路由功能。

  • 繼承 Nginx-1.24.0 的所有特性,100% 兼容 Nginx 的配置;
  • 動態模塊加載(DSO)支持。加入一個模塊不再需要重新編譯整個 Tengine,支持動態調整 servers, locations and upstreams而無需 reloading 或restarting worker 進程;
  • 支持HTTP/3 (QUIC v1 和draft-29方式);支持異步SSL/TLS模式,可以使用QAT(intel QuickAssist Technology)來卸載和加速SSL,顯著提升性能。
  • 支持基于標準和自定義的 HTTP header, cookie, query and weights.來動態配置路由,可動態添加和追加自定義的http 頭和請求參數;無需重新加載引擎的就可向HTTP響應添加自定義報頭;支持動態配置TLS versions, timeout setting, SSL Redirects, CORS and enabling/disabling robots for the server and location;支持proxy_connection的隧道連接;
  • 更多負載均衡算法支持。如會話保持,一致性 hash 等;
  • 輸入過濾器機制支持。通過使用這種機制 Web 應用防火墻的編寫更為方便;
  • 動態腳本語言 Lua 支持。擴展功能非常高效簡單;
  • 支持管道(pipe)和 syslog(本地和遠端)形式的日志以及日志抽樣;
  • 組合多個 CSS、JavaScript 文件的訪問請求變成一個請求
  • 可以對后端的服務器進行主動健康檢查,根據服務器狀態自動上線下線;
  • 自動根據 CPU 數目設置進程個數和綁定 CPU 親緣性;支持內核旁路的高速UDP傳輸,
  • 監控系統的負載和資源占用從而對系統進行保護,包括: asynchronous log & rollback, DNS caching, memory usage;
  • 顯示對運維人員更友好的出錯信息,便于定位出錯機器;
  • 更強大的防攻擊(訪問速度限制)模塊;
  • 更方便的命令行參數,如列出編譯的模塊列表、支持的指令等;
  • 可以根據訪問文件類型設置過期時間;
  • 支持直接提交未緩沖的數據給到HTTP和FastCGI 后端服務器,避免了本地緩沖需先將文件數據寫入磁盤緩沖區,然后再從緩沖區讀取數據進行處理,這樣可以減少磁盤I/O操作,提高文件處理速度;

關聯資源:tengine倉庫、tengine產品官網、tengine-ingress統一接入[Tengine-Ingress結束](https://mp.weixin.qq.com/s/VbNXHvjdCD07LOXaOIGXCw)

二、架構及原理

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

2.1 tengine對Nginx的主要改進模塊

在這里插入圖片描述
在這里插入圖片描述

2.2 改進優化

1)計時器優化

Timers(計時器)是網絡服務器中一個很重要的基礎設置,它用來管理讀寫超時和應用邏輯的超時等。其常見操作有添加超時、刪除超時以及查找最小的超時值。Nginx使用Red-black tree(紅黑樹)作為其計時器的數據結構。紅黑樹對應于添加、刪除和查找最小值的算法復雜度都是O(logn)。在Tengine中,我們將Nginx的計時器數據結構改為了4-heap(四叉最小堆)。四叉堆是二叉堆的變種,比二叉堆有更淺的深度和更好的CPU Cache命中率。最小堆的添加、刪除的復雜度和紅黑樹一樣都是O(log n),但在查找最小值時,它的算法復雜度是0(1),即只要取出堆頂的第一個元素即可,因此比Nginx的紅黑樹更適合頻繁獲取最小值的場景,特別是在處理大量連接時,用最小堆性能提升比較明顯。

2)瀏覽器和爬蟲的判斷優化

判斷瀏覽器的類型是Web服務器的一個常見需求。Nginx中判斷瀏覽器的方法是對關注的瀏覽器種類在User-Agent頭中做暴力查找(strstr) 。strstr本身的算法復雜度是0(n2),Nginx查找的是多個串,因此其最終算法復雜度是0(n3)。隨
著現在移動端的瀏覽器增多,原有模塊的復雜度成指數增長,性能不高。在Tengine中,我們開發了一個全新的user_agent模塊,使用了trie(前綴
樹)來搜索多個可能的瀏覽器匹配串。它將所有的匹配字符串構造出一個自動機,每次匹配,它的算法復雜度只需要O(n)。因此復雜度不會隨著匹
配串數量的增加而增加。

3)自動綁定CPU親緣性

原有的Nginx CPU綁定需要手工操作,在Tengine中我們將Worker進程和CPU進行自動綁定,可以減少因CPU的Cache失效帶來的性能損失,從而提高性能。另外,這樣也減少了運維配置的工作量。

4)Lua模塊(ngx_lua) 將Lua直接嵌入進Nginx核中

這樣,借助Lua的協程和Nginx的事件模型實現同步、非阻塞的I/O操作,開發者在Nginx配置文件中可串行同步編寫Lua腳本來處理業務邏輯,既可以用它來黏合各種上游(Proxy、Drizzle、Redis、Memcached等)的輸出,也可以使用它的Cosocket接口來編寫訪問上游的客戶端。得益于Lua解釋器極低的開銷和JIT技術(LuaJIT),用戶不用編寫復雜的C模塊就能獲得極高的吞吐性
能。也可以動態更改邏輯,不用再重新編譯Nginx代碼,從而帶來了極大的靈活性。
在這里插入圖片描述

Lua模塊在初始化時為每個Nginx工作進程創建一個Lua/LuaJIT實例(LuaVM),同一進程處理的所有請求將共享該實例,并且Lua模塊將用戶Lua代碼包裝為協程工廠緩存在Nginx內,一個請求到來時協程工廠為它分配一個獨立協程來運行業務邏輯。在需要進行阻塞的I/O操作時,Lua模塊自動將I/O操作委托給Nginx的事件處理模型,并保存正在運行的協程上下文,返回到Nginx工作進程中處理其他請求,等到I/O操作完成時,又會恢復該協程繼續運行。

5)動態模塊支持

Tengine中加入了動態模塊功能,對模塊實現了動態編譯,加入模塊不再需要靜態編譯整個Tengine代碼。使用方法類似Apache,在使用時可以當場
動態編譯想加人的模塊,非常方便。

  • 1.我們提供類似apxs的編譯工具,將模塊編譯成動態鏈接庫。
  • 2.在Tengine啟動時通過動態鏈接庫讀入模塊的模塊結構體,這個結構體包含了模塊處理的所有信息。
  • 3.Tengine有內置的模塊加載順序表,也可在配置文件中顯式的指定模塊的加載順序,保證模塊加載順序正常。
  • 4.Tengine內部通過兩個版本號(Major和Minor)來控制動態鏈接庫(.so文件)的前后兼容性。當Major版本號相同時,較新版本的Tengine兼容較舊版本的.so文件(Tengine的Minor大于.so文件)。只有當Tengine的API發生重大變化時,Major的版本號才發生變化。增加新的API只會增加Minor版本號。

2.3 Tengine-Ingress 高性能高可用的云原生網關架構

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

三、部署配置

在這里插入圖片描述

3.1 編譯安裝

yum -y install gcc pcre-devel openssl-devel
useradd -r -s /sbin/nologin nginx
#下載源碼包編譯
cd /usr/local/src
wget https://tengine.taobao.org/download/tengine-2.4.1.tar.gz
md5sum tengine-2.4.1.tar.gz #8a3c754741539723af977246dfb260dd
tar xf tengine-2.4.1.tar.gz
cd tengine-2.4.1/
#或
git clone https://github.com/alibaba/tengine.git
cd tengine./configure --prefix=/usr/local/tengine-2.4.1 --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcremake && make install
ln -s /usr/local/tengine-2.4.1/sbin/* /usr/sbin/
#啟動
nginx#動態添加 Lua 模塊
yum -y install lua-devel
./configure --prefix=/usr/local/tengine-2.4.1 --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-http_lua_module=shared
#將動態模塊的so文件拷貝到目標目錄,這個目錄可以通過'--dso-path'設置。默認是在Tengine安裝目錄下面的modules目錄
make dso_install
#或如下這樣簡化生產動態模塊,--add-dynamic-module 參數編譯模塊
./configure --add-dynamic-module=/path/to/module
make modules
#更新配置文件以加載 Lua 模塊,生成的動態模塊文件通常位于 objs/ 目錄下
vim /usr/local/tengine-2.4.1/conf/nginx.conf #如下所示
dso {load ngx_http_lua_module.so;
}
#或配置文件中使用 load_module 指令加載模塊:
server {listen 443 ssl http2;      # 啟用 HTTP/2server_name example.com;load_module modules/ngx_http_lua_module.so;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;location / {root /usr/share/nginx/html;}
}
#檢查配置并重啟 Tengine:
nginx -t
nginx -s reload#Concat 模塊:Concat 模塊用于合并多個文件在一個響應報文中,類似于 Apache 的 mod_concat 模塊。這有助于減少 HTTP 請求數量,提高網站加載速度和用戶體驗
./configure --help | grep http_concat  #檢查當前tengine支持的Concat 模塊版本
#編譯
./configure --prefix=/usr/local/tengine-2.4.1 --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-http_lua_module=shared --with-http_concat_module=shared
make dso_install
#完成后,更新配置
location /static/css/ {concat on;concat_max_files 20;
}location /static/js/ {concat on;concat_max_files 30;
}
#加載
nginx -t
nginx -s reload## 查看加載模塊
tengine -V 2>&1 | grep dynamic

3.2 配置示例

worker_processes auto;
worker_rlimit_nofile 65535;
events {worker_connections 65535;
}
http {
#以備日志切割
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" '' "$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;
gzip_min_length 1k;# 負載均衡,默認輪詢:請求被依次分配給每個服務器;IP 哈希(ip_hash):根據客戶端 IP 地址分配流量,使同一 IP 的用戶訪問同一臺服務器
upstream backend {server 172.18.1.101:8080 weight=5;  # 權重為5server 172.18.1.102:8080 weight=3;  # 權重為3server 172.18.1.103:8080 backup;    # 備用服務器
}
#或
upstream backend {ip_hash;                          # 啟用 IP 哈希server  172.18.1.101:8080;server  172.18.1.102:8080;
}# 開啟健康檢查,rise=2:連續檢查 2 次成功視為健康;fall=5:連續檢查 5 次失敗視為故障;timeout=1000:檢查超時時間(單位毫秒);check_http_send:發送的 HTTP 請求內容;check_http_expect_alive:期望的響應狀態碼。check interval=3000 rise=2 fall=5 timeout=1000 type=http;check_http_send "HEAD / HTTP/1.0\r\n\r\n";check_http_expect_alive http_2xx http_3xx;# 使用負載均衡
server {listen 80;location / {proxy_pass http://backend;}
}
#waf示例
location / {access_by_lua_block {#Lua 腳本實現 WAF 規則local args = ngx.req.get_uri_args()if args["id"] and tonumber(args["id"]) < 0 thenngx.exit(403)end}
}
#流量限速:限制每個 IP 的并發請求數或每秒請求數,防止惡意請求或流量突增
http {# 定義限速區域,$binary_remote_addr 表示根據客戶端 IP 地址限速,限速區域大小為 10MBlimit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s; server {listen 80;location / {limit_req zone=req_zone burst=5;  # 每秒限制 10 個請求,允許 5 個突發請求proxy_pass http://backend;}}
}#緩存加速:可以將后端服務器的響應存儲到本地磁盤或內存中,從而加速用戶的訪問
http {proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;server {listen 80;location / {proxy_cache my_cache;                   # 啟用緩存proxy_cache_valid 200 302 10m;          # 狀態碼 200 和 302 的內容緩存 10 分鐘proxy_cache_valid 404 1m;               # 狀態碼 404 的內容緩存 1 分鐘proxy_pass http://backend;}#防盜鏈,定義允許訪問的 Referer,none:允許沒有 Referer 的請求;blocked:允許 Referer 被代理隱藏的請求。location /images/ {valid_referers none blocked *.example.com;if ($invalid_referer) {return 403;}}
}
#日志切割
vi /etc/logrotate.d/nginx  #保存半年
/var/log/nginx/*.log {dailymissingokrotate 190compressdelaycompressnotifemptycreate 0640 www-data www-datasharedscriptspostrotate/usr/local/sbin/nginx -s reopenendscript
}

3.3 圖形管理工具

1)Tengine Dashboard功能

2)Prometheus監控方案+Grafana可視化面板

3)ELK日志分析方案

四、應用案例

4.1、電商場景

1)大促期間動態限流配置

upstream mall {check interval=3000 rise=2 fall=3;server 172.18.1.101:8080;
}
location ~* \.(jpg|css)$ {expires 30d;
}

2)靜態資源加速方案

4.2 金融行業

1)雙向證書校驗實現

2)敏感數據加密傳輸

3)長連接保持配置

4.3 MQTT協議支持案例

五、FAQ

1)兼容性問題

2)與原生Nginx模塊沖突處理

3)版本升級注意事項

4)性能問題

5)高并發場景優化建議

6)TIME_WAIT狀態處理

7)動態加載模塊失敗排查

8)自定義日志格式配置

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87284.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡單實現HTML在線編輯器

我們繼續來看一下如何開發一個簡單的html在線編輯器&#xff0c;要求很簡單 能夠同時編輯html&#xff0c;css&#xff0c;js代碼&#xff0c;并且運行之后可以同時預覽效果 一&#xff1a;前置知識 在H5中設置了一個新的標簽&#xff0c;<iframe>&#xff0c; 用于在當前…

【Bluedroid】藍牙啟動之核心模塊(startProfiles )初始化與功能源碼解析

本文深入解析Android藍牙協議棧中 start_profiles 函數及其調用的核心模塊初始化邏輯,涵蓋 BNEP、PAN、A2DP、AVRC、HID Host、BTA_AR 等關鍵配置文件和應用層模塊。通過代碼分析與流程梳理,闡述各模塊如何通過全局控制塊、狀態機、回調機制實現功能初始化、連接管理及數據交…

RK3576 Android14 DMIC調制

一、背景 近期項目中有個DMIC調試的需求&#xff0c;擱置了較長時間&#xff0c;現今著手調試&#xff0c;遂作記錄。 二、開發環境 OS&#xff1a;Android14 Platform&#xff1a;RK3576 Linux Version&#xff1a;6.1.99 SDK Version&#xff1a;android-14.0-mid-rkr6 …

使用 Prometheus 監控 Spring Boot 應用

SpringBoot+Prometheus+Grafana實現監控 邏輯如圖 應用程序在生產環境中運行時,監控其運行狀況是非常必要的。通過實時了解應用程序的運行狀況,才能在問題出現之前得到警告,也可以通監控應用系統的運行狀況,優化性能,提高運行效率。 一、監控 Spring Boot 應用 下面我們…

簡易計算器 Python 實現

目錄 一、代碼逐步分析&#xff08;適合剛入門的朋友看&#xff09; 1.定義了一個名為simple_calculator的函數&#xff0c;封裝了整個計算器的邏輯。 二、深入分析代碼塊&#xff0c;用更加官方的語詞來說&#xff08;適合想要深入學習的朋友&#xff09; 主循環結構 退出…

開源編譯器介紹

文章目錄 基本構成傳統編譯器編譯器的發展歷史&#xff08;History of Compiler&#xff09;GCC 編譯過程與原理&#xff08;GCC Process and Principle&#xff09;LLVM/Clang 編譯過程與原理&#xff08;LLVM/Clang Process and Principle&#xff09;GCC與與 LLVM/Clang 的對…

C++ String知識點

當然可以&#xff01;下面我將以系統全面、通俗易懂、深入淺出的方式&#xff0c;為你講解 C 中非常核心但也容易被低估的內容 —— std::string。 &#x1f31f; C std::string 全面詳解 &#x1f4cc; 一、string 是什么&#xff1f; C 的 std::string 是 C 標準庫中封裝好…

全新NVIDIA Llama Nemotron Nano視覺語言模型在OCR基準測試中準確率奪冠

全新NVIDIA Llama Nemotron Nano視覺語言模型在OCR基準測試中準確率奪冠 PDF、圖表、圖形和儀表板等文檔是豐富的數據源&#xff0c;當這些數據被提取和整理后&#xff0c;能夠為決策制定提供有價值的洞察。從自動化財務報表處理到改進商業智能工作流程&#xff0c;智能文檔處…

gradle的 build時kaptDebugKotlin 處理數據庫模塊

gradle的 build時輸出&#xff1a; Task :app:kaptDebugKotlin 注: Processing class HDCoinBean 注: Processing class HDCurrencyBean 注: Processing class HDSelfAddCoin 注: Processing class MN 注: Creating DefaultRealmModule <—> 80% EXECUTING [7m 56s] IDLE…

二叉樹的節點操作算法

235. 二叉搜索樹的最近公共祖先 力扣題目鏈接(opens new window) 給定一個二叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大…

【ubuntu驅動安裝】安裝nvidia驅動和cuda環境

1、安裝驅動 首先查看環境和顯卡&#xff1a; 更新apt 查看nouveau是否禁用 如果有返回值禁用nouveau(nouveau是通用的驅動程序)&#xff08;必須&#xff09;&#xff0c;兩種文件&#xff0c;22.04是下面那個 添加如下&#xff1a; 終端輸入后更新 重啟電腦sudo reboo…

力扣HOT100之終章:一些隨筆

今天終于把力扣HOT100系列給刷完了&#xff0c;每一道題都記錄了自己的思考過程和解題過程中參考的一些題解和視頻&#xff0c;方便自己以后再刷的時候快速復習&#xff0c;從2025年3月4日寫下第一篇博客&#xff0c;到2025年6月12日完成最后一題并寫下最后一篇博客&#xff0c…

榕壹云家政系統:基于Spring Boot與UniApp的智能家政服務解決方案

在數字化浪潮下&#xff0c;傳統家政行業正面臨效率與服務質量的升級挑戰。榕壹云公司依托前沿技術&#xff0c;推出了一款用戶端與師傅端二合一的家政服務小程序&#xff0c;通過整合預約上門、分銷、儲值、優惠券等功能&#xff0c;為家政服務行業提供了一套高效、靈活的數字…

CSRF擴展 JSONP劫持

介紹&#xff1a;JOSNP&#xff08;JSONP with Override Security Negotiation Protocol&#xff09;劫持是一種利用JSONP &#xff08;JSON with Padding&#xff09;跨域數據獲取機制的安全漏洞&#xff0c;攻擊者通過篡改或偽造JSONP回調函數竊 取用戶敏感數據。由于JSONP…

HTTP/HTTPS 協議解析

前言 在當今互聯網時代&#xff0c;HTTP/HTTPS 協議作為 Web 通信的基石&#xff0c;承載著幾乎所有的網絡內容傳輸。對于我們而言&#xff0c;深入理解這些協議不僅是技術素養的體現&#xff0c;更是構建高性能、安全、可靠 Web 應用的必要條件。 為什么我們需要深入了解 HT…

Flask-login 處理授權邏輯

認證 vs 授權&#xff1a; 在 Web 應用程序的安全機制中&#xff0c;認證&#xff08;Authentication&#xff09; 和 授權&#xff08;Authorization&#xff09; 是兩個核心概念&#xff0c;它們雖然緊密相關&#xff0c;但職責和作用不同。 認證&#xff08;Authenticatio…

xenomai3+linux構建linux實時操作系統-基于X86_64和arm

簡介&#xff1a; Xenomai是一個實時性解決方案&#xff0c;通過在Linux上添加實時內核Cobalt來增強實時性能。它有三個主要部分&#xff1a;libcobalt&#xff08;用戶空間實時庫&#xff09;、Cobalt&#xff08;內核空間實時內核&#xff09;和硬件架構特定層&#xff08;ip…

Linux核心文件(core file)詳解

一、核心文件&#xff08;core file&#xff09;概述 1.1 什么是核心文件 核心文件&#xff08;core file&#xff09;是Linux操作系統在程序崩潰時生成的一種轉儲文件。它包含了程序崩潰時的內存內容、寄存器狀態和執行狀態。通過分析核心文件&#xff0c;開發者可以找到程序…

java中跨域問題及解決方案

1. 什么是跨域 從不同的地址訪問另外一個地址就是跨域 2.跨域一定會有異常嗎 跨域異常只會在前端發生&#xff0c;后端跨域不會產生異常 因為瀏覽器有一個叫做同源策略的東西&#xff0c;它發現不同域之間的訪問是不安全的行為&#xff0c;會禁止&#xff0c;所以會拋出異常…

網絡層協議 IP 協議介紹 -- IP 協議,網段劃分,私有 IP 和 公網 IP,路由

目錄 1 IP 協議 1.1 IP 協議格式 2. 網段劃分 2.1 網絡號和主機號 2.2 傳統 IP 地址分類和 CIDR 技術 2.3 特殊的 IP 地址 2.4 IP 地址的數量限制 2.5 私有 IP 和公網 IP 3. 路由 網絡層主要作用是實現不同局域網之間的通信連接&#xff0c;并為數據在復雜網絡環境中的…