Nginx 反向代理、动静分离、负载均衡及配置实例
文章目錄
- Nginx
- 代理
- 正向代理
- 反向代理
- 配置實例
- 動靜分離
- 概念
- 配置實例
- 負載均衡
- 概念
- 分配策略
- 配置實例
Nginx
Nginx (“engine x”) 是一個高性能的 HTTP 和反向代理服務器,特點是占有內存少,并發能力強,事實上 nginx
的并發能力確實在同類型的網頁服務器中表現較好,中國大陸使用 nginx 網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等
聊到Nginx, 那就必定要講他最基本的三大功能
- 反向代理
- 動靜分離
- 負載均衡
代理
這里的代理指的是網絡代理中的正向代理與反向代理,是代理模式的一種應用實例,如果需要拓展了解代理模式,可以看看我的趣談設計模式系列博客
趣談設計模式 | 代理模式(Proxy):利用代理來控制對象的訪問
正向代理
當我們需要訪問一些網站的時候,可能由于服務器距離過遠,又或者是網絡限制,使得我們不能夠直接訪問一些服務器,這時候就需要用到正向代理。
正向代理,就是讓代理服務器給客戶端做代理。即代理服務器將客戶端的請求轉發給目標服務器
流程如上圖,客戶端將請求發送給代理服務器,代理服務器再代替客戶端向目標服務器發送請求,目標服務器收到請求后將響應返回給代理服務器,代理服務器再將相應的結果返還給客戶端。這樣就借助代理服務器,通過轉發的方式使得原本不能通信的兩端實現通信。
反向代理
反向代理,即讓代理服務器為目標服務器做代理。在這種情況下,客戶端對代理其實是無感知的,因為它沒有做任何的配置,所以在它眼里,代理服務器就是目的服務器。所以在這種情況下,對外暴露的只有一個反向代理服務器,而隱藏了真實服務器
當客戶端將請求發送給代理服務器時,再由代理服務器進行選擇,將請求轉發給內部真實的目標服務器,獲取數據后將結果返回給客戶端。流程如下圖
配置實例
目標
根據訪問的路徑轉發到不同的服務器中
流程
1.準備兩臺HTTP服務器以及測試頁面
2.配置nginx
首先準備了兩個http服務器,分別綁定在了本地的8081和8082端口,并分別存放一個html文件用于標識
//服務器1 <h1>port 8081: test1!!!<h1>//服務器2 <h1>port 8082: test2!!!<h1>接著打開nginx的配置文件
vim /usr/local/nginx-1.18.0/conf/nginx.conf接著在http塊中增加一個新的server節點,讓其提供反向代理服務,端口號為9000,并通過配置location來設置轉發規則
server {listen 9000; //端口號server_name 192.168.220.128; //主機號//正則表達式,當url中包含test1時,將其轉發到下面的服務器中location ~ /test1/ {proxy_pass http://192.168.220.128:8081;}location ~ /test2/ {proxy_pass http://192.168.220.128:8082;}}根據上面設置,轉發情況如下
訪問:http://192.168.220.128:9000/test1/ -------> 轉發至:192.168.220.128:8081 訪問:http://192.168.220.128:9000/test1/ -------> 轉發至:192.168.220.128:8082
配置成功
動靜分離
概念
為了加快網站的解析速度,可以把動態頁面和靜態頁面由不同的服務器來解析,加快解析速度。降低原來單個服務器的壓力,這就是動靜分離。
動靜分離簡單來說就是當客戶端向代理服務器發送請求的時候,代理服務器會把動態跟靜態請求分開,并將其轉發到對應的服務器上。由于靜態資源不需要進行交互,所以這樣將其劃分開一定程度上減少了服務器的壓力。
動靜分離從目前實現角度來講大致分為以下兩種
由于我本地沒有其他的服務器,因此下面我們就以第二種方式來實現
配置實例
目標
將靜態資源轉發到靜態服務器中
流程
1.準備好靜態資源
2.配置nginx
由于我本地沒有其他的服務器,因此就將在本機中完成轉發,假設根目錄下的data文件夾即是靜態資源服務器,我分別將一個html文件和一個圖片存放在/data/www, data/image中,當url中包含www或者image這些靜態資源時,將其轉發到/data/即靜態服務器中
下面開始配置,直接對nginx配置文件中的http塊下的server配置即可
通過location指定不同的后綴名實現不同的請求轉發
server {listen 80;server_name 192.168.220.128;location /www/ {root /data/; //靜態資源服務器index index.html index.htm;}location /image/ {root /data/;autoindex on; //文件索引列表} }根據上面設置,轉發情況如下
訪問:http://192.168.220.128/www/ -------> 轉發至:192.168.220.128/data/www/ 訪問:http://192.168.220.128/image/ -------> 轉發至:192.168.220.128/data/imgae/下面進行測試
負載均衡
概念
負載均衡即根據服務器的負載情況,按照分配策略將請求分發到不同的服務器上,讓各個服務器的負載均衡,即避免了忙閑不均的問題,又保證了服務的高可用、高性能。
在當今的互聯網時代,由于信息與用戶的爆炸性增長,服務器的壓力越來越大,早已不是原理那個單機就能滿足的年代了。要想保證服務的穩定,那就必須要在服務器這方面下功夫,我們首先想到的就是提高服務器的性能,但是如今硬件緩慢的性能提升以及抵不上流量增加的速度,即使我們將機器全部換到頂級配置也無法解決這個問題。
因此我們將視角放在了橫向發展,即通過不斷增加服務器的數量來構造出一個集群,將請求均衡的分發到集群中的各個服務器上,這樣就能夠以低成本、高效果的方式緩解了日益增長的壓力,這也就是負載均衡的應用場景。
分配策略
輪詢(默認):每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器 down 掉,能自動剔除。
//當沒有指定時默認使用 upstream serverlist {server 192.168.220.128:8081; server 192.168.220.128:8082;}權重(weight):weight代表權重,默認為 1。采用了加權Round-Robin算法,權重越高則被分配的概率也就越大。通過通過設置不同的權重來控制訪問量,解決后端服務器性能不均的問題
upstream serverlist {server 192.168.220.128:8081 weight = 4; //沒有指定權重時默認為1 server 192.168.220.128:8082 weight = 3;}ip_hash:每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決 session 的問題。但是在擴容以及服務器宕機時,由于服務器數量發生變化,hash算法的計算結果也會不一樣,就會導致大范圍的緩存失效或者擴容困難等問題,因此hash模塊中又引入了一致性哈希算法,在這里就不展開講了,有興趣的小伙伴可以看看我以前的博客
分布式存儲與一致性哈希
fair(第三方):按后端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream serverlist {server 192.168.220.128:8081; server 192.168.220.128:8082;fair;}配置實例
目標
將靜態資源轉發到靜態服務器中
流程
1.準備兩個http服務器以及測試用html文件
2.配置nginx
負載均衡的配置方法如下,首先需要在http塊中添加負載服務器列表
upstream serverlist {//可以在這里設置分配策略,默認為輪詢分配server 192.168.220.128:8081; //默認權重為1server 192.168.220.128:8082;}接著在server中設置將請求轉發到上述列表中
server {listen 80;server_name 192.168.220.128;location / {proxy_pass http://serverlist; //設置轉發列表root html;index index.html index.htm;} }配置完成后由于nginx默認采用輪詢分配,因此我們每次刷新都會在兩個服務器中輪詢
總結
以上是生活随笔為你收集整理的Nginx 反向代理、动静分离、负载均衡及配置实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 趣谈设计模式 | 模板方法模式(Temp
- 下一篇: Redis 特殊数据类型 :Geospa