Nginx的“遠方表哥”—Tengine

来源:https://www.cnblogs.com/along21/archive/2019/02/20/10407979.html
-Advertisement-
Play Games

本文收錄在Linux運維企業架構實戰系列 今天想起當初研究nginx反向代理負載均衡時,nginx自身的upstream後端配置用著非常不舒服; 當時使用的淘寶基於nginx二次開發的Tengine,今天總結一下。 1、認識Tengine 1.1 介紹 Tengine是由淘寶網發起的Web伺服器項目 ...


本文收錄在Linux運維企業架構實戰系列

  今天想起當初研究nginx反向代理負載均衡時,nginx自身的upstream後端配置用著非常不舒服; 當時使用的淘寶基於nginx二次開發的Tengine,今天總結一下。

1、認識Tengine

1.1 介紹

  • Tengine是由淘寶網發起的Web伺服器項目。它Nginx的基礎上,針對大訪問量網站的需求,添加了很多高級功能和特性。它的目的是打造一個高效、安全的Web平臺。
  • Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗。
  • 它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。
  • 201112月開始,Tengine成為一個開源項目。
  • 現在,它由Tengine團隊開發和維護。Tengine團隊的核心成員來自於淘寶、搜狗等互聯網企業。

 

1.2 功能

  •  繼承Nginx-1.6.2的所有特性,相容Nginx的配置
  •  動態模塊載入(DSO)支持。加入一個模塊不再需要重新編譯整個Tengine
  •  支持SO_REUSEPORT選項,建連性能提升為官方nginx的三倍;
  •  支持SPDY v3協議,自動檢測同一埠的SPDY請求和HTTP請求;
  •  流式上傳到HTTP後端伺服器或FastCGI伺服器,大量減少機器的I/O壓力;
  •  更加強大的負載均衡能力,包括一致性hash模塊、會話保持模塊,還可以對後端的伺服器進行主動健康檢查,根據伺服器狀態自動上線下線,以及動態解析upstream中出現的功能變數名稱;
  •  輸入過濾器機制支持。通過使用這種機制Web應用防火牆的編寫更為方便;
  •  支持設置proxymemcachedfastcgiscgiuwsgi在後端失敗時的重試次數
  •  動態腳本語言Lua支持。擴展功能非常高效簡單;
  •  支持管道(pipe)和syslog(本地和遠端)形式的日誌以及日誌抽樣;
  •  支持按指定關鍵字(功能變數名稱,url)收集Tengine運行狀態;
  •  組合多個CSSJavaScript文件的訪問請求變成一個請求;
  •  自動去除空白字元和註釋從而減小頁面的體積
  •  自動根據CPU數目設置進程個數和綁定CPU親緣性;
  •  監控系統的負載和資源占用從而對系統進行保護;
  •  顯示對運維人員更友好的出錯信息,便於定位出錯機器;
  •  更強大的防攻擊(訪問速度限制)模塊;
  •  更方便的命令行參數,如列出編譯的模塊列表、支持的指令等;
  •  可以根據訪問文件類型設置過期時間;

 

2、編譯安裝tengine

2.1 下載指定版本

官網:http://tengine.taobao.org/download.html

[root@along app]# wget http://tengine.taobao.org/download/tengine-2.2.3.tar.gz
[root@along app]# tar -xvf tengine-2.2.3.tar.gz

  

2.2 創建用戶,下載依賴的安裝包

[root@along app]# groupadd nginx
[root@along app]# useradd -s /sbin/nologin -g nginx -M nginx
[root@along app]# yum -y install gc gcc gcc-c++ pcre-devel zlib-devel openssl-devel

  

2.3 編譯安裝

[root@along app]# cd tengine-2.2.3/
[root@along tengine]# ./configure --user=nginx --group=nginx --prefix=/app/tengine --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
[root@along tengine]# make && make install
[root@along tengine]# chown -R nginx.nginx /app/tengine
[root@along tengine]# ll /app/tengine
total 8
drwxr-xr-x 2 nginx nginx 4096 Feb 20 14:55 conf
drwxr-xr-x 2 nginx nginx   40 Feb 20 14:50 html
drwxr-xr-x 2 nginx nginx 4096 Feb 20 14:50 include
drwxr-xr-x 2 nginx nginx    6 Feb 20 14:50 logs
drwxr-xr-x 2 nginx nginx    6 Feb 20 14:50 modules
drwxr-xr-x 2 nginx nginx   35 Feb 20 14:50 sbin

註:

  •  #指定運行許可權的用戶   --user=nginx
  •  #指定運行的許可權用戶組   --group=nginx
  •  #指定安裝路徑   --prefix=/usr/local/nginx
  •  #支持nginx狀態查詢 --with-http_stub_status_module
  •  #開啟ssl支持   --with-http_ssl_module
  •  #開啟GZIP功能   --with-http_gzip_static_module

 

3、開啟服務

3.1 配置開機啟動腳本

[root@along nginx]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/app/tengine/logs/nginx.pid
ExecStartPre=/app/tengine/sbin/nginx -t -c /app/tengine/conf/nginx.conf
ExecStart=/app/tengine/sbin/nginx -c /app/tengine/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

  

3.2 啟動服務

[root@along ~]# systemctl start nginx
[root@along ~]# ss -nutlp |grep 80
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=4933,fd=6),("nginx",pid=4932,fd=6))

網頁訪問驗證

 

4、使用tengine的負載均衡功能

  因為tengine的其他功能和nginx配置差不多,就不在演示了;主要演示,我認為較為方便的反向代理配置。

4.1 配置反向代理

tengine配置反向代理格式和haproxy很相似;

後端兩台伺服器事先自己準備好網頁服務(nginx/httpd等都可以)

[root@along tengine]# cd /app/tengine/conf/
[root@along conf]# vim nginx.conf
http {
... ...
#配置後端代理集群,預設是輪詢演算法
    upstream srv {
        server 192.168.10.101:80;
        server 192.168.10.106:80;
        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端location反向代理
    server {
        location / {
            proxy_pass http://srv;
        }
    }
... ...
}

  

4.2 重啟伺服器,驗證

1)驗證配置是否有誤

[root@along tengine]# ./sbin/nginx -t
nginx: the configuration file /app/tengine/conf/nginx.conf syntax is ok
nginx: configuration file /app/tengine/conf/nginx.conf test is successful

  

2)重啟伺服器

[root@along tengine]# systemctl restart nginx

  

3)網頁訪問驗證

因為預設是輪詢演算法,所以刷新頁面,就會輪詢調度到後臺2個網頁伺服器

 

5、nginx upstream模塊調度演算法詳解

5.1 輪詢

  輪詢是upstream預設分配方式,即每個請求按照時間順序輪流分配到不同的後端伺服器,如果某個後端伺服器down掉後,能自動剔除。

upstream srv {
        server 192.168.10.101:80;
        server 192.168.10.106:80;
}

  

5.2 weight加權輪詢

  加權輪詢,輪詢的加強版,即可以指定輪詢比率weight和訪問幾率成正比,主要應用於後端伺服器異質的場景下。

upstream srv {
        server 192.168.10.101:80 weight=1;
        server 192.168.10.106:80 weight=2;
}

  

5.3 ip_hash 

  每個請求按照訪問ip(即Nginx的前置伺服器或者客戶端IP)的hash結果分配,這樣每個訪客會固定訪問一個後端伺服器,可以解決session一致問題。

 

upstream srv {
        ip_hash;
        server 192.168.10.101:80;
        server 192.168.10.106:80;
}

註意:

  •  當負載調度演算法為ip_hash時,後端伺服器在負載均衡調度中的狀態不能是weightbackup
  •  導致負載不均衡。

 

5.4 fair 

  fair顧名思義,公平地按照後端伺服器的響應時間rt)來分配請求,響應時間短即rt小的後端伺服器優先分配請求。如果需要使用這種調度演算法,必須下載Nginxupstr_fair模塊。

upstream srv {
        fair;
        server 192.168.10.101:80;
        server 192.168.10.106:80;
}

  

5.5 url_hash(目前用consistent_hash替代url_hash

  與ip_hash類似,但是按照訪問urlhash結果來分配請求,使得每個url定向到同一個後端伺服器,主要應用於後端伺服器為緩存時的場景下。

upstream srv {
        server 192.168.10.101:80;
        server 192.168.10.106:80;
        hash $request_uri;
        hash_method crc32;
}
  •  其中,hash_method為使用的hash演算法,需要註意的是:此時,server語句中不能加weight等參數。
  •  提示:url_hash用途cache服務業務,memcachedsquidvarnish。特點:每個rs都是不同的。
  •  按訪問urlhash結果來分配請求,讓每個url定向到同一個後端伺服器,後端伺服器為緩存伺服器時效果顯著。在upstream中加入hash語句, server語句中不能寫入weight等其他的參數,hash_ method是使用的hash演算法。。
  •  url_ hash.按訪問ur1hash結果來分配請求,使每個url定向到同-一個後端伺服器,可以進一步提高後端緩存伺服器的效率命中率Nginx 本身是不支持ur1_ hash的,如果需要使用這種調度演算法,必須安裝Nginxhash軟體包。

 

6、upstream段用法介紹

1)參數說明

  •  server:關鍵字,必選。
  •  address:主機名、功能變數名稱、ipunix socket,也可以指定埠號,必選。
  •  parameters:可選參數,可選參數如下:
    •  down:表示當前的server暫時不參與負載均衡。
    •  backup:預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,因此這台機器的壓力最輕。
    •  weight:預設為1.weight越大,負載的權重就越大。
    •  max_fails:允許請求失敗的次數,預設為1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。
    •  fail_timeout:在經歷了max_fails次失敗後,暫停服務的時間。max_fails可以和fail_timeout一起使用。
    •  max_failsfail_timeout一般會關聯使用:如果某台serverfail_timeout時間內出現了max_fails次連接失敗,那麼Nginx會認為其已經掛掉了,從而在fail_timeout時間內不再去請求它,fail_timeout預設是10smax_fails預設是1,即預設情況是只要發生錯誤就認為伺服器掛掉了,如果將max_fails設置為0,則表示取消這項檢查。

 

2)舉例說明如下:

upstream backend {
	server    backend1.example.com weight=5;
	server    127.0.0.1:8080 max_fails=3 fail_timeout=30s;
	server    unix:/tmp/backend3;           
}

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • using System.Collections; using System.Collections.Generic; using UnityEngine; public class ButtonCll : MonoBehaviour { private int countint = 0; publ... ...
  • 隨著Windows10的普及,Microsoft Edge自帶瀏覽器使用頻率逐漸提升,在日常使用過程中我們會發現一個常規的問題是使用Edge進行日常文件下載的時候,N多情況下可能都是亂碼,同樣的下載鏈接在Chrome\Firefox\IE等等都是沒有問題的,這就很尷尬了,今天簡單介紹下處理方法,具體... ...
  • 摘要 通過前面一系列的鋪墊,相信大家對整個miiboo機器人的DIY有了一個清晰整體的認識。接下來就正式進入機器人大腦(嵌入式主板:樹莓派3)的開發。本章將從樹莓派3的開發環境搭建入手,為後續ros開發、slam導航及語音交互演算法做準備。本章內容: 1.安裝系統ubuntu_mate_16.04 2 ...
  • 摘要 通過前面一系列的鋪墊,相信大家對整個miiboo機器人的DIY有了一個清晰整體的認識。接下來就正式進入機器人大腦(嵌入式主板:樹莓派3)的開發。本章將從樹莓派3的開發環境搭建入手,為後續ros開發、slam導航及語音交互演算法做準備。本章內容: 1.安裝系統ubuntu_mate_16.04 2 ...
  • Linux 中,一切(或幾乎一切)都是文件。 一、Linux 磁碟分區與文件系統 1.1 磁碟分區 磁碟的分區主要分為主分區和擴展分區 1)主分區:總共最多只能有四個主分區; 2)擴展分區:只能有一個,也算是主分區的一種,即:主分區 + 擴展分區最多只能有四個。但是擴展分區不能存儲數據和格式化,必須 ...
  • if語句是實際工作中最重要最常用的語句。 if條件語法: 單分支結構 if [ 條件 ] then 指令 fi 或 if [ 條件 ];then 指令 fi if 單分支條件中文編程形象語法: 如果 [ 你有房 ] 那麼 我就嫁給你 果如 前文的文件條件表達式[ -f”$file” ]&& echo ...
  • 多文件編輯 vi 可以用來打開多個文件,如下: 進入編輯界面以後,輸入 :n 可以切換到下一個文本,:N 可以切換到上一個文本,:files 列出目前這個 vi 打開的所有文件,舉例如下: 切換到下一個 beauty 文本: 多文本編輯的作用是,比如你需要將一個文本中的一些內容複製粘貼進另一個文本, ...
  • Redis 官網 https://redis.io/ 之前學習 Redis 學了好多次, 下載安裝也都按照教程或官網文檔弄過, 但是對於安裝過程一直有點迷糊, 感覺稀里糊塗地就好了, 就可以用了. 這種迷糊得到的結果就是一旦遇到一點問題就會不知就裡.今天學到了安裝的過程, 記錄一下, 順便分享~~~ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...