當前位置: 妍妍網 > 碼農

3 萬字 25 道 Nginx經典面試題總結

2024-07-15碼農

回復1024,獲取20萬字585道Java經典面試題pdf

大家好,我是哪咤。

本系列是【 10萬字208道Java經典面試題總結(附答案) 】的2024修訂版。

1、什麽是Nginx

Nginx是一個開源的高效能Web伺服器和反向代理伺服器。它由Igor Sysoev於2004年首次釋出,旨在解決C10K問題(即單個伺服器同時處理10,000個客戶端連線的挑戰)。以下是Nginx的主要特點和用途:

(1)架構:

  • 采用事件驅動的異步非阻塞架構

  • 使用多行程模型,每個工作行程可以處理數千個連線

  • (2)功能:

  • Web伺服器:處理HTTP、HTTPS和其他協定的請求

  • 反向代理:將請求轉發到其他伺服器

  • 負載均衡器:在多個後端伺服器之間分配流量

  • 內容緩存:緩存靜態和動態內容以提高效能

  • (3)效能:

  • 高並行處理能力

  • 低記憶體占用 -高效的靜態檔服務

  • (4)可延伸性:

  • 模組化設計,支持第三方模組

  • 靈活的配置系統

  • (5)安全性:

  • 支持SSL/TLS加密

  • 可配置存取控制和身份驗證

  • (6)其他功能:

  • HTTP/2支持

  • WebSocket支持

  • 信件代理伺服器功能

  • Nginx因其效能、穩定性和功能豐富而廣受歡迎,被用於從小型網站到大型互聯網公司的各種場景中。它常被用作Web伺服器、反向代理、負載均衡器,以及在微服務架構中的重要元件。

    2、Nginx的主要用途有哪些

    Nginx作為一款高效能的HTTP伺服器和反向代理伺服器,具有多種用途,廣泛套用於現代Web架構中。以下是Nginx的主要用途:

    (1)Web伺服器

    Nginx可以作為一個高效能的Web伺服器,主要用於提供靜態內容和處理動態內容的請求。它擅長處理靜態檔,如HTML、CSS、JavaScript、圖片和視訊等,效能非常高。

    (2)反向代理伺服器

    Nginx常用作反向代理伺服器,代理客戶端請求到後端伺服器,並將伺服器的響應返回給客戶端。這種設定有助於提高安全性、隱藏後端伺服器的細節、分擔負載並提高效能。

    (3)負載均衡器

    Nginx可以配置為負載均衡器,將客戶端請求分發到多個後端伺服器。它支持多種負載均衡演算法,如輪詢(Round Robin)、最少連線(Least Connections)、IP哈希(IP Hash)等,能夠提高套用的可用性和效能。

    (4)HTTP緩存

    Nginx可以作為一個緩存伺服器,緩存後端伺服器的響應,從而減少對後端伺服器的請求,提高響應速度和減少延遲。Nginx的緩存功能可以顯著提升Web套用的效能,特別是在處理大量靜態資源時。

    (5)SSL/TLS終止

    Nginx可以處理SSL/TLS終止,將HTTPS請求解密後再轉發到後端伺服器。這種方式可以減輕後端伺服器的負擔,聯集中管理SSL證書。

    (6)內容分發網路(CDN)

    Nginx可以作為CDN的邊緣伺服器,緩存和分發靜態內容。它能有效地減少伺服器的負載,提高內容分發的速度和效率。

    (7)API閘道器

    在微服務架構中,Nginx可以作為API閘道器,處理來自客戶端的API請求,並將這些請求轉發到相應的後端服務。API閘道器還可以執行認證、授權、流量控制和監控等功能。

    (8)動靜分離

    Nginx可以將動態請求和靜態請求分離處理。例如,將靜態資源(如圖片、CSS、JS檔)直接由Nginx處理,而將動態請求(如PHP、Python等)轉發到套用伺服器處理。

    (9)HTTP/2支持

    Nginx支持HTTP/2協定,能夠提高網頁載入速度和資源載入效率,特別是在多資源載入時顯著提高使用者體驗。

    (10)安全防護

    Nginx可以配置存取控制、IP黑名單和白名單、請求限速等功能,幫助抵禦DDoS攻擊、暴力破解等安全威脅。

    (11)信件代理

    Nginx還支持作為IMAP、POP3和SMTP信件代理伺服器,用於信件服務的負載均衡和反向代理。

    (12)URL重寫和重新導向

    Nginx提供強大的URL重寫和重新導向功能,可以根據規則重寫請求URL或進行重新導向,這對於SEO最佳化和網站遷移非常有用。

    (13)日誌管理

    Nginx可以記錄詳細的存取日誌和錯誤日誌,支持自訂日誌格式,便於運維人員進行監控和問題排查。

    (14)微服務架構

    在微服務架構中,Nginx可以用於服務發現、負載均衡、流量管理和跨域資源共享(CORS)。

    (15)總結

    Nginx因其高效能、靈活性和豐富的功能集,成為現代Web開發和運維中的重要元件。無論是作為Web伺服器、反向代理、負載均衡器,還是作為API閘道器、緩存伺服器等,Nginx都能出色地完成任務,提高Web套用的效能和可靠性。

    3、Nginx和Apache的區別是什麽

    Nginx和Apache是兩款廣泛使用的Web伺服器軟體,它們在設計架構、效能表現、使用場景和功能特性等方面有顯著的區別。

    以下是詳細的比較:

    (1)設計架構

  • Nginx,采用時間驅動和異步非阻塞架構。Nginx使用少量或單個的工作行程,每個行程可以處理成千上萬的並行連線。這種架構使得Nginx在處理高並行請求時具有極高的效能和資源消耗。

  • Apache,采用行程驅動和執行緒驅動的架構。Apache提供了多種多路復用模型(Prefork、Worker、Event),每個請求通常由一個獨立的行程或執行緒處理,這在高並行的情況下可能導致較高的資源消耗。

  • (2)效能

  • Nginx,在高並行場景下,表現尤為出色,能夠高效處理大量並行連線而不會消耗大量的系統資源,適合高流量的網站和套用;

  • Apache,在低並行場景下,表現尚可,處理高並行時,效能較差系統資源消耗較大。

  • (3)配置和擴充套件性

  • Nginx,透過純文本方式配置,如果執行時修改了Nginx配置檔,可以透過重新載入 nginx -s reload ,這個命令會使Nginx重新讀取配置檔,而不需要停止服務。

  • Apache,與Nginx不同,修改Apache配置檔,通常需要重新開機服務,Apache支持平滑重新開機 apachectl graceful ,這種方式讓Apache主行程重新讀取配置檔,並允許現有的連線繼續處理完畢,而不會中斷當前的服務。

  • (4)靜態內容處理

  • Nginx,可以直接從檔案系統讀取並返回檔,效能極高;

  • Apache,在高並行場景下,效率不如Nginx

  • (5)動態內容處理

  • Nginx,通常透過FastCGI、uWSGI、SCGI或HTTP反向代理與外部服務(如PHP-FPM、Python WSGI套用)通訊來處理動態內容。

  • Apache,可以直接透過內部模組(如mod_php、mod_python、mod_perl)處理動態內容,減少了中間通訊的開銷。

  • (6)反向代理和負載均衡

  • Nginx,內建強大的反向代理和負載均衡功能,支持多種負載均衡演算法(輪詢、最少連線、IP哈希)和健康檢查功能;

  • Apache,透過模組(如mod_proxy、mod_proxy_balancer)提供反向代理和負載均衡功能,但配置相對復雜,效能和靈活性不如Nginx。

  • (7)SSL/TLS處理

  • Nginx,高效處理SSL/TLS連線,支持SSL會話緩存和會話票證,能夠減少SSL握手的開銷;

  • Apache,也支持SSL/TLS,但效能和配置的簡便性不如Nginx。

  • (8)使用場景

  • Nginx,適合高並行、需要快速響應的場景,如反向代理、負載均衡、靜態檔伺服器、內容分發網路(CDN)等。

  • Apache,適合需要靈活配置、動態內容處理的場景,如Web套用開發環境、需要大量模組支持的套用等。

  • 4、修改Nginx配置檔,需要重新開機Nginx嗎,為什麽

    修改Nginx配置檔,一般不需要重新開機Nginx,透過重新載入 nginx -s reload 就可以操作,這個命令會使Nginx重新讀取配置檔並載入。

    從工作原理分析,為什麽?

    Nginx使用主行程-工作行程的模式,重新載入時,主行程會讀取新的配置檔,然後它會優雅的關閉舊的工作行程,並重新開機新的工作行程。

    新的工作行程使用新的配置檔,而舊的工作行程處理完當前請求後會自動結束。

    也可以透過平滑重新開機 systemctl restart nginx 的方式重新開機,這種方式會等待所有連線處理完畢後重新開機,確保現有連線不會被中斷。

    5、重新開機Nginx有幾種方式,有哪些不同?

    (1)重新載入

  • 命令:nginx -s reload 或 sudo systemctl reload nginx

  • 特點:不會中斷現有連線

  • 適用情況:適用於大多數修改配置檔的情況,比如添加新站點、修改反向代理設定、更新負載均衡等

  • (2)平滑重新開機

  • 命令:nginx -s reload 或 sudo systemctl reload nginx

  • 特點:不會中斷現有連線,等現有連線執行完畢後再關閉

  • 適用情況:修改大多數配置項,需要套用新配置但不想中斷服務

  • (3)完全重新開機

  • 命令:sudo systemctl restart nginx 或 sudo service nginx restart

  • 特點:停止所有Nginx行程,然後重新啟動,會中斷所有當前請求連線

  • 適用情況:

    1. 安裝新的Nginx版本

    2. 添加或刪除核心模組

    3. 修改需要完全重新開機才能生效的全域配置

    (4)強制重新開機

  • 命令:sudo systemctl restart nginx 或 sudo service nginx restart

  • 特點:完全停止服務後重新啟動,不會等待當前請求處理完成,重新載入所有配置和模組

  • 適用情況:

    1. Nginx行程出現異常,無法正常響應其他重新開機命令時;

    2. 系統資源出現問題,需要完全釋放並重新分配。

    6、熱升級的命令、特點、適用場景都是什麽

    (1)命令

    ① 驗證新的Nginx二進制檔:

    /path/to/new/nginx -t

    ② 啟動新的Nginx主行程:

    /path/to/new/nginx -c /path/to/nginx.conf -g "daemon off;"

    ③ 向當前Nginx主行程發送 USR2 訊號:

    kill -USR2 `cat /path/to/nginx.pid`

    ④ 向舊的Nginx主行程發送 WINCH 訊號:

    kill -WINCH `cat /path/to/oldnginx.pid`

    ⑤ 在確認新版本執行正常後,向舊的Nginx主行程發送 QUIT 訊號

    kill -QUIT `cat /path/to/oldnginx.pid.oldbin`

    (2)特點

    1. 不中斷服務:熱升級過程中,現有的Nginx行程會繼續處理現有的連線,新行程會處理新的連線,從而保證服務的連續性。

    2. 零停機時間:與完全停止和啟動不同,熱升級不會中斷現有連線,適用於需要高可用性的生產環境。

    3. 並列執行:舊的和新的Nginx主行程可以同時執行一段時間,允許平滑過渡和問題回滾。

    (3)適用場景

    1. 升級Nginx版本:在需要升級Nginx版本但不希望中斷服務的情況下,熱升級是最優選擇。

    2. 重大配置更改:當配置更改涉及到核心模組或對現有連線影響較大時,使用熱升級可以確保現有連線的穩定性和新配置的套用。

    3. 高可用性要求:在金融、電子商務、線上遊戲等對服務連續性要求極高的行業,熱升級可以最大限度地減少服務中斷風險。

    7、平滑重新開機和熱升級有什麽不同?

    (1)範圍

    1. 平滑重新開機主要針對配置更改,不中斷現有連線。

    2. 熱升級用於軟體版本的升級,不中斷服務。

    (2)復雜性

    1. 平滑重新開機操作簡單,適合常規的配置更改

    2. 熱升級更復雜,涉及多個步驟和手動幹預

    (3)回滾

    1. 平滑重新開機可以透過再次多載舊配置來回滾

    2. 熱升級需要更復雜的回滾過程,可能需要重新安裝舊版本

    8、根據 「3.7SSL/TLS處理」 拓展:什麽是SSL/TLS?有什麽特點?有什麽套用場景?

    SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是用於在網路上建立安全連線的加密協定。SSL是早期版本、TLS是SSL的升級版本。

    (1)SSL/TLS特點

    1. 數據加密,SSL/TLS使用對稱加密和非對稱加密技術來確保數據在傳輸過程中的機密性,只有通訊雙方能夠解密數據。

    2. 數據完整性,透過訊息摘要演算法(如SHA)確保數據在傳輸過程中沒有被篡改,每個封包都附帶一個哈希值,接收方可以驗證數據的完整性。

    3. 身份驗證,使用電子證書和公鑰基礎設施(PKI)來驗證通訊雙方的身份,確保數據被發送到指定的接收方。

    4. 防止重播攻擊,SSL/TLS使用會話金鑰和唯一會話ID來防止攻擊者重發舊的通訊數據。

    (2)SSL/TLS的套用場景

    1. HTTPS:最常見的套用場景,HTTPS用於保護Web瀏覽器和Web伺服器之間的通訊,確保使用者數據在傳輸過程中不被竊取和篡改。

    2. 電子信件:SSL/TLS用於保護電子信件傳輸協定(如IMAP、POP3、SMTP),確保信件客戶端和信件伺服器之間的通訊安全。

    3. 虛擬私人網路絡VPN:SSL/TLS用於VPN連線,確保遠端存取和數據傳輸的安全性。

    4. 檔傳輸:保護檔傳輸協定(FTP、SFTP),確保檔在傳輸過程中的機密性和完整性。

    5. 即時通訊:保護即時通訊中的數據傳輸。

    6. 線上支付:確保線上支付平台和使用者之間的交易數據安全。

    (3)SSL/TLS 的詳細流程

    1. 握手階段

  • 客戶端問候;客戶端發送支持的SSL/TLS版本、加密演算法、壓縮方法和隨機數。

  • 伺服器問候:伺服器選擇SSL/TLS版本、加密演算法、壓縮方法,並行送伺服器證書和隨機數。

  • 伺服器金鑰交換(可選):如果使用的加密演算法需要,伺服器會發送金鑰交換資訊。

  • 客戶端證書請求(可選):伺服器請求客戶端證書(雙向認證時使用)。

  • 伺服器問候完成:伺服器完成問候訊息。

  • 金鑰交換和證書驗證

  • 客戶端金鑰交換:客戶端生成一個預主金鑰,並使用伺服器的公鑰加密後發送給伺服器。

  • 證書驗證(可選):客戶端發送其證書(雙向認證時使用)。

  • 客戶端問候完成:客戶端發送訊息,表示其問候階段已完成。

  • 會話金鑰生成:客戶端和伺服器根據交換的預主金鑰和隨機數生成對稱會話金鑰,用於加密後續數據。

  • 數據傳輸:使用會話金鑰加密和解密傳輸的數據。

  • 關閉連線:結束SSL/TLS會話時,雙方發送關閉通知,並終止連線。

  • (4)總結

    SSL/TLS是現代互聯網通訊的基礎,為Web瀏覽、電子信件、檔傳輸、線上支付等提供了必要的安全保障。它們透過加密、身份驗證和數據完整性保護確保了網路通訊的機密性和安全性。

    9、如何安裝Nginx

    安裝Nginx的過程因作業系統不同而有所差異。

    以下是針對不同作業系統的Nginx安裝步驟:

    (1)在Ubuntu/Debian上安裝Nginx

    1. 更新包索引:sudo apt update

    2. 安裝Nginx:sudo apt install nginx

    3. 啟動Nginx:sudo systemctl start nginx

    4. 設定Nginx開機自啟:sudo systemctl enable nginx

    5. 檢查Nginx狀態:sudo systemctl status nginx

    (2)在CentOS/RHEL上安裝Nginx

    1. 安裝EPEL倉庫:sudo yum install epel-release

    2. 安裝Nginx:sudo yum install nginx

    3. 啟動Nginx:sudo systemctl start nginx

    4. 設定Nginx開機自啟:sudo systemctl enable nginx

    5. 檢查Nginx狀態:sudo systemctl status nginx

    (3)在macOS上安裝Nginx

    1. 安裝Homebrew: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

    2. 使用Homebrew安裝Nginx:brew install nginx

    3. 啟動Nginx:sudo nginx

    4. 設定Nginx開機自啟

    5. 檢查Nginx狀態:ps aux | grep nginx

    (4)在Windows上安裝Nginx

    1. 從Nginx官網下載適用於Windows的Nginx壓縮包。

    2. 將下載的壓縮包解壓到一個資料夾中,例如 C:\nginx。

    3. 開啟命令提示字元,導航到Nginx解壓目錄下的 sbin 目錄,然後執行: nginx.exe

    4. 設定Nginx開機自啟:可以建立一個Windows服務來管理Nginx的啟動和停止。可以使用 nssm(Non-Sucking Service Manager)來管理服務。

    (5)檢查Nginx是否安裝成功

    在瀏覽器中輸入 http://localhost,如果看到Nginx的歡迎頁面,說明Nginx已成功安裝並執行。

    10、Nginx有哪些基本命令?

    1. 啟動Nginx:sudo systemctl start nginx

    2. 停止Nginx:sudo systemctl stop nginx

    3. 重新啟動Nginx:sudo systemctl restart nginx

    4. 重新載入Nginx配置:sudo systemctl reload nginx

    5. 檢視Nginx狀態:sudo systemctl status nginx

    11、Nginx的配置檔路徑是什麽

    Nginx的預設配置檔路徑通常是: /etc/nginx/nginx.conf ,這是主配置檔的位置。

    Nginx通常還有一些其他重要的配置目錄和檔:

    1. /etc/nginx/conf.d/ - 這個目錄通常用於存放額外的配置檔;

    2. /etc/nginx/sites-available/ 和 /etc/nginx/sites-enabled/ - 這兩個目錄用於管理虛擬主機配置;

    3. /var/log/nginx/ - 日誌檔通常存放在這裏;

    4. /usr/share/nginx/html/ - 預設的網站根目錄。

    需要註意的是,這些路徑可能會根據你的具體安裝和系統設定而有所不同。如果你需要確認你系統上的具體路徑,可以使用以下命令: nginx -V ,這會顯示Nginx的編譯選項,其中包括配置檔的路徑。

    12、詳細介紹一下Nginx有哪些配置檔,它們的作用都是什麽?

    (1)/etc/nginx/nginx.conf

    Nginx的主配置檔。它包含全域設定,如工作行程數、日誌格式、預設的MIME型別等。通常,這個檔會包含一些 include 指令,用於引入其他配置檔。

    (2)/etc/nginx/conf.d/

    用於存放額外的配置檔。通常,主配置檔會包含一行 include /etc/nginx/conf.d/*.conf;,這樣就會自動載入該目錄下所有以 .conf 結尾的檔。這種方式使得配置更加模組化和易於管理。

    (3)/etc/nginx/sites-available/ 和 /etc/nginx/sites-enabled/

  • sites-available 目錄用於儲存所有的虛擬主機配置檔。

  • sites-enabled 目錄包含指向 sites-available 中實際要使用的配置檔的符號連結。這種設定允許您輕松地啟用或禁用特定的網站配置,而無需刪除配置檔。

  • (4)/var/log/nginx/

    Nginx預設的日誌目錄。通常包含兩種主要的日誌檔:

  • access.log: 記錄所有的HTTP請求

  • error.log: 記錄Nginx執行時的錯誤和警告

  • (5)/usr/share/nginx/html/

    Nginx預設的網站根目錄,存放網站檔。但在實際使用中,通常會在虛擬主機配置中指定其他位置作為網站根目錄。

    (6)/etc/nginx/mime.types

    這個檔定義了副檔名與MIME型別的對映關系,告訴Nginx如何正確地設定不同檔型別的Content-Type頭。

    (7)/etc/nginx/fastcgi_params 或 /etc/nginx/uwsgi_params

    包含用於與FastCGI或uWSGI伺服器通訊的參數設定,通常用於PHP或Python套用。

    13、Nginx的預設埠是什麽,如何更改Nginx的預設埠

    Nginx 的預設埠是 80,用於處理 HTTP 請求。如果你啟用了 HTTPS,則預設埠是 443。

    要更改 Nginx 的預設埠,你需要修改其配置檔。

    通常的步驟如下:

    (1)開啟 Nginx 配置檔

    配置檔通常位於 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default。你可以使用你喜歡的文字編輯器(如 vi、nano 等)開啟它。

    sudo nano /etc/nginx/sites-available/default

    (2)找到 server 塊並修改埠

    在配置檔中找到 server 塊,修改 listen 指令來更改埠號。例如,要將埠更改為 8080,修改如下:

    server {
    listen 8080;
    server_name your_domain_or_IP;
    location / {
    proxy_pass http://localhost:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    (3)保存並關閉檔

    保存檔並關閉編輯器。如果你使用的是 nano,按 Ctrl+X,然後按 Y 保存並按 Enter 結束。

    (4)測試配置

    測試 Nginx 配置檔以確保沒有錯誤:

    sudo nginx -t

    (5)重新載入 Nginx

    如果配置檔沒有錯誤,重新載入 Nginx 以套用更改:

    sudo systemctl reload nginx

    這樣,Nginx 就會在新的埠上監聽了。你可以透過瀏覽器存取 http://your_domain_or_IP:8080 來驗證更改。

    14、Nginx的主要配置指令有哪些

    指令 用途 指令用法
    核心配置指令
    worker_processes 設定 Nginx 使用的工作行程數。 worker_processes auto;
    error_log 指定錯誤日誌檔及其日誌級別。 error_log /var/log/nginx/error.log warn;
    pid 設定儲存 Nginx 主行程 ID 的檔路徑。 pid /var/run/nginx.pid;
    HTTP 配置指令
    include 包含其他配置檔。 include /etc/nginx/conf.d/*.conf;
    sendfile 啟用高效的檔傳輸方式。 sendfile on;
    keepalive_timeout 設定客戶端連線保持活動的超時時間。 keepalive_timeout 65;
    伺服器配置指令
    server 定義虛擬主機的配置資訊。 server{listen 80;server_name example.com;}
    server_name 設定伺服器名稱或網域名稱。 server_name example.com www.example.com;
    root 設定伺服器的根目錄。 root /var/www/html;
    index 設定預設的主頁檔。 index index.html index.htm;
    位置配置指令
    location 定義如何處理特定的 URL 請求。
    proxy_pass 配置反向代理的轉發地址。 location / {proxy_pass http://localhost:3000;}
    rewrite 用於 URL 重寫。 location / {rewrite ^/oldpath/(.*)1 permanent;}
    其他常見指令
    access_log 指定存取日誌檔及其格式。 access_log /var/log/nginx/access.log;
    gzip 啟用 gzip 壓縮。 gzip on;
    client_max_body_size 設定客戶端請求主體的最大大小。 client_max_body_size 10m;

    15、Nginx中的location指令有什麽作用

    在 Nginx 中,location 指令用於匹配 URI,並定義如何處理與這些 URI 相對應的請求。location 指令在伺服器塊 (server block) 中使用,它指定了 Nginx 應該如何處理某些路徑的請求。透過使用不同的 location 配置,可以對不同的 URL 路徑執行不同的操作,例如提供靜態檔、反向代理、重新導向等。

    (1)location 指令的基本語法

    location [modifier] [URI] {
    # 指令
    }

    (2)location 指令的修飾詞

    Nginx 提供了幾種不同的修飾詞,用於控制 location 指令的匹配行為:

    ① 無修飾詞:標準字首匹配。如果多個 location 塊匹配請求,Nginx 會選擇最長的匹配。

    location /images/ {
    # 指令
    }

    ② =:精確匹配。如果找到了精確匹配的 location 塊,Nginx 將停止搜尋並使用這個塊。

    location = /exact-match {
    # 指令
    }

    ③ ~:區分大小寫的正規表式匹配。

    location ~ \.php$ {
    # 指令
    }

    ④ ~*:不區分大小寫的正規表式匹配。

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    # 指令
    }

    ⑤ ^~:優先匹配。如果找到匹配的 location 塊,Nginx 將停止搜尋並使用這個塊,而不會再檢查正規表式匹配。

    location ^~ /static/ {
    # 指令
    }

    (3)location 指令的範例

    ① 提供靜態檔

    提供位於伺服器檔案系統上的靜態檔。

    server {
    listen 80;
    server_name example.com;
    location /images/ {
    root /var/www/html;
    }
    location / {
    root /var/www/html;
    index index.html;
    }
    }

    ② 反向代理

    將請求轉發到後端伺服器。

    server {
    listen 80;
    server_name example.com;
    location /api/ {
    proxy_pass http://backend_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    ③ 重新導向請求

    將請求重新導向到另一個 URL。

    server {
    listen 80;
    server_name example.com;
    location /old-path {
    return 301 /new-path;
    }
    location /new-path {
    root /var/www/html;
    index index.html;
    }
    }

    ④ 匹配特定檔型別

    為特定檔型別配置緩存和存取日誌。

    server {
    listen 80;
    server_name example.com;
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
    access_log off;
    }
    }

    (4)匹配優先級

    Nginx 按以下順序匹配 location 塊:

    1. 精確匹配 (=)。

    2. 字首匹配 (^~)。

    3. 正規表式匹配 (~ 或 ~*)。

    4. 標準字首匹配。

    以下是一個綜合範例,展示了如何使用不同的 location 修飾詞和匹配型別:

    server {
    listen 80;
    server_name example.com;
    # 精確匹配
    location = / {
    return 200 "This is the exact match for /";
    }
    # 優先字首匹配
    location ^~ /static/ {
    root /var/www/static;
    }
    # 區分大小寫的正則匹配
    location ~ \.php$ {
    proxy_pass http://php_backend;
    }
    # 不區分大小寫的正則匹配
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    access_log off;
    }
    # 標準字首匹配
    location / {
    root /var/www/html;
    index index.html;
    }
    }



    透過配置和使用 location 指令,Nginx 能夠靈活地處理各種型別的請求,從而實作高效的請求管理和處理。

    16、Nginx如何處理靜態檔

    Nginx 是一個高效的 HTTP 伺服器,特別適合處理靜態檔請求,如 HTML、CSS、JavaScript、影像和視訊檔。

    以下是 Nginx 處理靜態檔的主要配置步驟和相關指令:

    (1)配置根目錄

    首先,你需要設定 Nginx 伺服器的根目錄,這個目錄包含你的網站的靜態檔。

    server {
    listen 80;
    server_name example.com;
    root /var/www/html;
    index index.html index.htm;
    location / {
    try_files $uri $uri/ =404;
    }
    }

    (2)配置 location 指令

    location 指令用於定義如何處理特定路徑的請求。在處理靜態檔時,可以直接使用預設配置,Nginx 會在指定的 root 目錄中尋找檔。

    location / {
    try_files $uri $uri/ =404;
    }

    (3)啟用 Gzip 壓縮

    為了提高傳輸效率,你可以啟用 Gzip 壓縮。這將減少傳輸的檔大小,從而加快載入時間。

    http {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    }

    (4)設定緩存控制頭

    配置緩存控制頭可以幫助瀏覽器緩存靜態檔,從而減少伺服器負載並加快載入速度。

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
    }

    (5)處理不同型別的靜態檔

    你可以根據檔型別配置不同的處理方式。例如,對於圖檔、CSS 檔和 JavaScript 檔,設定不同的緩存時間或壓縮策略。

    location ~* \.(jpg|jpeg|png|gif|ico)$ {
    expires 30d;
    access_log off;
    }
    location ~* \.(css|js)$ {
    expires 7d;
    access_log off;
    add_header Cache-Control "public";
    }

    (6)設定預設文件

    你可以透過 index 指令設定預設文件,例如 index.html。

    location / {
    index index.html;
    }

    (7)處理404錯誤

    當請求的靜態檔不存在時,可以配置一個自訂的404錯誤頁面。

    error_page 404 /404.html;
    location = /404.html {
    internal;
    }

    (8)完整範例配置

    以下是一個完整的 Nginx 配置範例,用於處理靜態檔:

    server {
    listen 80;
    server_name example.com;
    root /var/www/html;
    index index.html index.htm;
    location / {
    try_files $uri $uri/ =404;
    }
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    access_log off;
    add_header Cache-Control "public";
    }
    location ~* \.(css|js)$ {
    expires 7d;
    access_log off;
    add_header Cache-Control "public";
    }
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    error_page 404 /404.html;
    location = /404.html {
    internal;
    }
    }




    17、Nginx如何實作反向代理

    Nginx 是一個強大的反向代理伺服器,它可以將客戶端請求轉發到後台伺服器,並將響應返回給客戶端。

    以下是實作反向代理的主要步驟和相關配置指令:

    (1)基本反向代理配置

    最簡單的反向代理配置是將所有請求轉發到後端伺服器。例如,將請求轉發到在 localhost:3000 上執行的應用程式:

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

    (2)設定代理頭

    在反向代理配置中,通常需要設定一些頭資訊,以確保後端伺服器能夠正確處理請求。例如:

    location / {
    proxy_pass http://localhost:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }

    (3)處理 WebSocket

    如果你的套用使用 WebSocket,需要在反向代理中添加額外的配置:

    location / {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }

    (4)配置負載均衡

    Nginx 還可以用作負載均衡器,將請求分配到多個後端伺服器。例如:

    upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    }
    server {
    listen 80;
    server_name example.com;
    location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    (5)設定代理超時

    配置代理超時,以避免後端伺服器響應過慢導致的問題:

    location / {
    proxy_pass http://localhost:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    send_timeout 60s;
    }

    (6)處理錯誤頁面

    配置自訂錯誤頁面,以便在後端伺服器不可用時提供友好的錯誤資訊:

    server {
    listen 80;
    server_name example.com;
    location / {
    proxy_pass http://localhost:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    error_page 502 /502.html;
    location = /502.html {
    internal;
    }
    }

    (7)完整範例配置

    upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    }
    server {
    listen 80;
    server_name example.com;
    location / {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    send_timeout 60s;
    }
    error_page 502 /502.html;
    location = /502.html {
    internal;
    }
    }


    18、Nginx如何實作負載均衡

    Nginx 是一個高效的負載均衡器,可以將客戶端請求分配到多個後端伺服器。

    以下是實作負載均衡的主要步驟和相關配置指令:

    (1)定義後端伺服器組

    首先,需要在 Nginx 配置中定義一組後端伺服器。可以使用 upstream 指令來完成這一點。

    upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    }

    (2)配置負載均衡策略

    Nginx 提供了幾種不同的負載均衡策略:

  • 輪詢(預設):按順序將請求分發到每個伺服器。

  • 權重:根據權重值分發請求。

  • IP哈希:根據客戶端 IP 地址分發請求。

  • 最少連線:將請求分發到當前活動連線數最少的伺服器。

  • (3)配置反向代理

    在伺服器塊中,使用 proxy_pass 指令將請求轉發到定義的後端伺服器組。

    server {
    listen 80;
    server_name example.com;
    location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    (4)健康檢查

    Nginx 支持簡單的被動健康檢查,可以透過配置 proxy_next_upstream 指令來實作。如果某個伺服器返回錯誤響應,Nginx 會將請求轉發到下一個伺服器。

    upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    }
    server {
    listen 80;
    server_name example.com;
    location / {
    proxy_pass http://backend;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    (5)完整範例配置

    upstream backend {
    least_conn;
    server backend1.example.com weight=3;
    server backend2.example.com weight=2;
    server backend3.example.com weight=1;
    }
    server {
    listen 80;
    server_name example.com;
    location / {
    proxy_pass http://backend;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    透過這些配置,Nginx 可以有效地將客戶端請求分發到多個後端伺服器,從而實作負載均衡,提高套用的可用性和效能。

    19、Nginx負載均衡有哪些演算法

    (1)輪詢(預設)

    這是 Nginx 的預設負載均衡策略,不需要額外配置。

    upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    }

    (2)權重

    透過設定伺服器的權重,可以控制請求分發的比例。

    upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com weight=2;
    server backend3.example.com weight=1;
    }

    (3)IP 哈希

    使用 ip_hash 指令,根據客戶端 IP 地址進行請求分發。

    upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    }

    (4)最少連線

    使用 least_conn 指令,將請求分發到當前活動連線數最少的伺服器。

    upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    }

    (5) URL 哈希

    根據請求的 URL 進行請求分發。需要使用 hash 指令指定哈希的鍵。

    upstream backend {
    hash $request_uri;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    }

    (6)隨機

    從兩個隨機選擇的伺服器中選擇一個連線數較少的伺服器來分發請求。這個演算法可以有效地平衡負載。

    upstream backend {
    random two least_conn;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    }

    透過這些配置,Nginx 可以根據不同的負載均衡演算法將客戶端請求高效地分發到多個後端伺服器,提高套用的可用性和效能。

    20、Nginx如何配置HTTPS

    配置 Nginx 使用 HTTPS 涉及生成或獲取 SSL/TLS 證書,並在 Nginx 配置檔中設定相關指令。

    以下是詳細的步驟:

    (1)獲取 SSL/TLS 證書

    你可以透過以下幾種方式獲取 SSL/TLS 證書:

  • 自簽名證書:用於測試或內部使用。

  • 從證書頒發機構(CA)獲取:用於生產環境。可以使用 Let's Encrypt 免費獲取證書。

  • (2)安裝證書和金鑰

    將你的證書檔和私鑰檔保存到伺服器上的一個安全位置。假設證書檔為 example.com.crt,私鑰檔為 example.com.key,它們儲存在 /etc/nginx/ssl/ 目錄中。

    (3)配置 Nginx 使用 HTTPS

    編輯你的 Nginx 配置檔(通常在 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default),添加或修改 server 塊以支持 HTTPS。

    以下是一個完整的範例配置:

    server {
    listen 80;
    server_name example.com www.example.com;
    # Redirect all HTTP requests to HTTPS
    return 301 https://$host$request_uri;
    }
    server {
    listen 443 ssl;
    server_name example.com www.example.com;
    # SSL certificate and key
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    # SSL settings
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    # Additional security headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;
    add_header X-XSS-Protection "1; mode=block";
    # Root and index files
    root /var/www/html;
    index index.html index.htm;
    location / {
    try_files $uri $uri/ =404;
    }
    # Proxy settings (if using as a reverse proxy)
    # location / {
    # proxy_pass http://backend_server;
    # proxy_set_header Host $host;
    # proxy_set_header X-Real-IP $remote_addr;
    # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # proxy_set_header X-Forwarded-Proto $scheme;
    # }
    }






    (4)測試和重新載入 Nginx

    配置完成後,測試 Nginx 配置檔以確保沒有語法錯誤:

    sudo nginx -t

    如果測試透過,重新載入 Nginx 以套用更改:

    sudo systemctl reload nginx

    (5)自動續期

    如果你使用 Let's Encrypt 獲取證書,可以使用 Certbot 自動管理證書續期。安裝 Certbot 並配置自動續期:

    sudo apt-get install certbot python3-certbot-nginx
    sudo certbot --nginx -d example.com -d www.example.com

    Certbot 將自動編輯 Nginx 配置檔並設定證書續期任務。

    透過這些步驟,Nginx 將配置為使用 HTTPS 提供安全的 Web 服務。

    21、如何在Nginx中設定虛擬主機

    在 Nginx 中設定虛擬主機(也稱為伺服器塊)允許你在同一台伺服器上托管多個網站。

    以下是詳細的步驟:

    (1)建立網站目錄

    首先,為每個網站建立一個獨立的目錄結構,例如:

    sudo mkdir -p /var/www/example.com/html
    sudo mkdir -p /var/www/test.com/html
    sudo chown -R $USER:$USER /var/www/example.com/html
    sudo chown -R $USER:$USER /var/www/test.com/html
    sudo chmod -R 755 /var/www

    然後建立一個簡單的 index.html 檔來測試每個站點:

    echo"<html><head><title>Welcome to example.com!</title></head><body><h1>Success! The example.com server block is working!</h1></body></html>" | sudo tee /var/www/example.com/html/index.html
    echo"<html><head><title>Welcome to test.com!</title></head><body><h1>Success! The test.com server block is working!</h1></body></html>" | sudo tee /var/www/test.com/html/index.html

    (2)配置 Nginx 虛擬主機檔

    在 /etc/nginx/sites-available/ 目錄中為每個站點建立一個配置檔。

    sudo nano /etc/nginx/sites-available/example.com

    添加以下內容:

    server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/example.com/html;
    index index.html;
    location / {
    try_files $uri $uri/ =404;
    }
    }

    然後為另一個站點建立類似的配置:

    sudo nano /etc/nginx/sites-available/test.com

    添加以下內容:

    server {
    listen 80;
    listen [::]:80;
    server_name test.com www.test.com;
    root /var/www/test.com/html;
    index index.html;
    location / {
    try_files $uri$uri/ =404;
    }
    }

    (3)啟用配置檔

    透過在 /etc/nginx/sites-enabled/ 目錄中建立符號連結來啟用配置檔:

    sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
    sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/

    (4)測試配置並重新載入 Nginx

    測試 Nginx 配置以確保沒有語法錯誤:

    sudo nginx -t

    如果測試透過,重新載入 Nginx 以套用更改:

    sudo systemctl reload nginx

    (5)更新 DNS 記錄

    確保你的網域名稱(如 example.com 和 test.com)的 DNS 記錄指向你的伺服器 IP 地址。

    (6)存取網站

    現在,你應該能夠透過在瀏覽器中存取 http://example.com 和 http://test.com 來檢視兩個獨立的網站。

    (7)HTTPS 配置(可選)

    如果你想為這些站點啟用 HTTPS,可以使用 Let's Encrypt 獲取免費的 SSL 證書。安裝 Certbot 並執行以下命令:

    sudo apt-get install certbot python3-certbot-nginx
    sudo certbot --nginx -d example.com -d www.example.com
    sudo certbot --nginx -d test.com -d www.test.com

    Certbot 將自動配置 Nginx 並設定證書續期任務。

    透過這些步驟,你可以在 Nginx 中成功設定多個虛擬主機,每個主機可以托管不同的網站。

    22、Nginx的工作模式有哪些

    Nginx 的工作模式主要涉及其行程模型和請求處理方式。

    (1)行程模型

    Nginx 使用多行程模型來處理請求,主要包括以下幾種行程:

  • Master 行程:負責管理 Worker 行程,處理配置檔的載入和熱重新開機等任務。

  • Worker 行程:實際處理客戶端請求,每個 Worker 行程都是獨立的。

  • Master 行程的主要職責是:

    1. 讀取和驗證配置檔。

    2. 管理 Worker 行程的生命周期(啟動、停止、重新開機)。

    3. 平滑地升級 Nginx 程式。

    Worker 行程的職責是:

    1. 接受客戶端連線。

    2. 處理和響應請求。

    在 Nginx 配置檔中,可以透過 worker_processes 指令設定 Worker 行程的數量:

    worker_processes auto;

    auto 表示根據 CPU 的核心數自動設定。

    (2)事件處理模型

    Nginx 支持多種事件驅動模型,這使得它在處理高並行請求時具有很高的效率。Nginx 透過 worker_connections 指令設定每個 Worker 行程可以同時處理的最大連線數。

    Nginx 支持以下事件模型:

  • select:標準的事件通知機制,在所有平台上都可用,但效能較差。

  • poll:類似於 select,但效能更好。

  • epoll:Linux 2.6+ 內核中的高效能事件通知機制。

  • kqueue:用於 FreeBSD、OpenBSD 和 macOS 的高效能事件通知機制。

  • /dev/poll:用於 Solaris 的事件通知機制。

  • eventport:用於 Solaris 10 的事件通知機制。

  • Nginx 會自動選擇最佳的事件模型,但你也可以手動指定:

    events {
    use epoll;
    worker_connections 1024;
    }

    (3)工作模式

    Nginx 的工作模式主要是指它在處理請求時的角色和方式,包括:

    ① 反向代理模式

    Nginx 作為反向代理伺服器,接收客戶端請求並將其轉發給後端伺服器,同時將後端伺服器的響應返回給客戶端。

    server {
    listen 80;
    server_name example.com;
    location / {
    proxy_pass http://backend_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    ② 負載均衡模式

    Nginx 可以分發客戶端請求到多個後端伺服器,實作負載均衡。

    upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    }
    server {
    listen 80;
    server_name example.com;
    location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    ③ 靜態檔服務模式

    Nginx 可以直接從檔案系統提供靜態檔服務,如 HTML、CSS、JavaScript、影像等。

    server {
    listen 80;
    server_name example.com;
    root /var/www/html;
    index index.html index.htm;
    location / {
    try_files $uri $uri/ =404;
    }
    }

    ④ Nginx 的模組化架構

    Nginx 的模組化架構允許它在不同的工作模式下使用不同的模組,以提供靈活和高效的服務。例如:

  • HTTP 模組:處理 HTTP 請求和響應。

  • Stream 模組:處理 TCP/UDP 流量。

  • Mail 模組:處理電子信件代理(SMTP/IMAP/POP3)。

  • 透過配置和使用這些模組,Nginx 可以在各種工作模式下提供高效的服務。

    (4)總結

    Nginx 的工作模式主要透過其行程模型和事件驅動模型實作,並且可以在反向代理、負載均衡和靜態檔服務等多種模式下高效工作。透過適當配置,Nginx 能夠處理高並行請求並提供可靠的服務。

    23、Nginx的事件驅動模型是什麽

    Nginx 的事件驅動模型是其高效處理並行連線和請求的核心機制之一。Nginx 透過事件驅動模型實作了非阻塞和異步 I/O 操作,使其能夠在高並行環境中保持高效能和低資源消耗。

    (1)事件驅動模型概述

    在 Nginx 中,事件驅動模型是指透過事件通知機制處理大量並行連線和請求。這些機制能夠在網路或檔 I/O 操作完成時通知 Nginx,從而避免阻塞等待。

    (2)常見的事件驅動機制

    Nginx 支持多種事件驅動機制,根據作業系統的不同選擇最合適的機制:

    1. select:一種標準的事件通知機制,支持所有平台,但效能較差。

    2. poll:類似於 select,但效能更好,適用於大多數 UNIX 系統。

    3. epoll:Linux 2.6+ 內核中的高效能事件通知機制,適用於大規模並行連線。

    4. kqueue:用於 FreeBSD、OpenBSD 和 macOS 的高效能事件通知機制。

    5. /dev/poll:用於 Solaris 的事件通知機制。

    6. eventport:用於 Solaris 10 的事件通知機制。

    (3)配置事件驅動模型

    Nginx 會自動選擇最佳的事件驅動機制,但你也可以手動指定。

    events {
    use epoll; # 使用 epoll 事件驅動機制
    worker_connections 1024; # 每個 worker 行程最大連線數
    }

    在這個範例中,我們顯式指定了 epoll 作為事件驅動機制,並設定每個 worker 行程最多處理 1024 個並行連線。

    (4)事件驅動模型的工作原理

    1. 事件迴圈:每個 worker 行程都有一個事件迴圈,持續監聽網路事件(如新連線、數據可讀或可寫等)。

    2. 事件註冊:當一個新的網路連線到達時,Nginx 會將該連線的檔描述符(FD)註冊到事件驅動機制中,並指定監聽的事件型別(如可讀、可寫)。

    3. 事件通知:當事件發生時(如數據到達或連線關閉),事件驅動機制會通知 Nginx,Nginx 將事件放入事件佇列中。

    4. 事件處理:Nginx 的事件迴圈從事件佇列中取出事件,並呼叫相應的處理常式進行處理。

    (5)高效的非阻塞 I/O

    Nginx 的事件驅動模型透過非阻塞 I/O 和異步事件通知機制,實作了高效的請求處理:

  • 非阻塞 I/O:Nginx 在處理 I/O 操作時不會阻塞,而是立即返回,允許其他操作繼續進行。當 I/O 操作完成時,透過事件通知機制通知 Nginx。

  • 異步事件通知:事件驅動機制會在事件發生時通知 Nginx,而不是讓 Nginx 輪詢檢查,這樣可以節省 CPU 資源,提高效能。

  • (6)負載均衡和反向代理中的事件驅動

    在負載均衡和反向代理場景中,Nginx 的事件驅動模型尤為重要,因為它需要處理大量的並行連線。透過使用高效的事件驅動機制,Nginx 能夠在高負載下保持低延遲和高吞吐量。

    (7)總結

    Nginx 的事件驅動模型是其高效能的關鍵,透過支持多種事件通知機制(如 epoll、kqueue 等),實作了非阻塞和異步 I/O 操作,使其能夠高效處理大量並行連線和請求。這種設計使 Nginx 成為一個強大而靈活的 HTTP 伺服器和反向代理伺服器,適用於各種高並行場景。

    24、如何最佳化Nginx的效能

    最佳化 Nginx 的效能可以從以下幾個方面入手,包括調整配置、最佳化系統參數、使用緩存和負載均衡等。

    (1)調整 Nginx 配置

    ① 增加 Worker 行程數

    將 worker_processes 設定為自動或根據 CPU 核心數設定適當的值,以充分利用多核 CPU 的效能。

    worker_processes auto;

    ② 調整 Worker 連線數

    增加 worker_connections 的值,以允許每個 Worker 行程處理更多的並行連線。

    events {
    worker_connections 4096;
    }

    ③ 最佳化緩沖區和佇列大小

    調整緩沖區大小和佇列參數,以處理大量請求數據。

    http {
    client_body_buffer_size 16K;
    client_max_body_size 8M;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;
    }

    (2)啟用 Gzip 壓縮

    啟用 Gzip 壓縮可以減少傳輸的數據量,提高頁面載入速度。

    http {
    gzip on;
    gzip_comp_level 5;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_min_length 256;
    }

    (3)使用緩存

    ① 啟用靜態檔緩存

    配置瀏覽器緩存頭,以減少伺服器負載並提高頁面載入速度。

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
    }

    ② 啟用代理緩存

    如果 Nginx 作為反向代理,可以啟用代理緩存。

    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
    server {
    location / {
    proxy_cache my_cache;
    proxy_pass http://backend_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    (4)最佳化系統參數

    ① 調整檔描述符限制

    增加檔描述符的限制,以允許更多的並行連線。

    ulimit -n 65535

    在 /etc/security/limits.conf 檔中添加:

    * soft nofile 65535
    * hard nofile 65535

    ② 調整 TCP 參數

    調整系統的 TCP 參數,以提高網路效能。

    在 /etc/sysctl.conf 檔中添加:

    net.core.somaxconn = 65535
    net.core.netdev_max_backlog = 65535
    net.ipv4.tcp_max_syn_backlog = 65535
    net.ipv4.ip_local_port_range = 1024 65000
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_fin_timeout = 15

    套用更改:

    sudo sysctl -p

    (5)啟用 HTTP/2

    HTTP/2 提供了更好的效能和效率,特別是在處理多資源請求時。

    server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/private.key;
    # 其他配置...
    }

    (6)使用負載均衡

    將流量分配到多台後端伺服器,以提高整體系統的處理能力和可靠性。

    upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    }
    server {
    location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    (7)監控和調優

    持續監控 Nginx 的效能指標(如 CPU 使用率、記憶體使用率、響應時間等),並根據監控數據進行調整和最佳化。

    可以使用工具如:

  • Grafana 和 Prometheus 進行效能監控和告警。

  • ngxtop 監控即時請求資訊。

  • New Relic、Datadog 等進行綜合效能監控。

  • 透過上述配置和調整,可以顯著提升 Nginx 的效能,使其在高並行環境下表現更加優異。

    25、Nginx如何處理大並行請求

    Nginx 處理大並行請求的能力主要依賴於其事件驅動模型、最佳化配置和系統資源的高效利用。以下是一些具體方法和配置,以幫助 Nginx 更好地處理大並行請求:

    (1)使用事件驅動模型

    Nginx 使用事件驅動模型(如 epoll、kqueue 等)來處理並行請求。這個模型允許 Nginx 在單個行程中高效地管理大量連線。

    在 Nginx 配置檔中,確保選擇適當的事件模型:

    events {
    use epoll; # Linux 環境推薦使用 epoll
    worker_connections 1024; # 每個 worker 行程允許的最大連線數
    }

    (2)增加 Worker 行程數

    根據伺服器的 CPU 核心數設定 worker_processes 的值,以充分利用多核 CPU 的效能:

    worker_processes auto;

    (3)調整系統參數

    ① 調整檔描述符限制

    增加檔描述符的限制,以允許更多的並行連線:

    ulimit -n 65535

    在 /etc/security/limits.conf 檔中添加:

    * soft nofile 65535
    * hard nofile 65535

    ② 調整 TCP 參數

    在 /etc/sysctl.conf 檔中添加以下參數,以最佳化 TCP 效能:

    net.core.somaxconn = 65535
    net.core.netdev_max_backlog = 65535
    net.ipv4.tcp_max_syn_backlog = 65535
    net.ipv4.ip_local_port_range = 1024 65000
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_fin_timeout = 15

    套用更改:

    sudo sysctl -p

    (4)啟用 Gzip 壓縮

    啟用 Gzip 壓縮以減少傳輸數據量,提高請求處理速度:

    http {
    gzip on;
    gzip_comp_level 5;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_min_length 256;
    }

    (5)使用緩存

    ① 啟用靜態檔緩存

    配置瀏覽器緩存頭,以減少伺服器負載並提高頁面載入速度:

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
    }

    ② 啟用代理緩存

    如果 Nginx 作為反向代理,可以啟用代理緩存:

    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
    server {
    location / {
    proxy_cache my_cache;
    proxy_pass http://backend_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    (6)負載均衡

    將流量分配到多台後端伺服器,以提高整體系統的處理能力和可靠性:

    upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    }
    server {
    location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    (7)使用 HTTP/2

    HTTP/2 提供了更好的效能和效率,特別是在處理多資源請求時:

    server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/private.key;
    # 其他配置...
    }

    (8)調整超時設定

    最佳化超時設定可以防止長時間掛起的連線占用資源:

    http {
    keepalive_timeout 65;
    client_header_timeout 15;
    client_body_timeout 15;
    send_timeout 15;
    }

    (9)監控和調優

    持續監控 Nginx 的效能指標(如 CPU 使用率、記憶體使用率、響應時間等),並根據監控數據進行調整和最佳化。

    使用工具如:

  • Grafana 和 Prometheus 進行效能監控和告警。

  • ngxtop 監控即時請求資訊。

  • New Relic、Datadog 等進行綜合效能監控。

  • 透過上述配置和調整,Nginx 能夠高效處理大並行請求,確保在高負載下依然保持良好的效能和響應速度。

    ·················END·················

    用官方一半價格的錢,用跟官方 ChatGPT4.0 一模一樣功能的工具。

    國內直接使用ChatGPT4o + Claude 3.5 Pro:

    1. 無需魔法,同時支持手機、電腦,瀏覽器直接使用

    2. 帳號獨享

    3. ChatGPT3.5永久免費

    長按辨識下方二維碼,備註ai,發給你

    回復gpt,獲取ChatGPT4o直接使用地址

    點選閱讀原文,國內直接使用ChatGpt4o