Nginx 面試題總結大全

香吧香發表於2023-05-03

轉載請註明出處:

  1 介紹下nginx特點與常用模組

  2 nginx特點詳細

  3 反向代理和正向代理

  4 負載均衡策略有哪些

  5 Nginx如何實現動靜分離? 

  6 Nginx 常用命令有哪些?

  7 Nginx 程式模型

  8 nginx是四層協議還是七層的 

  9 nginx如何自定義負載均衡 

  10 如何自定義根據cpu的執行情況進行負載均衡配置

 

1 介紹下nginx特點與常用模組

  Nginx是一款高效能的開源Web服務軟體,採用事件驅動的非同步非阻塞處理機制,能夠快速處理大量的併發連線。其主要原理是基於事件驅動和非同步非阻塞I/O處理機制。

Nginx常用模組:

  1. HTTP模組:實現HTTP伺服器和反向代理。

  2. Stream模組:實現TCP和UDP協議的代理和轉發,支援四層負載均衡。

  3. Mail模組:實現郵件代理和反向代理。

  4. Event模組:實現事件驅動的非同步非阻塞I/O機制。

  5. Upstream模組:實現反向代理、負載均衡和故障轉移等。

  6. Rewrite模組:實現URL重寫和HTTP頭部修改等功能。

  7. Cache模組:實現HTTP響應快取功能。

  8. SSL模組:實現HTTPS協議的支援和管理SSL證照。

2 nginx特點詳細

  1. 記憶體佔用非常少 :一般情況下,10000 個非活躍的 HTTP Keep-Alive 連線在 Nginx 中僅消耗 2.5MB 的記憶體,這是 Nginx 支援高併發連線的基礎。

  1. 高併發 : 單機支援 10 萬以上的併發連線

  1. 跨平臺 :可以執行在 Linux,Windows,FreeBSD,Solaris,AIX,Mac OS 等作業系統上。

  1. 擴充套件性好 :第三方外掛非常多!

  1. 安裝使用簡單 :對於簡單的應用場景,我們很快就能夠上手使用。

  2. 穩定性好 :bug 少,不會遇到各種奇葩的問題。

  3. 免費 :開源軟體,免費使用。

3 反向代理和正向代理

  反向代理:客戶端將請求傳送到反向代理伺服器,由反向代理伺服器去選擇目標伺服器,獲取資料後再返回給客戶端。對外暴露的是反向代理伺服器地址,隱藏了真實伺服器 IP 地址。反向代理“代理”的是目標伺服器,這一個過程對於客戶端而言是透明的。

  正向代理:看作是一個位於客戶端和目標伺服器之間的代理伺服器,其主要作用就是轉達客戶端請求從目標伺服器上獲取指定的內容。

  詳細可見連結:https://www.cnblogs.com/taostaryu/p/10547132.html

4 負載均衡

  Nginx 可以將接收到的客戶端請求以一定的規則(負載均衡策略)均勻地分配到這個伺服器叢集中所有的伺服器上,這個就叫做 負載均衡。

  除此之外,Nginx 還帶有健康檢查(伺服器心跳檢查)功能,會定期輪詢向叢集裡的所有伺服器傳送健康檢查請求,來檢查叢集中是否有伺服器處於異常狀態。

常用的負載均衡策略:輪詢,加權隨機,IP雜湊,最小連線數

  1. 輪詢(round-robin):按順序將請求分配給不同的伺服器,保證每個伺服器都平均分擔負載。

  2. IP hash:將相同的IP請求分配給同一臺伺服器,這樣可以確保使用者的請求始終傳送給相同的伺服器。

  3. 帶權重的輪詢(weighted round-robin):根據伺服器的配置權重,將請求分配給伺服器。配置權重越高的伺服器,處理請求的次數就越多。

  4. 最小連線數(least connections):將請求分配給當前連線數最少的伺服器,以確保客戶端獲得更快的響應。

  5. URL hash:根據請求的URL的雜湊值,將請求傳送給特定的伺服器,以實現特定的會話複製或者將特定請求路由到特定的伺服器上。

  6. 會話保持(sticky session):將來自同一客戶端的請求路由到同一伺服器上,這樣可以確保客戶端獲得一致的體驗。

  需要注意的是,在選擇負載均衡策略時,需要考慮到客戶端請求的性質以及伺服器的實際情況,以選擇最適合的負載均衡策略。

5 Nginx如何實現動靜分離?

  Nginx可以透過配置檔案中的location指令來實現動靜分離,具體實現方式為將靜態資源(如圖片、CSS、JS等)和動態資源(如PHP、ASP等)分別存放在不同的目錄下,然後透過Nginx的location指令將請求分發到不同的伺服器中處理。

  動靜分離是指將靜態資源和動態資源分開處理,提高Web應用程式的效能。

http {
    # 配置靜態資源路徑
    server {
        listen 80;
        server_name www.example.com;
        root /var/www/static;
        location / {
            # 靜態資源快取
            expires 5m;
        }
        # 配置日誌
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
    }
    # 配置動態資源路徑
    server {
        listen 80;
        server_name api.example.com;
        root /var/www/dynamic;
        location / {
            # 反向代理到後端伺服器
            proxy_pass http://localhost:8080;
        }
        # 配置日誌
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
    }
}

   上面的配置中,將靜態資源存放在/var/www/static目錄下,動態資源存放在/var/www/dynamic目錄下。靜態資源的訪問路徑是www.example.com,動態資源的訪問路徑是api.example.com。在靜態資源的配置中,使用expires指令設定了靜態資源快取時間為5分鐘,在動態資源的配置中,使用proxy_pass指令反向代理到後端伺服器。同時,還配置了訪問日誌和錯誤日誌。

6 Nginx 常用命令有哪些?

●啟動 nginx 。

●停止 nginx -s stop 或 nginx -s quit 。

●過載配置 ./sbin/nginx -s reload(平滑重啟) 或 service nginx reload 。

●過載指定配置檔案 .nginx -c /usr/local/nginx/conf/nginx.conf 。

●檢視 nginx 版本 nginx -v 。

●檢查配置檔案是否正確 nginx -t 。

●顯示幫助資訊 nginx -h 。

7 Nginx 程式模型

  Nginx 啟動後,會產生一個 master 主程式,主程式執行一系列的工作後會產生一個或者多個工作程式 worker 程式。master 程式用來管理 worker 程式, worker 程式負責處理網路請求。也就是說 Nginx 採用的是經典的 master-worker 模型的多程式模型 。

8 nginx是四層協議還是七層的

  在網路協議中,四層協議主要指傳輸層協議,如TCP、UDP等,而七層協議主要指應用層協議,如HTTP、HTTPS、SMTP、FTP等。因此,我們可以透過協議的特徵來判斷是四層還是七層協議。

  對於四層協議,其主要特徵是對IP地址和埠號進行轉發和負載均衡。例如,當我們使用Nginx作為TCP負載均衡伺服器時,Nginx會根據客戶端請求的IP地址和埠號,將請求轉發到後端的伺服器上。

  而對於七層協議,其主要特徵是可以對應用層協議進行轉發和負載均衡。例如,當我們使用Nginx作為HTTP反向代理伺服器時,Nginx會根據客戶端請求的HTTP頭部資訊,將請求轉發到後端的Web伺服器上。在這種情況下,Nginx不僅僅負責傳輸層的負載均衡,還可以對HTTP協議進行解析和轉發。

  因此,我們可以透過觀察負載均衡伺服器的配置和行為來判斷其是四層協議還是七層協議。如果只對IP地址和埠號進行負載均衡,則是四層協議;如果可以對應用層協議進行解析和轉發,則是七層協議。

 

9 nginx如何自定義負載均衡

  在Nginx中,可以透過配置檔案自定義負載均衡策略。具體步驟如下:

  1. 首先,在Nginx配置檔案中定義一個upstream模組,並設定負載均衡策略和後端伺服器列表,例如:

upstream myapp {
    server backend1.example.com weight=3;
    server backend2.example.com;
    server backend3.example.com;
    hash $remote_addr consistent;
}

  其中,myapp是一個自定義的upstream名稱,backend1.example.com、backend2.example.com、backend3.example.com是後端伺服器的地址或域名。weight=3表示給backend1.example.com設定權重為3,而backend2.example.com和backend3.example.com的權重預設為1。hash $remote_addr consistent表示採用基於客戶端IP地址的一致性雜湊演算法進行負載均衡。

2. 然後,在server模組中配置具體的代理規則,將請求代理到upstream中定義的伺服器列表中,例如:

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://myapp;
    }
}

  其中,proxy_pass http://myapp表示將請求代理到myapp定義的伺服器列表中進行負載均衡。

3. 最後,重新載入Nginx配置檔案,使其生效:
sudo nginx -s reload

  Nginx支援多種負載均衡策略,例如輪詢(預設)、IP雜湊、URL雜湊、加權輪詢等。可以根據實際情況選擇不同的負載均衡策略,並根據需要調整後端伺服器列表的權重等引數,以實現自定義的負載均衡策略。

10 如何自定義根據cpu的執行情況進行負載均衡配置

   可以使用Nginx的ngx_http_upstream_module模組和Lua指令碼語言實現根據CPU的執行情況進行負載均衡配置。具體步驟如下:

  1. 安裝ngx_http_lua_module模組,該模組提供了在Nginx中執行Lua指令碼的能力。

  2. 在Nginx配置檔案中定義upstream模組,並設定負載均衡策略和後端伺服器列表,例如:

upstream myapp {
    server backend1.example.com;
    server backend2.example.com;
}

 3. 在server模組中定義Lua指令碼,並在其中編寫根據CPU執行情況進行負載均衡的程式碼,例如:

server {
    listen 80;
    server_name example.com;
    location / {
        access_by_lua_block {
            local status = require "ngx.status"
            local cpu = status.get_cpu()
            local servers = ngx.shared.servers
            local peer = servers:get(cpu)
            if not peer then
                local peers = {"backend1.example.com", "backend2.example.com"}
                local index = cpu % #peers + 1
                peer = peers[index]
                servers:set(cpu, peer, 60 * 5) -- 快取5分鐘
            end
            ngx.var.backend = peer
        }
        proxy_pass http://$backend;
    }
}

  4.在Nginx配置檔案中新增shared_dict指令,用於共享伺服器列表和CPU狀態資訊:

http {
    lua_shared_dict servers 1m;
    lua_shared_dict status 1m;
    ...
}

  5.最後,重新載入Nginx配置檔案,使其生效:

sudo nginx -s reload

  該方法僅僅是一個參考,真實場景下,CPU的負載情況並不是唯一的考慮因素,還需要考慮網路延遲、後端伺服器的效能、負載均衡的穩定性等因素。

 

相關文章