1. 程式人生 > 實用技巧 >20201216 Nginx - 拉勾教育

20201216 Nginx - 拉勾教育

Nginx 基礎回顧

  • Nginx 是一個高效能的 HTTP 和反向代理 web 伺服器,核心特點是佔有記憶體少,併發能力強
  • Nginx 應用場景
    • Http 伺服器(Web伺服器)
    • 反向代理伺服器
      • 正向代理
        • 在瀏覽器中配置代理伺服器的相關資訊,通過代理伺服器訪問目標網站,代理伺服器收到目標網站的響應之後,會把響應資訊返回給我們自己的瀏覽器客戶端
      • 反向代理
        • 瀏覽器客戶端傳送請求到反向代理伺服器(比如 Nginx ),由反向代理伺服器選擇原始伺服器提供服務獲取結果響應,最終再返回給客戶端瀏覽器
    • 負載均衡伺服器
    • 動靜分離
  • Nginx 的特點
    • 跨平臺
    • Nginx 的上手非常容易,配置也比較簡單
    • 高併發,效能好
    • 穩定性也特別好,宕機概率很低
  • Nginx 主要命令
    • ./nginx 啟動 nginx
    • ./nginx -s stop 終止 nginx (當然也可以找到 nginx 程序號,然後使用 kill -9 殺掉 nginx 程序)
    • ./nginx -s reload (重新載入 nginx.conf 配置檔案)

安裝 Nginx

  1. 下載 Nginx

    下載頁面 ,選擇 Stable version

  2. 安裝 Nginx 依賴, pcre 、 openssl 、 gcc 、 zlib (推薦使用 yum 源自動安裝)

    yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel  
    
  3. 將 Nginx 壓縮包解壓

    tar -zxvf nginx-1.18.0.tar.gz
    
  4. 編譯安裝 Nginx

    cd nginx-1.18.0
    ./configure
    make
    make install
    
  5. 完畢之後在 /usr/local/ 下會產生一個 nginx 目錄,包含目錄

    • conf
    • html
    • logs
    • sbin

Nginx 核心配置檔案解讀

  • Nginx 的核心配置檔案 conf/nginx.conf 包含三塊內容:
  • 全域性塊
    • 從配置檔案開始到 events 塊之間的內容,此處的配置影響 nginx 伺服器整體的執行,比如 worker 程序的數量、錯誤日誌的位置等
  • events 塊
    • events 塊主要影響 nginx 伺服器與使用者的網路連線,比如 worker_connections 1024 ,標識每個 workderprocess 支援的最大連線數為 1024
  • http 塊
    • http 塊是配置最頻繁的部分,虛擬主機的配置,監聽埠的配置,請求轉發、反向代理、負載均衡等

Nginx 應用場景之反向代理

  1. 啟動 Linux 內的 tomcat

  2. 修改 Nginx 配置

    location / {
        proxy_pass http://localhost:8080;
        # root   html;
        # index  index.html index.htm;
    }
    
  3. 重新載入 Nginx 配置

    ./nginx -s reload
    
  4. 訪問 http://192.168.181.130/ ,出現 Tomcat 頁面

location 語法如下:

location [=|~|~*|^~] /uri/ { … }

在 nginx 配置檔案中, location 主要有這幾種形式:

  1. 精確匹配 location = /lagou { }

  2. 匹配路徑的字首 location ^~ /lagou { }

  3. 不區分大小寫的正則匹配 location ~* /lagou { }

  4. 正則匹配 location ~ /lagou { }

  5. 普通路徑字首匹配 location /lagou { }

Nginx 應用場景之負載均衡

負載均衡:

upstream lagouServer {
    server localhost:8080;
    server localhost:8090;
}

設定權重:

upstream lagouServer {
    server localhost:8080 weight=1;
    server localhost:8090 weight=3;
}

ip_hash:

upstream lagouServer {
	ip_hash;
    server localhost:8080;
    server localhost:8090;
}

Nginx 應用場景之動靜分離

  • 動靜分離就是講動態資源和靜態資源的請求處理分配到不同的伺服器上,比較經典的組合就是 Nginx+Tomcat 架構( Nginx 處理靜態資源請求, Tomcat 處理動態資源請求)

location /static {
    root   staticData;
}
  • http://192.168.181.130/static/1.html 對應 /usr/local/nginx/staticData/static/1.html

Nginx 底層程序機制剖析

  • Nginx 啟動後,以 daemon 多程序方式在後臺執行,包括一個 Master 程序和多個 Worker 程序
  • master 程序
    • 主要是管理 worker 程序,比如:接收外界訊號向各 worker 程序傳送訊號(singal) ./nginx -s reload
    • 監控 worker 程序的執行狀態,當 worker 程序異常退出後 Master 程序會自動重新啟動新的 worker 程序等
  • worker 程序
    • worker 程序具體處理網路請求。多個 worker 程序之間是對等的,他們同等競爭來自客戶端的請求, 各程序互相之間是獨立的。一個請求,只可能在一個 worker 程序中處理,一個 worker 程序,不可能處理其它程序的請求。 worker 程序的個數是可以設定的,一般設定與機器 cpu 核數一致。

./nginx -s reload 來說明 nginx 訊號處理這部分

  1. master 程序對配置檔案進行語法檢查
  2. 嘗試配置(比如修改了監聽埠,那就嘗試分配新的監聽埠)
  3. 嘗試成功則使用新的配置,新建 worker 程序
  4. 新建成功,給舊的 worker 程序傳送關閉訊息
  5. 舊的 worker 程序收到訊號會繼續服務,直到把當前程序接收到的請求處理完畢後關閉

所以 reload 之後 worker 程序 pid 是發生了變化的

worker 程序處理請求部分的說明:

  • 例如,我們監聽 9003 埠,一個請求到來時,如果有多個 worker 程序,那麼每個 worker 程序都有可能處理這個連結。
  • master 程序建立之後,會建立好需要監聽的的 socket ,然後從 master 程序再 fork 出多個 worker 程序。所以,所有 worker 程序的監聽描述符 listenfd 在新連線到來時都變得可讀。
  • nginx 使用互斥鎖來保證只有一個 workder 程序能夠處理請求,拿到互斥鎖的那個程序註冊 listenfd 讀事件,在讀事件裡呼叫 accept 接受該連線,然後解析、處理、返回客戶端

Nginx 多程序模型好處:

  • 每個 worker 程序都是獨立的,不需要加鎖,節省開銷
  • 每個 worker 程序都是獨立的,互不影響,一個異常終止,其他的照樣能提供服務
  • 多程序模型為 reload 熱部署機制提供了支撐

參考資料