面試必備:nginx知識梳理(收藏版)
Nginx概念
Nginx 是一個高性能的 HTTP 和反向代理服務(wù)。其特點是占有內(nèi)存少,并發(fā)能力強,事實上nginx的并發(fā)能力在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好。
Nginx 專為性能優(yōu)化而開發(fā),性能是其最重要的考量指標(biāo),實現(xiàn)上非常注重效率,能經(jīng)受住高負(fù)載的考驗,有報告表明能支持高達(dá)50000個并發(fā)連接數(shù)。
在連接高并發(fā)的情況下,Nginx 是 Apache 服務(wù)不錯的替代品:Nginx 在美國是做虛擬主機生意的老板們經(jīng)常選擇的軟件平臺之一。
反向代理
在說反向代理之前,先來說說什么是代理和正向代理。
代理
代理其實就是一個中介,A和B本來可以直連,中間插入一個C,C就是中介。剛開始的時候,代理多數(shù)是幫助內(nèi)網(wǎng)client(局域網(wǎng))訪問外網(wǎng)server用的。 后來出現(xiàn)了反向代理,反向這個詞在這兒的意思其實是指方向相反,即代理將來自外網(wǎng)客戶端的請求轉(zhuǎn)發(fā)到內(nèi)網(wǎng)服務(wù)器,從外到內(nèi)。
正向代理
正向代理即是客戶端代理,代理客戶端,服務(wù)端不知道實際發(fā)起請求的客戶端。
正向代理類似一個跳板機,代理訪問外部資源。
比如我們國內(nèi)訪問谷歌,直接訪問訪問不到,我們可以通過一個正向代理服務(wù)器,請求發(fā)到代理服服務(wù)上,代理服務(wù)器能夠訪問谷歌,這樣由代理去訪問谷歌取到返回數(shù)據(jù),再返回給我們,這樣我們就能訪問谷歌了。
反向代理
反向代理即是服務(wù)端代理,代理服務(wù)端,客戶端不知道實際提供服務(wù)的服務(wù)端。
客戶端是感知不到代理服務(wù)器的存在。
是指以代理服務(wù)器來接受 Internet 上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給 Internet 上請求連接的客戶端,此時代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器。
負(fù)載均衡
關(guān)于負(fù)載均衡,先來舉個例子:
地鐵大家應(yīng)該都坐過吧,我們一般在早高峰乘地鐵時候,總有那么一個地鐵口人最擁擠,這時候,一般會有個地鐵工作人員A拿個大喇叭在喊“著急的人員請走B口,B口人少車空”。而這個地鐵工作人員A就是負(fù)責(zé)負(fù)載均衡的。
為了提升網(wǎng)站的各方面能力,我們一般會把多臺機器組成一個集群對外提供服務(wù)。然而,我們的網(wǎng)站對外提供的訪問入口都是一個的,比如www.taobao.com。那么當(dāng)用戶在瀏覽器輸入www.taobao.com的時候如何將用戶的請求分發(fā)到集群中不同的機器上呢,這就是負(fù)載均衡在做的事情。
負(fù)載均衡(Load Balance),意思是將負(fù)載(工作任務(wù),訪問請求)進(jìn)行平衡、分?jǐn)偟蕉鄠€操作單元(服務(wù)器,組件)上進(jìn)行執(zhí)行。是解決高性能,單點故障(高可用),擴展性(水平伸縮)的終極解決方案。
Nginx提供的負(fù)載均衡主要有三種方式:輪詢,加權(quán)輪詢,Ip hash。
輪詢
nginx默認(rèn)就是輪詢其權(quán)重都默認(rèn)為1,服務(wù)器處理請求的順序:ABCABCABCABC…
upstream mysvr { server 192.168.8.1:7070; server 192.168.8.2:7071; server 192.168.8.3:7072; }
加權(quán)輪詢
根據(jù)配置的權(quán)重的大小而分發(fā)給不同服務(wù)器不同數(shù)量的請求。如果不設(shè)置,則默認(rèn)為1。下面服務(wù)器的請求順序為: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進(jìn)行hash操作,然后根據(jù)hash結(jié)果將同一個客戶端ip的請求分發(fā)給同一臺服務(wù)器進(jìn)行處理,可以解決session不共享的問題。
upstream mysvr { server 192.168.8.1:7070; server 192.168.8.2:7071; server 192.168.8.3:7072; ip_hash; }
動靜分離
動態(tài)與靜態(tài)頁面區(qū)別
靜態(tài)資源: 當(dāng)用戶多次訪問這個資源,資源的源代碼永遠(yuǎn)不會改變的資源(如:HTML,JavaScript,CSS,img等文件)。
動態(tài)資源:當(dāng)用戶多次訪問這個資源,資源的源代碼可能會發(fā)送改變(如:.jsp、servlet 等)。
什么是動靜分離
動靜分離是讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動靜資源做好了拆分以后,我們就可以根據(jù)靜態(tài)資源的特點將其做緩存操作,這就是網(wǎng)站靜態(tài)化處理的核心思路。
動靜分離簡單的概括是:動態(tài)文件與靜態(tài)文件的分離。
為什么要用動靜分離
為了加快網(wǎng)站的解析速度,可以把動態(tài)資源和靜態(tài)資源用不同的服務(wù)器來解析,加快解析速度。降低單個服務(wù)器的壓力。
Nginx安裝
windows下安裝
1、下載nginx
nginx.org/en/download… 下載穩(wěn)定版本。以nginx/Windows-1.20.1為例,直接下載 nginx-1.20.1.zip。 下載后解壓,解壓后如下:
2、啟動nginx
直接雙擊nginx.exe,雙擊后一個黑色的彈窗一閃而過
打開cmd命令窗口,切換到nginx解壓目錄下,輸入命令 nginx.exe ,回車即可
3、檢查nginx是否啟動成功
直接在瀏覽器地址欄輸入網(wǎng)址 http://localhost:80 回車,出現(xiàn)以下頁面說明啟動成功!
Docker安裝nginx
我之前的文章也講過Linux下安裝的步驟,我采用的是docker安裝的,很簡單。
相關(guān)鏈接如下:Docker(三):Docker部署Nginx和Tomcat
1、查看所有本地的主機上的鏡像,使用命令docker images
2、創(chuàng)建 nginx 容器 并啟動容器,使用命令docker run -d --name nginx01 -p 3344:80 nginx
3、查看已啟動的容器,使用命令docker ps
[圖片上傳失敗…(image-af849a-1631168446877)]
瀏覽器訪問服務(wù)器ip:3344,如下,說明安裝啟動成功。
注意:如何連接不上,檢查阿里云安全組是否開放端口,或者服務(wù)器防火墻是否開放端口!
linux下安裝
1、安裝gcc
安裝 nginx 需要先將官網(wǎng)下載的源碼進(jìn)行編譯,編譯依賴 gcc 環(huán)境,如果沒有 gcc 環(huán)境,則需要安裝:
yum install gcc-c++
2、PCRE pcre-devel 安裝
PCRE(Perl Compatible Regular Expressions) 是一個Perl庫,包括 perl 兼容的正則表達(dá)式庫。nginx 的 http 模塊使用 pcre 來解析正則表達(dá)式,所以需要在 linux 上安裝 pcre 庫,pcre-devel 是使用 pcre 開發(fā)的一個二次開發(fā)庫。nginx也需要此庫。命令:
yum install -y pcre pcre-devel
3、zlib 安裝
zlib 庫提供了很多種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內(nèi)容進(jìn)行 gzip ,所以需要在 Centos 上安裝 zlib 庫。
yum install -y zlib zlib-devel
4、OpenSSL 安裝
OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及 SSL 協(xié)議,并提供豐富的應(yīng)用程序供測試或其它目的使用。 nginx 不僅支持 http 協(xié)議,還支持 https(即在ssl協(xié)議上傳輸http),所以需要在 Centos 安裝 OpenSSL 庫。
yum install -y openssl openssl-devel
5、下載安裝包
手動下載.tar.gz安裝包,地址:nginx.org/en/download…
下載完畢上傳到服務(wù)器上 /root
6、解壓
tar -zxvf nginx-1.20.1.tar.gz cd nginx-1.20.1
7、配置
使用默認(rèn)配置,在nginx根目錄下執(zhí)行
./configue make make install
查找安裝路徑: whereis nginx
8、啟動 nginx
./nginx
啟動成功,訪問頁面:ip:80
Nginx常用命令
注意:使用Nginx操作命令前提,必須進(jìn)入到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進(jìn)程:ps -ef|grep nginx
Nginx配置文件
Nginx配置文件的位置:/usr/local/nginx/conf/nginx.conf
Nginx配置文件有3部分組成:
1、全局塊
從配置文件開始到 events 塊之間的內(nèi)容,主要會設(shè)置一些影響 nginx 服務(wù)器整體運行的配置指令,比如:worker_processes 1。
這是 Nginx 服務(wù)器并發(fā)處理服務(wù)的關(guān)鍵配置,worker_processes 值越大,可以支持的并發(fā)處理量也越多,但是會受到硬件、軟件等設(shè)備的制約。一般設(shè)置值和CPU核心數(shù)一致。
2、events塊
events 塊涉及的指令主要影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接,比如:worker_connections 1024
表示每個 work process 支持的最大連接數(shù)為 1024,這部分的配置對 Nginx 的性能影響較大,在實際中應(yīng)該靈活配置。
3、http塊
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80;#監(jiān)聽端口 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 服務(wù)器配置中最頻繁的部分。
演示示例
反向代理/負(fù)載均衡
我們在windows下演示,首先我們創(chuàng)建兩個springboot項目,端口是9001和9002,如下:
我們要做的就是將localhost:80代理localhost:9001和localhost:9002這兩個服務(wù),并且讓輪詢訪問這兩個服務(wù)。
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;//輪詢其權(quán)重都默認(rèn)為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來訪問這兩個項目,我也在項目中打印了日志,操作一下來看看結(jié)果,是不是兩個項目輪詢被訪問。
可以看到,訪問localhost,這兩個項目輪詢被訪問。
接下來我們將權(quán)重改為如下設(shè)置:
upstream jiangwang { server 127.0.0.1:9001 weight=1; server 127.0.0.1:9002 weight=3; }
重新加載一個nginx的配置文件:nginx -s reload
加載完畢,我們再訪問其localhost,觀察其訪問的比例:
結(jié)果顯示,9002端口的訪問次數(shù)與9001訪問的次數(shù)基本上是3:1。
動靜分離
1、將靜態(tài)資源放入本地新建的文件里面,例如:在D盤新建一個文件data,然后再data文件夾里面在新建兩個文件夾,一個img文件夾,存放圖片;一個html文件夾,存放html文件;如下圖:
2、在html文件夾里面新建一個a.html文件,內(nèi)容如下:
Hello World
3、在img文件夾里面放入一張照片,如下:
4、配置nginx中nginx.conf文件:
location /html/ { root D:/data/; index index.html index.htm; } location /img/ { root D:/data/; autoindex on;#表示列出當(dāng)前文件夾中的所有內(nèi)容 }
5、啟動nginx,訪問其文件路徑,在瀏覽器輸入http://localhost/html/a.html,如下:
6、在瀏覽器輸入http://localhost/img/
Nginx工作原理
mater&worker
master接收信號后將任務(wù)分配給worker進(jìn)行執(zhí)行,worker可有多個。
worker如何工作
客戶端發(fā)送一個請求到master后,worker獲取任務(wù)的機制不是直接分配也不是輪詢,而是一種爭搶的機制,“搶”到任務(wù)后再執(zhí)行任務(wù),即選擇目標(biāo)服務(wù)器tomcat等,然后返回結(jié)果。
worker_connection
普通的靜態(tài)訪問最大并發(fā)數(shù)是:worker_connections * worker_processes/ 2 ;若是 HTTP 作為反向代理來說,最大并發(fā)數(shù)量應(yīng)該是 worker_connections * worker_processes/ 4 ,因為作為反向代理服務(wù)器,每個并發(fā)會建立與客戶端的連接和后端服務(wù)器的連接,會占用兩個連接。
當(dāng)然了,worker數(shù)也不是越多越好,worker數(shù)和服務(wù)器的CPU數(shù)相等時最適宜的。
優(yōu)點
可以使用 nginx –s reload 熱部署,利用 nginx 進(jìn)行熱部署操作每個 woker 是獨立的進(jìn)程,若其中一個woker出現(xiàn)問題,其他繼續(xù)進(jìn)行爭搶,實現(xiàn)請求過程,不會造成服務(wù)中斷。
總結(jié)
關(guān)于 Nginx 的基本概念、安裝教程、配置、使用實例以及工作原理,本文都做了詳細(xì)闡述。希望本文對你有所幫助。
HTTP Nginx 彈性負(fù)載均衡 ELB
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。