最詳細的多圖詳解 Nginx

本文主要幫助大家熟悉 Nginx 有哪些應用場景、Nginx 特點和架構模型以及相關流程、Nginx 定製化開發的幾種模塊分類。讀完本文你將對 Nginx 有一定的認識。

本文將圍繞如下幾個部分進行講解:

  • Nginx 簡介及特點
  • Nginx 應用場景
  • Nginx 框架模型介紹
  • Nginx 內部流程介紹
  • Nginx 自定義模塊開發介紹
  • Nginx 核心時間點模塊介紹
  • Nginx 分流模塊介紹
  • Nginx 動態 upstream 模塊介紹
  • Nginx query_upstrem 模塊介紹
  • Nginx query_conf 模塊介紹
  • Nginx 共享內存支持 Redis 協議模塊介紹
  • Nginx 日誌回放壓測工具介紹

Nginx 簡介以及特點

Nginx (engine x) 是一個高性能的 Web 服務器和反向代理服務器,也是一個 IMAP/POP3/SMTP 服務器:

  • 它由俄羅斯程序員 Igor Sysoev 於 2002 年開始開發。
  • Nginx 是增長最快的 Web 服務器,市場份額已達 33.3%。
  • 全球使用量排名第二,2011 年成立商業公司。

Nginx 社區分支:

  • Openresty:作者 @agentzh(章宜春)開發的,最大特點是引入了 ngx_lua 模塊,支持使用 Lua 開發插件,並且集合了很多豐富的模塊,以及 Lua 庫。
  • Tengine:主要是淘寶團隊開發。特點是融入了因淘寶自身的一些業務帶來的新功能。
  • Nginx 官方版本,更新迭代比較快,並且提供免費版本和商業版本。

Nginx 源碼結構(代碼量大約 11 萬行 C 代碼):

  • 源代碼目錄結構 Core(主幹和基礎設置)
  • Event(事件驅動模型和不同的 IO 複用模塊)
  • HTTP(HTTP 服務器和模塊)
  • Mail(郵件代理服務器和模塊)
  • OS(操作系統相關的實現)
  • Misc(雜項)

Nginx 特點如下:

  • 反向代理,負載均衡器
  • 高可靠性、單 Master 多 Worker 模式
  • 高可擴展性、高度模塊化
  • 非阻塞
  • 事件驅動
  • 低內存消耗
  • 熱部署

Nginx 應用場景

Nginx 的應用場景如下:

  • 靜態文件服務器
  • 反向代理,負載均衡
  • 安全防禦
  • 智能路由(企業級灰度測試、地圖 POI 一鍵切流)
  • 灰度發佈
  • 靜態化
  • 消息推送
  • 圖片實時壓縮
  • 防盜鏈

Nginx 框架模型介紹

進程組件角色:

  • Master 進程:監視工作進程的狀態;當工作進程死掉後重啟一個新的;處理信號和通知工作進程。
  • Worker 進程:處理客戶端請求,從主進程處獲得信號做相應的事情。
  • Cache Loader 進程:加載緩存索引文件信息,然後退出。
  • Cache Manager進程:管理磁盤的緩存大小,超過預定值大小後最少使用數據將被刪除。

Nginx 的框架模型如下圖:

最詳細的多圖詳解 Nginx

image

框架模型流程如下圖:

最詳細的多圖詳解 Nginx

image

Nginx 內部流程介紹

Nginx 框架模型流程如下圖:

最詳細的多圖詳解 Nginx

image

最詳細的多圖詳解 Nginx

image

Master 初始化流程,如下圖:

最詳細的多圖詳解 Nginx

image

Worker 初始化:

最詳細的多圖詳解 Nginx

image

Worker 初始化流程圖如下:

最詳細的多圖詳解 Nginx

image

靜態文件請求 IO 流程如下圖:

最詳細的多圖詳解 Nginx

image

HTTP 請求流程如下圖:

最詳細的多圖詳解 Nginx

image

HTTP 請求 11 個階段,如下圖所示:

最詳細的多圖詳解 Nginx

image

upstream模塊:

  • 訪問第三方 Server 服務器
  • 底層 HTTP 通信非常完善
  • 異步非阻塞
  • 上下游內存零拷貝,節省內存
  • 支持自定義模塊開發

upstream 框架流程,如下圖:

最詳細的多圖詳解 Nginx

image

upstream 內部流程,如下圖:

最詳細的多圖詳解 Nginx

image

反向代理流程,如下圖:

最詳細的多圖詳解 Nginx

image

Nginx 定製化模塊開發

Nginx 的模塊化設計特點如下:

  • 高度抽象的模塊接口
  • 模塊接口非常簡單,具有很高的靈活性
  • 配置模塊的設計
  • 核心模塊接口的簡單化
  • 多層次、多類別的模塊設計

內部核心模塊:

最詳細的多圖詳解 Nginx

image

最詳細的多圖詳解 Nginx

image

Handler 模塊:接受來自客戶端的請求並構建響應頭和響應體。

最詳細的多圖詳解 Nginx

image

Filter 模塊:過濾(filter)模塊是過濾響應頭和內容的模塊,可以對回覆的頭和內容進行處理。它的處理時間在獲取回覆內容之後,向用戶發送響應之前。

最詳細的多圖詳解 Nginx

image

Upstream 模塊:使 Nginx 跨越單機的限制,完成網絡數據的接收、處理和轉發,進一步的訪問後端服務。

最詳細的多圖詳解 Nginx

image

Load_Balance:負載均衡模塊,實現特定的算法,在眾多的後端服務器中,選擇一個服務器出來作為某個請求的轉發服務器。

最詳細的多圖詳解 Nginx

image

ngx_lua 模塊:

  • 腳本語言
  • 內存開銷小
  • 運行速度快
  • 強大的 Lua 協程
  • 非阻塞
  • 業務邏輯以自然邏輯書寫
最詳細的多圖詳解 Nginx

image

定製化開發 Demo

Handler 模塊:

  • 編寫 config 文件
  • 編寫模塊產生內容響應信息
<code>#配置文件:
server {
    ...    
    location test {
        test_counter on;
    }
}
#config
ngx_addon_name=ngx_http_test_module
HTTP_MODULES="$HTTP_MODULES ngx_http_test_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_test_module.c"
#ngx_http_test_module.c
static ngx_int_t
ngx_http_test_handler(ngx_http_request_t *r)
{
    ngx_int_t                               rc;
    ngx_buf_t                               *b;
    ngx_chain_t                             out;
    ngx_http_test_conf_t                    *lrcf;
    ngx_str_t                               ngx_test_string = ngx_string("hello test");

    lrcf = ngx_http_get_module_loc_conf(r, ngx_http_test_module);
    if ( lrcf->test_counter == 0 ) {
        return NGX_DECLINED;
    }

    /* we response to 'GET' and 'HEAD' requests only */
    if ( !(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD)) ) {
            return NGX_HTTP_NOT_ALLOWED;
    }

    /* discard request body, since we don't need it here */
    rc = ngx_http_discard_request_body(r);

    if ( rc != NGX_OK ) {
        return rc;
    }

    /* set the 'Content-type' header */
    /*
     *r->headers_out.content_type.len = sizeof("text/html") - 1;
     *r->headers_out.content_type.data = (u_char *)"text/html";
    */
    ngx_str_set(&r->headers_out.content_type, "text/html");

    /* send the header only, if the request type is http 'HEAD' */
    if ( r->method == NGX_HTTP_HEAD ) {
        r->headers_out.status = NGX_HTTP_OK;
        r->headers_out.content_length_n = ngx_test_string.len;

        return ngx_http_send_header(r);
    }

    /* set the status line */
    r->headers_out.status = NGX_HTTP_OK;
    r->headers_out.content_length_n =  ngx_test_string.len;

    /* send the headers of your response */
    rc = ngx_http_send_header(r);
    if ( rc == NGX_ERROR || rc > NGX_OK || r->header_only ) {
        return rc;
    }

    /* allocate a buffer for your response body */
    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
    if ( b == NULL ) {
        return NGX_HTTP_INTERNAL_SERVER_ERROR;
    }

    /* attach this buffer to the buffer chain */
    out.buf = b;
    out.next = NULL;

    /* adjust the pointers of the buffer */
    b->pos = ngx_test_string.data;
    b->last = ngx_test_string.data + ngx_test_string.len;
    b->memory = 1;    /* this buffer is in memory */
    b->last_buf = 1;  /* this is the last buffer in the buffer chain */

    /* send the buffer chain of your response */
    return ngx_http_output_filter(r, &out);
}/<code>

Nginx 核心時間點模塊介紹

解決接入層故障定位慢的問題,幫助 OP 快速判定問題根因,優先自證清白,提高接入層高效的生產力。

最詳細的多圖詳解 Nginx

image

Nginx 分流模塊介紹

Nginx 分流模塊特點如下:

  • 實現非常靈活的動態的修改策略從而進行切流量。
  • 實現平滑無損的方式進行流量的切換。
  • 通過秒級切換流量可以縮小影響範圍,從而減少損失。
  • 按照某一城市或者某個特徵,秒級進行切換流量或者禁用流量。
  • 容忍單機房級別容量故障,縮短了單機房故障的止損時間。
  • 快速的將流量隔離或者流量抽樣。
  • 高效的灰度測試,提高生產力。
最詳細的多圖詳解 Nginx

image

Nginx 動態 upstream 模塊介紹

讓接入層可以適配動態調度的雲環境,實現服務的平滑上下線、彈性擴/縮容。

從而提高接入層高效的生產力以及穩定性,保證業務流量的平滑無損。

最詳細的多圖詳解 Nginx

image

Nginx query_upstream 模塊介紹


鏈路追蹤,梳理接口到後端鏈路的情況。查詢 location 接口對應 upstream server 信息。

最詳細的多圖詳解 Nginx

image

Nginx query_conf 模塊介紹


獲取 Nginx 配置文件格式化為 json 格式信息:

最詳細的多圖詳解 Nginx

image

Nginx 共享內存支持 Redis 協議模塊介紹

根據配置文件來動態的添加共享內存:

<code>https://github.com/lidaohang/ngx_shm_dict /<code>

ngx_shm_dict:共享內存核心模塊(紅黑樹,隊列)ngx_shm_dict_manager:添加定時器事件,定時的清除共享內存中過期的 Key,添加讀事件,支持 Redis 協議,通過 redis-cli get,set,del,ttl

ngx_shm_dict_view:共享內存查看

最詳細的多圖詳解 Nginx

image


Nginx 日誌回放壓測工具

解析日誌進行回放壓測,模擬後端服務器慢等各種異常情況 :

<code>https://github.com/lidaohang/playback-testing/<code>

方案說明:

  • 客戶端解析 access.log 構建請求的 host,port,url,body。
  • 把後端響應時間,後端響應狀態碼,後端響應大小放入 header 頭中。
  • 後端服務器獲取相應的 header,進行模擬響應 body 大小,響應狀態碼,響應時間。

使用方式:

  • 拷貝需要測試的 access.log 的日誌到 logs 文件夾裡面。
  • 搭建需要測試的 Nginx 服務器,並且配置 upstream 指向後端服務器端端口
  • 啟動後端服務器實例
<code>server/backserver/main.go/<code>
  • 進行壓測
<code>bin/wrk -c30 -t1 -s conf/nginx_log.lua http://localhost:8095/<code>

作者:李航

簡介:多年的底層開發經驗,在高性能 Nginx 開發和分佈式緩存 Redis Cluster 有著豐富的經驗,目前從事分佈式存儲工作。先後在 58 同城、汽車之家、優酷土豆集團工作。目前供職於滴滴基礎平臺-技術專家崗位,主要負責分佈式 Ceph 系統。個人主要關注的技術領域:高性能 Nginx 開發、分佈式緩存、分佈式存儲。

Nginx

Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。

其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。

Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。

最詳細的多圖詳解 Nginx

由於細節內容實在太多啦,所以只把部分知識點截圖出來粗略的介紹,每個小節點裡面都有更細化的內容!

Nginx實戰核心

  1. 第1章 Nginx簡介
  2. 第2章 Nginx服務器的安裝與配置
  3. 第3章 Nginx的基本配置與優化
  4. 第4章 Nginx與PHP(FastCGI)的安裝、配置與優化
  5. 第5章 Nginx與JSP、ASP.NET、Perl的安裝與配置
  6. 第6章 Nginx HTTP負載均衡和反向代理的配置與優化
  7. 第7章 Nginx的Rewrite規則與實例
  8. 第8章 Nginx模塊開發
  9. 第9章 Nginx的Web緩存服務與新浪網的開源NCACHE模塊
  10. 第10章 Nginx在國內知名網站中的應用案例
  11. 第11章 Nginx的非典型應用實例
  12. 第12章 Nginx的核心模塊
  13. 第13章 Nginx的標準HTTP模塊
  14. 第14章 Nginx的其他HTTP模塊
  15. 第15章 Nginx的郵件模塊
最詳細的多圖詳解 Nginx

最詳細的多圖詳解 Nginx

轉發+關注,然後私信回覆“架構”即可獲取以上所有實戰書籍電子版的免費領取方式。


分享到:


相關文章: