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安裝的,很簡單。
1、查看所有本地的主機上的鏡像,使用命令docker images
2、創建 nginx 容器 并啟動容器,使用命令docker run -d --name nginx01 -p 3344:80 nginx
3、查看已啟動的容器,使用命令docker ps
[圖片上傳失敗…(image-af849a-1631168446877)]
瀏覽器訪問服務器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:9001
和localhost: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;//輪詢其權重都默認為1server 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
普通的靜態訪問最大并發數是:worker_connections * worker_processes/ 2
?;若是 HTTP 作為反向代理來說,最大并發數量應該是?worker_connections * worker_processes/ 4
?,因為作為反向代理服務器,每個并發會建立與客戶端的連接和后端服務器的連接,會占用兩個連接。
當然了,worker數也不是越多越好,worker數和服務器的CPU數相等時最適宜的。
優點
可以使用?nginx –s reload
?熱部署,利用 nginx 進行熱部署操作每個 woker 是獨立的進程,若其中一個woker出現問題,其他繼續進行爭搶,實現請求過程,不會造成服務中斷。
總結
關于 Nginx 的基本概念、安裝教程、配置、使用實例以及工作原理,本文都做了詳細闡述。希望本文對你有所幫助。