網關nginx和Openresty學習調研

OpenResty? 是一個基于 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用于方便地搭建能夠處理超高并發、擴展性極高的動態 Web 應用、Web 服務和動態網關。Lua 腳本語言調動 Nginx 支持的各種 C 以及 Lua 模塊, 讓你的Web服務直接跑在 Nginx 服務內部,充分利用 Nginx 的非阻塞 I/O 模型,不僅僅對 HTTP 客戶端請求,甚至于對遠程后端諸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都進行一致的高性能響應。

nginx的優勢: 事件驅動, 高度模塊化, 跨平臺服務

我們可以基于它來做elasticsearch多集群網關.
參考:

  1. https://segmentfault.com/a/1190000041298011
  2. https://cloud.tencent.com/developer/article/1518678
  3. https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Connection_management_in_HTTP_1.x

hello world


worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}
http {
    server {
        listen 8080;
        location / {
            default_type text/html;
            content_by_lua_block {
                ngx.say("<p>hello, world</p>")
            }
        }
    }
}

示例中的配置其實很好理解:
監聽8080端口, 改寫location根, 全部直接返回.

nginx配置說明

nginx 配置文件有三部分組成:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

1. 全局快

從配置文件開始到 events 塊之間的內容,主要會設置一些影響nginx 服務器整體運行的配置指令,主要包括配 置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數,進程 PID 存放路徑、日志存放路徑和類型以 及配置文件的引入等。
上述配置: 1 個worker

2. events塊

events 塊涉及的指令主要影響 Nginx 服務器與用戶的網絡連接,常用的設置包括是否開啟對多 work process 下的網絡連接進行序列化,是否 允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等
上述例子就表示每個 work process 支持的最大連接數為 1024.
這部分的配置對 Nginx 的性能影響較大,在實際中應該靈活配置。

3. http塊

配置變動最多的, 且: http 塊也可以包括 http全局塊、server 塊。
● http全局塊
http全局塊配置的指令包括文件引入、MIME-TYPE 定義、日志自定義、連接超時時間、單鏈接請求數上限等。
● server 塊
這塊和虛擬主機有密切關系,虛擬主機從用戶角度看,和一臺獨立的硬件主機是完全一樣的,該技術的產生是為了 節省互聯網服務器硬件成本。
每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當于一個虛擬主機。
而每個 server 塊也分為全局 server 塊,以及可以同時包含多個 locaton 塊。

  1. 全局 server 塊
    最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或IP配置。
  2. location 塊
    一個 server 塊可以配置多個 location 塊。
    這塊的主要作用是基于 Nginx 服務器接收到的請求字符串(例如 server_name/uri-string),對虛擬主機名稱 (也可以是IP 別名)之外的字符串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理。 地址定向、數據緩 存和應答控制等功能,還有許多第三方模塊的配置也在這里進行。

● location 指令說明

學習參考: https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247494640&idx=2&sn=3dff37a670abfaf7b64d7bfa798d5f5b&chksm=e9188eecde6f07fad24d3f05853b0b1a029ce44ff43194364ef0510e7613c113ef7b0e39aae9&token=526214436&lang=zh_CN&scene=21#wechat_redirect
該指令用于匹配 URL。
語法如下:
1、= :用于不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,如果匹配 成功,就停止繼續向下搜索并立即處理該請求。
2、~:用于表示 uri 包含正則表達式,并且區分大小寫。
3、~:用于表示 uri 包含正則表達式,并且不區分大小寫。
4、^~:用于不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字 符串匹配度最高的 location 后,立即使用此 location 處理請求,而不再使用 location 塊中的正則 uri 和請求字符串做匹配。
注意:如果 uri 包含正則表達式,則必須要有 ~ 或者 ~
標識。

更詳細的配置

from: https://segmentfault.com/a/1190000041298011

# main段配置信息
user  nginx;                        # 運行用戶,默認即是nginx,可以不進行設置
worker_processes  auto;             # Nginx 進程數,一般設置為和 CPU 核數一樣
error_log  /var/log/nginx/error.log warn;   # Nginx 的錯誤日志存放目錄
pid        /var/run/nginx.pid;      # Nginx 服務啟動時的 pid 存放位置

# events段配置信息
events {
    use epoll;     # 使用epoll的I/O模型(如果你不知道Nginx該使用哪種輪詢方法,會自動選擇一個最適合你操作系統的)
    worker_connections 1024;   # 每個進程允許最大并發數
}

# http段配置信息
# 配置使用最頻繁的部分,代理、緩存、日志定義等絕大多數功能和第三方模塊的配置都在這里設置
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;   # Nginx訪問日志存放位置

    sendfile            on;   # 開啟高效傳輸模式
    tcp_nopush          on;   # 減少網絡報文段的數量
    tcp_nodelay         on;
    keepalive_timeout   65;   # 保持連接的時間,也叫超時時間,單位秒
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;      # 文件擴展名與類型映射表
    default_type        application/octet-stream;   # 默認文件類型

    include /etc/nginx/conf.d/*.conf;   # 加載子配置項
    
    # server段配置信息
    server {
     listen       80;       # 配置監聽的端口
     server_name  localhost;    # 配置的域名
      
     # location段配置信息
     location / {
      root   /usr/share/nginx/html;  # 網站根目錄
      index  index.html index.htm;   # 默認首頁文件
      deny 172.168.22.11;   # 禁止訪問的ip地址,可以為all
      allow 172.168.33.44;# 允許訪問的ip地址,可以為all
     }
     
     error_page 500 502 503 504 /50x.html;  # 默認50x對應的訪問頁面
     error_page 400 404 error.html;   # 同上
    }
}

常用命令

nginx -s reload  # 向主進程發送信號,重新加載配置文件,熱重啟
nginx -s reopen  # 重啟 
Nginxnginx -s stop    # 快速關閉
nginx -s quit    # 等待工作進程處理完成后關閉
nginx -T         # 查看當前 Nginx 最終的配置
nginx -t         # 檢查配置是否有問題`

demo

負載均衡

upstream myserver {
    server xxx.yyy.ppp.zzz:8080;
  server xxx.ppp.zzz.yyy:8082;
}

server {
            listen       80;
        server_name  208.208.111.222;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            proxy_pass   http://myserver;
            #proxy_pass   http://127.0.0.1:8081;
            index  index.html index.htm;


}

負載均衡策略

  1. 輪詢: 默認不用配置
  2. weight: 在upstream的每個server后面加上 weight=一個數字server xxx.yyy.ppp.zzz:8080 weight=10; 越大, 其百分比越高, 流量越多
  3. ip_hash: 按訪問 ip 的 hash 結果分配,優點這樣每個訪客固定訪問一個后端服務器

    a.
    image.png
  4. fair: 后端服務器的響應時間來分配請求,響應時間短的優先分配。

    a.
    image.png

nginx原理

角色

● nginx 啟動后,是由兩類進程組成的。master(管理者)和worker(工作者)。
● 一個nginx 只有一個master。但可以有多個worker

image.png

image.png

優點:

● 首先,對于每個 worker 進程來說,獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷, 同時在編程以及問題查找時,也會方便很多。
● 可以使用 nginx –s reload 熱部署,利用 nginx 進行熱部署操作
● 其次,采用獨立的進程,可以讓互相之間不會 影響,一個進程退出后,其它進程還在工作,服務不會中斷,master 進程則很快啟動新的 worker 進程。當然,worker 進程的異常退出,肯定是程序有 bug 了,異常退出,會導致當 前 worker 上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。

優點

● 首先,對于每個 worker 進程來說,獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷, 同時在編程以及問題查找時,也會方便很多。
● 可以使用 nginx –s reload 熱部署,利用 nginx 進行熱部署操作
● 其次,采用獨立的進程,可以讓互相之間不會 影響,一個進程退出后,其它進程還在工作,服務不會中斷,master 進程則很快啟動新的 worker 進程。當然,worker 進程的異常退出,肯定是程序有 bug 了,異常退出,會導致當 前 worker 上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。

配置調優

cpu配置
Nginx 同 redis 類似都采用了 io 多路復用機制,每個 worker 都是一個獨立的進程,但每個進 程里只有一個主線程,通過異步非阻塞的方式來處理請求, 即使是千上萬個請求也不在話 下。每個 worker 的線程可以把一個 cpu 的性能發揮到極致。所以 worker 數和服務器的 cpu 數相等是最為適宜的。設少了會浪費 cpu,設多了會造成 cpu 頻繁切換上下文帶來的損耗.

worker_connection配置
瀏覽器都是并發訪問服務的, 即同時建立多個tcp連接, 4~6個. 也就是對于一個客戶端, nginx要被占用4~6個連接
另外對于反向代理(負載均衡), 背后的每個服務器都會與nginx建立連接, 即每個nginx worker消耗的連接數為服務器的個數.

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容