一. Nginx介紹
?1. Nginx到底是什么,干什么用?
????????Nginx是一個 輕量級/高性能的反向代理Web服務器,它是由C語言寫的,所以速度非??臁⑿阅芊浅?yōu)秀。它的主要功能就是反向代理、負載均衡、配置SSL證書、防盜鏈、解決跨域問題、緩存、限流、動靜資源分離等等。
? ? ? ? 上面介紹了Nginx是一臺Web服務器,實際上,他并不是一臺真正意義上的物理機服務器,并不是主觀上真實存在的實體,它是運行在某一臺服務器(電腦)上的軟件。
????????那為什么還說它是一臺Web服務器呢?我們先來理解一下什么是網關,大家都知道,從一個房間進入另一個房間內,必須經過一個門,就像經過一個“關口”,那從一個網絡發(fā)送一個信息到另一個網絡,也必須經過一個“關口”,這個關口就可以說是網關。這個關口并不是擺在那里那么簡單,關口可以自行決定允不允許讓你的消息通過,或者決定是否替你轉發(fā)和接收消息、把消息分發(fā)給其他人,或者幫你的消息添加和預處理一些信息,或者替你回答消息等等功能。
? ? ? ? 而Nginx就相當于這個網關,轉發(fā)和接收消息就相當于反向代理,把消息分發(fā)給其他人就相當于負載均衡。當我們的服務器(電腦)上安裝了Nginx這個軟件,通過一些簡單的配置并運行這個軟件,我們在服務器上運行的項目(例如Java程序)在接收Http請求的時候,這個請求就會被Nginx這個網關先攔截,經過一些上述的處理之后再交給Java程序,此時Nginx就充當了一個網關。因為外網用戶的所有請求都會先經過Nginx,所以對于外網的用戶來說,他們的請求都是發(fā)送給Nginx的,再由Nginx發(fā)送給Java程序處理后再發(fā)還給用戶,那么從用戶的角度來看,Nginx就相當于一臺服務器在接收和回復用戶發(fā)送的消息,所以也可以理解為Nginx是一臺Web服務器。
?2. 為什么要用Nginx?
? ? ? ? Nginx跨平臺,配置簡單。我們可以在Linux系統(tǒng)和windows系統(tǒng)上都開啟Nginx服務,配置也非常簡單,在linux上,我們通常只需要修改三四行代碼,既可以完成對項目的配置。當后端程序重構或者重新部署,例如由Java項目換成go項目,也不需要修改Nginx。
? ? ? ? ?Nginx是由C語言寫的,速度非常快,性能優(yōu)越。目前公認的性能最高的后端語言就是C和C++,而Nginx就是由C寫和編譯的,其單機并發(fā)量非常高,可以達到5w+,而一般的后端Java程序并沒有這么高的并發(fā)量,所以一般都會選擇Nginx當網關放在Java程序之前,提高系統(tǒng)的整體性能。
? ? ? ? 動靜資源分離。一般的前后端分離項目,用戶想獲取前端靜態(tài)資源文件,都得先經過后端Java程序的接口再獲取服務器上的靜態(tài)資源文件,這樣的效率并不是特別高,而且會占用正常程序接口的連接數量,這時候Nginx的動靜資源分離功能就提供了很好的解決方法,一般靜態(tài)資源文件都放在Nginx服務器中,當Nginx接收到了獲取靜態(tài)資源文件的請求,就直接在Nginx服務器中把放進去的靜態(tài)資源返回了,而不用真正到達后端接口,這個效率是非常高的,比正常的訪問速度會快一倍左右。
? ? ? ? 在并發(fā)量較大的項目中,后端往往會開啟多個相同的Java服務,來緩解單服務的壓力,我們知道,每一個Java服務程序都會占用一個端口,那前端在后端接口的時候,怎么知道該選用哪個接口呢?這時就可以在所有的Java程序前放置一個Nginx程序,所有的請求都經過Nginx,由Nginx決定分發(fā)到哪個端口程序上,這樣,雖然后端有很多個Java程序,但對于前端來說,是無感知的,就好像后臺只有一個項目在跑一樣。
????????那這么多后端程序在跑,萬一有一個程序掛了前端不知道怎么辦?放心,Nginx還有一個Keepalive?;顧C制,Nginx會不斷監(jiān)聽后端程序的接口,看該服務是不是在正常運行,萬一有一個程序掛了,那么Nginx就不會把前端發(fā)來的請求轉發(fā)給這個接口,確保后端服務的高可用性和穩(wěn)定性。
二. 具體常見應用
1. 反向代理? ?
(1). 正向代理?
? ? ? ? ?說到反向代理,我們常常會想到正向代理,那么兩者有何區(qū)別呢?
????????正常情況下,我們訪問一個網頁、服務器,只需要在瀏覽器中輸入相應的域名或ip地址和端口號,經過DNS解析后,就可以訪問到服務器上的資源,這是最普通也是最直接的連接方式,也就是用戶端和服務端的直接連接,我們可以直接訪問服務器,但是這樣有一個問題,我們用戶端的ip地址就泄露給了對方,如果我們不想讓服務端知道我們的ip地址呢?
? ? ? ? 這時候就需要正向代理了,不同于反向代理,正向代理的網關是用戶端自己配置和搭建的,用戶端和網關是一伙的,這樣用戶端每次要訪問服務端的時候,就把請求發(fā)到自己配置的網關上,然后由網關轉發(fā)用戶的請求給服務端,服務端返回響應后就再發(fā)還給用戶。對于服務器來說,具體用戶是誰是無感知的,因為請求都來源于網關代理的轉發(fā),這樣服務端就不知道真正發(fā)請求的用戶到底是誰。
(2). 反向代理
????????
?拿nginx實現(xiàn)的反向代理來說,不同于正向代理,反向代理的網關和服務器是一伙的,用戶端無法通過公網直接訪問到后臺服務器上的Java應用程序,但是可以直接訪問nginx網關,再由nginx分發(fā)到不同的服務器(或者說應用程序)上,真正提供服務的服務器對于用戶來說是無感知的,所有的請求都必須先發(fā)送到nginx網關上,再進行請求轉發(fā),用戶端并不知道真正提供服務的服務器是誰,也不知道它的具體ip地址和端口,所以稱之為反向代理。
? ? ? ? ?拿nginx的常見配置來講,server_name實際上就是本機的ip,listen就是監(jiān)聽這個ip下的某個端口。而location則可以理解要攔截哪個url進行處理,“/”表示攔截所有。proxy_pass則表示把這個攔截的url要轉發(fā)到哪個服務器上,所以填的是ip+端口。這樣就可以做到反向代理,把某個ip+端口+路徑的請求給攔截下來,轉發(fā)到另一個ip+端口+路徑的資源上。
2. 負載均衡
? ? ? ? ?通常后端項目并只會開啟一個Java應用程序,一般都會開啟多個,這時候就需要nginx來選擇將所有的請求分發(fā)給不同的程序應用,這個過程就是負載均衡。
? ? ? ? 那我們怎么知道要按哪些規(guī)則去分發(fā)這些請求呢?nginx中已經提供了幾種常見的負載均衡算法,例如默認的輪詢算法,按順序、平均地把每一條請求分發(fā)出去。
upstream backserver {
server 192.168.1.1;
server 192.168.1.2;
}
或者按權重分配,權重值高的分配請求也越多。
upstream backserver {
server 192.168.1.13 weight=2;
server 192.168.1.14 weight=8;
}
或者按用戶端的ip進行hash運算分配。
upstream backserver {
ip_hash;
server 192.168.0.11:88;
server 192.168.0.13:80;
}
3. 解決跨域問題
location / {
#允許跨域請求的域,* 代表所有
add_header 'Access-Control-Allow-Origin' *;
#允許請求的header
add_header 'Access-Control-Allow-Headers' *;
#允許帶上cookie請求
add_header 'Access-Control-Allow-Credentials' 'true';
#允許請求的方法,比如 GET,POST,PUT,DELETE
add_header 'Access-Control-Allow-Methods' *;
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass http://192.168.1.12:8080;
}
? ? ? ? 只要在nginx配置中添加相關配置,nginx就會在分發(fā)每個請求前,再請求中加上跨域相關配置的請求頭,再分發(fā)給后端應用,對于前端來說,可以實現(xiàn)無感知的跨域。
4. 限流
? ? ? ? 漏桶算法
?????????用戶端的大量請求(突發(fā)流量)會進入nginx內維護的漏桶中,漏桶會按照我們定義的固定的速率給服務器分發(fā)請求,正常的請求在服務器處理完后會正常返回給用戶端。如果水流過大(突發(fā)流量過大)時,漏桶內的水會溢出,這時nginx就把這些溢出的水(流量)直接丟棄,也就是給用戶端返回錯誤信息。
? ? ? ? 令牌桶算法
? ? ? ? ?用戶端發(fā)請求給nginx時,每個請求都要去nginx的令牌桶中取一個令牌,令牌桶的容量是我們自己設定的,如果某個請求成功取到了令牌,那么nginx就會把這個請求轉發(fā)到服務器上進行處理。如果令牌桶已空,請求在nginx令牌桶中取不到令牌,那么nginx會直接返回該請求,也就是給用戶端返回錯誤信息。
三. 常見問題
1. 為什么訪問后端服務時,有時候要用ip+端口或者域名+端口,而有時候則可以直接用ip或者域名就可以訪問?
? ? ? ??HTTP協(xié)議默認使用的端口是80,HTTPS協(xié)議默認使用的端口是443,這是因為在早期互聯(lián)網的設計中,為了方便,HTTP和HTTPS協(xié)議的默認端口就是這兩個端口。一般來說,在瀏覽器訪問網站時,如果沒有指定端口號,瀏覽器會默認使用HTTP協(xié)議的80端口或HTTPS協(xié)議的443端口進行連接。因此,在設置域名默認端口時,應該考慮使用這兩個默認端口之一,以便用戶可以直接通過域名訪問網站,而不需要手動輸入端口號。
? ? ? ? 但是我們一個服務器上,可能有很多個域名都綁定了這個服務器的ip,每個域名都是一個獨立的網站,而且服務器上可能有很多個后端應用服務,而端口(80)只有一個,那這么多網站和服務怎么公用一個端口呢?沒錯,還是靠nginx,我們只需要配置多個server即可,多個server都監(jiān)聽80端口,再根據域名的不同將請求轉發(fā)到不同的端口即可? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?監(jiān)聽www.aa.com域名的80端口,并轉發(fā)到8080端口? ? ? ? ? ? ?
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?監(jiān)聽www.bb.com域名的80端口,并轉發(fā)到8081端口
2. 服務器代理和vpn代理有什么不同?
????????
(1). vpn是怎么實現(xiàn)在家也能連到公司內網的?? ? ? ? ?
????????nginx的代理往往只是代理轉發(fā)請求,只需要服務端架設nginx開啟反向代理或者客戶端開啟正向代理。而vpn代理則是通過隧道技術在公共網絡上模擬出一條點到點的邏輯專線,從而達到安全數據傳輸的目的,最常見的用處就是人不在公司,通過vpn設備訪問公司內網。
? ? ? ? 當我們不使用vpn時,我們直接訪問公司內網,帶上的是公網ip,公司內的設備都是內網ip,公司內網沒有接入公網,肯定訪問不到公司內網,而且人家也不認識你的公網ip,這時候要訪問公司內網,有兩種方法,一種是從你家專門接一條網線到公司的服務器,聽著確實可以,但是實際上確很不現(xiàn)實。第二種方法就是vpn技術,在公網上建立一條專門的隧道,直接連接你的設備和公司內網設備。架設vpn裝線,往往需要用戶端和服務端都部署和配置裝門的vpn設備,也就是上圖的vpn網關,例如路由器式vpn、交換機式vpn。
(2). vpn設計與實現(xiàn)
? ? ? ? vpn最主要的技術就是隧道技術,隧道技術用通俗的話來講就是用另一種協(xié)議去封裝我們使用的協(xié)議,隧道協(xié)議分為第二、第三層隧道協(xié)議,第二層隧道協(xié)議(如L2TP、PPTP、L2F等)工作在OSI體系結構的第二層(即數據鏈路層);第三層隧道協(xié)議(如IPSec、GRE等)工作在OSl體系結構的第三層(即網絡層),這兩個協(xié)議會在我們網絡層封裝完IP頭后,再封裝IPSec或者GRE頭,并進行信息加密,這也是代理服務器不會做的。然后再交由網絡接口層添加mac頭再丟到公網中,這樣公網就認得你的ip并且能找到你公司內網前架設的vpn網關。
? ? ? ? vpn設備還會使用常用加解密技術,例如對稱密鑰加密和非對稱密鑰加密組合使用,例如用https的TLS加密技術。
????????密鑰管理技術和身份認證及訪問控制技術的支持。
(3). 代理服務器和vpn有什么不一樣?
? ? ? ? 1. 匿名性不同。雖然它們都位于請求的中間,都隱藏了 IP 地址,并且都將信息轉發(fā)。
主要區(qū)別在于 VPN 需要隧道過程,該過程建立了到 VPN 服務器的直接且不可穿透的連接。代理只是一個開放的端口,是任何人都可以連接到的單個 IP 地址。
? ? ? ? 2. 安全性不同。vpn會加密我們的數據信息,代理服務器不會,因此vpn更加私有,連接不會被穿透,是一個開在公網上的封閉系統(tǒng)。
? ? ? ? 3. 運行級別不同。vpn是運行在操作系統(tǒng)上,由操作系統(tǒng)內核封裝,重定向請求流量。代理服務器是軟件級別,處于用戶態(tài)。
? ? ? ? 4. 速度不同。vpn涉及加密解密,數據封裝,速度較慢,但因其安全性,價格成本會更高。
四. 結語
?感謝您的耐心閱讀?。。?!
?看完了不妨點贊收藏吧~
?您的支持是博主創(chuàng)作的最大動力?。。。?mark hidden color="red">文章來源:http://www.zghlxwxcb.cn/news/detail-410073.html
?感謝耐心閱讀?。??文章來源地址http://www.zghlxwxcb.cn/news/detail-410073.html
到了這里,關于Nginx到底能干嘛?!Nginx是做什么用的?通俗易懂,前端必看!的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!