面試必備:nginx知識梳理

語言: CN / TW / HK

前言

完整例項可用於參考學習使用。地址: http://github.crmeb.net/u/defu

Nginx概念

Nginx 是一個高效能的 HTTP 和反向代理服務。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力在同類型的網頁伺服器中表現較好。

Nginx 專為效能優化而開發,效能是其最重要的考量指標,實現上非常注重效率,能經受住高負載的考驗,有報告表明能支援高達50000個併發連線數。

在連線高併發的情況下,Nginx 是 Apache 服務不錯的替代品:Nginx 在美國是做虛擬主機生意的老闆們經常選擇的軟體平臺之一。

反向代理

在說反向代理之前,先來說說什麼是代理和正向代理。

代理

代理其實就是一箇中介,A和B本來可以直連,中間插入一個C,C就是中介。剛開始的時候,代理多數是幫助內網client(區域網)訪問外網server用的。 後來出現了反向代理,反向這個詞在這兒的意思其實是指方向相反,即代理將來自外網客戶端的請求轉發到內網伺服器,從外到內。

正向代理

正向代理即是客戶端代理,代理客戶端,服務端不知道實際發起請求的客戶端。

正向代理類似一個跳板機,代理訪問外部資源。

比如我們國內訪問谷歌,直接訪問訪問不到,我們可以通過一個正向代理伺服器,請求發到代理服服務上,代理伺服器能夠訪問谷歌,這樣由代理去訪問谷歌取到返回資料,再返回給我們,這樣我們就能訪問谷歌了。

反向代理

反向代理即是服務端代理,代理服務端,客戶端不知道實際提供服務的服務端。

客戶端是感知不到代理伺服器的存在。

是指以代理伺服器來接受 Internet 上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給 Internet 上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。

負載均衡

關於負載均衡,先來舉個例子:

地鐵大家應該都坐過吧,我們一般在早高峰乘地鐵時候,總有那麼一個地鐵口人最擁擠,這時候,一般會有個地鐵工作人員A拿個大喇叭在喊“著急的人員請走B口,B口人少車空”。而這個地鐵工作人員A就是負責負載均衡的。

為了提升網站的各方面能力,我們一般會把多臺機器組成一個叢集對外提供服務。然而,我們的網站對外提供的訪問入口都是一個的,比如www.taobao.com。那麼當用戶在瀏覽器輸入www.taobao.com的時候如何將使用者的請求分發到叢集中不同的機器上呢,這就是負載均衡在做的事情。

負載均衡(Load Balance),意思是將負載(工作任務,訪問請求)進行平衡、分攤到多個操作單元(伺服器,元件)上進行執行。是解決高效能,單點故障(高可用),擴充套件性(水平伸縮)的終極解決方案。

Nginx提供的負載均衡主要有三種方式:輪詢,加權輪詢,Ip hash。

輪詢

nginx預設就是輪詢其權重都預設為1,伺服器處理請求的順序:ABCABCABCABC....

upstream mysvr { 
    server 192.168.8.1:7070; 
    server 192.168.8.2:7071;
    server 192.168.8.3:7072;
}
複製程式碼

加權輪詢

根據配置的權重的大小而分發給不同伺服器不同數量的請求。如果不設定,則預設為1。下面伺服器的請求順序為:ABBCCCABBCCC....

upstream mysvr { 
    server 192.168.8.1:7070 weight=1; 
    server 192.168.8.2:7071 weight=2;
    server 192.168.8.3:7072 weight=3;
}
複製程式碼

ip_hash

iphash對客戶端請求的ip進行hash操作,然後根據hash結果將同一個客戶端ip的請求分發給同一臺伺服器進行處理,可以解決session不共享的問題。

upstream mysvr { 
    server 192.168.8.1:7070; 
    server 192.168.8.2:7071;
    server 192.168.8.3:7072;
    ip_hash;
}
複製程式碼

動靜分離

動態與靜態頁面區別

  • 靜態資源: 當用戶多次訪問這個資源,資源的原始碼永遠不會改變的資源(如:HTML,JavaScript,CSS,img等檔案)。
  • 動態資源:當用戶多次訪問這個資源,資源的原始碼可能會發送改變(如:.jsp、servlet 等)。

什麼是動靜分離

  • 動靜分離是讓動態網站裡的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以後,我們就可以根據靜態資源的特點將其做快取操作,這就是網站靜態化處理的核心思路。

  • 動靜分離簡單的概括是:動態檔案與靜態檔案的分離。

為什麼要用動靜分離

為了加快網站的解析速度,可以把動態資源和靜態資源用不同的伺服器來解析,加快解析速度。降低單個伺服器的壓力。

Nginx安裝

windows下安裝

1、下載nginx

nginx.org/en/download… 下載穩定版本。以nginx/Windows-1.20.1為例,直接下載 nginx-1.20.1.zip。 下載後解壓,解壓後如下:

2、啟動nginx

  • 直接雙擊nginx.exe,雙擊後一個黑色的彈窗一閃而過

  • 開啟cmd命令視窗,切換到nginx解壓目錄下,輸入命令 nginx.exe ,回車即可

3、檢查nginx是否啟動成功

直接在瀏覽器位址列輸入網址 http://localhost:80 回車,出現以下頁面說明啟動成功!

Docker安裝nginx

我之前的文章也講過Linux下安裝的步驟,我採用的是docker安裝的,很簡單。

相關連結如下:Docker(三):Docker部署Nginx和Tomcat

1、檢視所有本地的主機上的映象,使用命令docker images

2、建立 nginx 容器 並啟動容器,使用命令docker run -d --name nginx01 -p 3344:80 nginx

3、檢視已啟動的容器,使用命令docker ps

瀏覽器訪問伺服器ip:3344,如下,說明安裝啟動成功。

注意:如何連線不上,檢查阿里雲安全組是否開放埠,或者伺服器防火牆是否開放埠!

linux下安裝

1、安裝gcc

安裝 nginx 需要先將官網下載的原始碼進行編譯,編譯依賴 gcc 環境,如果沒有 gcc 環境,則需要安裝:

yum install gcc-c++
複製程式碼

2、PCRE pcre-devel 安裝

PCRE(Perl Compatible Regular Expressions) 是一個Perl庫,包括 perl 相容的正則表示式庫。nginx 的 http 模組使用 pcre 來解析正則表示式,所以需要在 linux 上安裝 pcre 庫,pcre-devel 是使用 pcre 開發的一個二次開發庫。nginx也需要此庫。命令:

yum install -y pcre pcre-devel
複製程式碼

3、zlib 安裝

zlib 庫提供了很多種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內容進行 gzip ,所以需要在 Centos 上安裝 zlib 庫。

yum install -y zlib zlib-devel
複製程式碼

4、OpenSSL 安裝

OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法、常用的金鑰和證書封裝管理功能及 SSL 協議,並提供豐富的應用程式供測試或其它目的使用。 nginx 不僅支援 http 協議,還支援 https(即在ssl協議上傳輸http),所以需要在 Centos 安裝 OpenSSL 庫。

yum install -y openssl openssl-devel
複製程式碼

5、下載安裝包

手動下載.tar.gz安裝包,地址:nginx.org/en/download…

下載完畢上傳到伺服器上 /root

6、解壓

tar -zxvf nginx-1.20.1.tar.gz
cd nginx-1.20.1
複製程式碼

7、配置

使用預設配置,在nginx根目錄下執行

./configue
make
make install
複製程式碼

查詢安裝路徑: whereis nginx

8、啟動 nginx

./nginx
複製程式碼

啟動成功,訪問頁面:ip:80

Nginx常用命令

注意:使用Nginx操作命令前提,必須進入到Nginx目錄 /usr/local/nginx/sbin

1、檢視Nginx版本號:./nginx -v

2、啟動 Nginx:./nginx

3、停止 Nginx:./nginx -s stop 或者./nginx -s quit

4、重新載入配置檔案:./nginx -s reload

5、檢視nginx程序:ps -ef|grep nginx

Nginx配置檔案

Nginx配置檔案的位置:/usr/local/nginx/conf/nginx.conf

Nginx配置檔案有3部分組成:

1、全域性塊

從配置檔案開始到 events 塊之間的內容,主要會設定一些影響 nginx 伺服器整體執行的配置指令,比如:worker_processes 1

這是 Nginx 伺服器併發處理服務的關鍵配置,worker_processes 值越大,可以支援的併發處理量也越多,但是會受到硬體、軟體等裝置的制約。一般設定值和CPU核心數一致。

2、events塊

events 塊涉及的指令主要影響 Nginx 伺服器與使用者的網路連線,比如:worker_connections 1024

表示每個 work process 支援的最大連線數為 1024,這部分的配置對 Nginx 的效能影響較大,在實際中應該靈活配置。

3、http塊

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;
        }

    }

}
複製程式碼

這算是 Nginx 伺服器配置中最頻繁的部分。

演示示例

反向代理/負載均衡

我們在windows下演示,首先我們建立兩個springboot專案,埠是9001和9002,如下:

我們要做的就是將localhost:80代理localhost:9001localhost:9002這兩個服務,並且讓輪詢訪問這兩個服務。

nginx配置如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

	upstream jiangwang {
		server 127.0.0.1:9001 weight=1;//輪詢其權重都預設為1
		server 127.0.0.1:9002 weight=1;
	}

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://jiangwang;
        }
    }

}
複製程式碼

我們先將專案打成jar包,然後命令列啟動專案,然後在瀏覽器上訪問localhost來訪問這兩個專案,我也在專案中列印了日誌,操作一下來看看結果,是不是兩個專案輪詢被訪問。

可以看到,訪問localhost,這兩個專案輪詢被訪問。

接下來我們將權重改為如下設定:

upstream jiangwang {
    server 127.0.0.1:9001 weight=1;
    server 127.0.0.1:9002 weight=3;
}
複製程式碼

重新載入一個nginx的配置檔案:nginx -s reload

載入完畢,我們再訪問其localhost,觀察其訪問的比例:

結果顯示,9002埠的訪問次數與9001訪問的次數基本上是3:1

動靜分離

1、將靜態資源放入本地新建的檔案裡面,例如:在D盤新建一個檔案data,然後再data資料夾裡面在新建兩個資料夾,一個img資料夾,存放圖片;一個html資料夾,存放html檔案;如下圖:

2、在html資料夾裡面新建一個a.html檔案,內容如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Html檔案</title>
</head>
<body>
    <p>Hello World</p>
</body>
</html>
複製程式碼

3、在img資料夾裡面放入一張照片,如下:

4、配置nginx中nginx.conf檔案:

location /html/ {
    root   D:/data/;
    index  index.html index.htm;
}

location /img/ {
    root   D:/data/;
    autoindex on;#表示列出當前資料夾中的所有內容
}
複製程式碼

5、啟動nginx,訪問其檔案路徑,在瀏覽器輸入http://localhost/html/a.html,如下:

6、在瀏覽器輸入http://localhost/img/

Nginx工作原理

mater&worker

master接收訊號後將任務分配給worker進行執行,worker可有多個。

worker如何工作

客戶端傳送一個請求到master後,worker獲取任務的機制不是直接分配也不是輪詢,而是一種爭搶的機制,“搶”到任務後再執行任務,即選擇目標伺服器tomcat等,然後返回結果。

worker_connection

傳送請求佔用了woker兩個或四個連線數。

普通的靜態訪問最大併發數是:worker_connections * worker_processes/ 2 ,若是 HTTP 作為反向代理來說,最大併發數量應該是 worker_connections * worker_processes/ 4 。當然了,worker數也不是越多越好,worker數和伺服器的CPU數相等時最適宜的。

優點

可以使用 nginx –s reload 熱部署,利用 nginx 進行熱部署操作每個 woker 是獨立的程序,若其中一個woker出現問題,其他繼續進行爭搶,實現請求過程,不會造成服務中斷。

總結

關於 Nginx 的基本概念、安裝教程、配置、使用例項以及工作原理,本文都做了詳細闡述。希望本文對你有所幫助。

如果你覺得這篇文章對你有點用的話,麻煩請給我們的開源專案點點star: http://github.crmeb.net/u/defu       不勝感激 !