【詳細了解】Nginx 除了負載均衡,還能做什麼?

2021-03-02 Java知音

本文只針對 Nginx 在不加載第三方模塊的情況能處理哪些事情,由於第三方模塊太多所以也介紹不完,當然本文本身也可能介紹的不完整,畢竟只是我個人使用過和了解到過的。

Nginx能做什麼

以上就是我了解到的 Nginx 在不依賴第三方模塊能處理的事情,下面詳細說明每種功能怎麼做。

反向代理

反向代理應該是 Nginx 做的最多的一件事了,什麼是反向代理呢,以下是百度百科的說法:反向代理(Reverse Proxy)方式是指以代理伺服器來接受 internet 上的連接請求,然後將請求轉發給內部網絡上的伺服器,並將從伺服器上得到的結果返回給 internet 上請求連接的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。

簡單來說就是真實的伺服器不能直接被外部網絡訪問,所以需要一臺代理伺服器,而代理伺服器能被外部網絡訪問的同時又跟真實伺服器在同一個網絡環境,當然也可能是同一臺伺服器,埠不同而已。下面貼上一段簡單的實現反向代理的代碼:

server {    
    listen       80;                                                           
    server_name  localhost;                                                 
    client_max_body_size 1024M;  
  
    location / {  
        proxy_pass http://localhost:8080;  
        proxy_set_header Host $host:$server_port;  
    }  
}  

保存配置文件後啟動 Nginx,這樣當我們訪問 localhost 的時候,就相當於訪問 localhost:8080 了。

負載均衡

負載均衡也是 Nginx 常用的一個功能,負載均衡其意思就是分攤到多個操作單元上進行執行,例如 Web 伺服器、FTP 伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,從而共同完成工作任務。

簡單而言就是當有2臺或以上伺服器時,根據規則隨機的將請求分發到指定的伺服器上處理,負載均衡配置一般都需要同時配置反向代理,通過反向代理跳轉到負載均衡。

Nginx 目前支持自帶3種負載均衡策略,還有2種常用的第三方策略。

RR(默認)

每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。

upstream test {  
    server localhost:8080;  
    server localhost:8081;  
}  
server {  
    listen       81;                                                           
    server_name  localhost;                                                 
    client_max_body_size 1024M;  
  
    location / {  
        proxy_pass http://test;  
        proxy_set_header Host $host:$server_port;  
    }  
}  

負載均衡的核心代碼為:

upstream test {  
    server localhost:8080;  
    server localhost:8081;  
}  

這裡我配置了2臺伺服器,當然實際上是一臺,只是埠不一樣而已,而 8081 的伺服器是不存在的,也就是說訪問不到,但是我們訪問 http://localhost 的時候,也不會有問題,會默認跳轉到 http://localhost:8080 具體是因為Nginx會自動判斷伺服器的狀態,如果伺服器處於不能訪問(伺服器掛了),就不會跳轉到這臺伺服器,所以也避免了一臺伺服器掛了影響使用的情況,由於Nginx默認是RR策略,所以我們不需要其他更多的設置。

權重

指定輪詢機率,weight 和訪問比率成正比,用於後端伺服器性能不均的情況。例如

upstream test {  
    server localhost:8080 weight=9;  
    server localhost:8081 weight=1;  
}  

那麼10次一般只會有1次會訪問到8081,而有9次會訪問到8080

ip_hash

上面的2種方式都有一個問題,那就是下一個請求來的時候請求可能分發到另外一個伺服器,當我們的程序不是無狀態的時候(採用了 session 保存數據),這時候就有一個很大的很問題了,比如把登錄信息保存到了session 中,那麼跳轉到另外一臺伺服器的時候就需要重新登錄了,所以很多時候我們需要一個客戶只訪問一個伺服器,那麼就需要用 iphash 了,iphash 的每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決 session 的問題。

upstream test {  
    ip_hash;  
    server localhost:8080;  
    server localhost:8081;  
}  

fair(第三方)

按後端伺服器的響應時間來分配請求,響應時間短的優先分配。

upstream backend {   
    fair;   
    server localhost:8080;  
    server localhost:8081;  
}  

url_hash(第三方)

按訪問 url 的hash結果來分配請求,使每個 url 定向到同一個後端伺服器,後端伺服器為緩存時比較有效。在 upstream 中加入 hash 語句,server 語句中不能寫入 weight 等其他的參數,hash_method 是使用的 hash 算法

upstream backend {   
    hash $request_uri;   
    hash_method crc32;   
    server localhost:8080;  
    server localhost:8081;  
}  

以上5種負載均衡各自適用不同情況下使用,所以可以根據實際情況選擇使用哪種策略模式,不過 fair 和 url_hash 需要安裝第三方模塊才能使用,由於本文主要介紹 Nginx 能做的事情,所以 Nginx 安裝第三方模塊不會再本文介紹。參考:就是要讓你搞懂Nginx,這篇就夠了!

HTTP伺服器

Nginx 本身也是一個靜態資源的伺服器,當只有靜態資源的時候,就可以使用 Nginx 來做伺服器,同時現在也很流行動靜分離,就可以通過 Nginx 來實現,首先看看 Nginx 做靜態資源伺服器。

server {  
    listen       80;                                                           
    server_name  localhost;                                                 
    client_max_body_size 1024M;  
      
    location / {  
        root   e:\wwwroot;  
        index  index.html;  
    }  
}  

這樣如果訪問 http://localhost 就會默認訪問到 E 盤 wwwroot目錄下面的 index.html,如果一個網站只是靜態頁面的話,那麼就可以通過這種方式來實現部署。

動靜分離

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

upstream test{    
   server localhost:8080;    
   server localhost:8081;    
}     
  
server {    
    listen       80;    
    server_name  localhost;    
  
    location / {    
        root   e:\wwwroot;    
        index  index.html;    
    }    
  
    # 所有靜態請求都由nginx處理,存放目錄為html    
    location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {    
        root    e:\wwwroot;    
    }    
  
    # 所有動態請求都轉發給tomcat處理    
    location ~ \.(jsp|do)$ {    
        proxy_pass  http://test;    
    }    
  
    error_page   500 502 503 504  /50x.html;    
    location = /50x.html {    
        root   e:\wwwroot;    
    }    
}  

這樣我們就可以把 HTML 以及圖片和 css 以及 js 放到 wwwroot 目錄下,而tomcat只負責處理 jsp 和請求,例如當我們後綴為 gif 的時候,Nginx 默認會從 wwwroot 獲取到當前請求的動態圖文件返回,當然這裡的靜態文件跟 Nginx 是同一臺伺服器,我們也可以在另外一臺伺服器,然後通過反向代理和負載均衡配置過去就好了,只要搞清楚了最基本的流程,很多配置就很簡單了,另外 localtion 後面其實是一個正則表達式,所以非常靈活。

正向代理

正向代理,意思是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端,客戶端才能使用正向代理。

resolver 114.114.114.114 8.8.8.8;  
server {  
  
    resolver_timeout 5s;  
  
    listen 81;  
  
    access_log  e:\wwwroot\proxy.access.log;  
    error_log   e:\wwwroot\proxy.error.log;  
  
    location / {  
        proxy_pass http://$host$request_uri;  
    }  
}  

resolver 是配置正向代理的 DNS 伺服器,listen 是正向代理的埠,配置好了就可以在 IE 上面或者其他代理插件上面使用伺服器 ip+埠號進行代理了。

最後說兩句

啟動停止及配置文件位置的命令:

/etc/init.d/nginx start/restart # 啟動/重啟Nginx服務  
  
/etc/init.d/nginx stop # 停止Nginx服務  
  
/etc/nginx/nginx.conf # Nginx配置文件位置  

Nginx 是支持熱啟動的,也就是說當我們修改配置文件後,不用關閉 Nginx,就可以實現讓配置生效,Nginx 重新讀取配置的命令是 nginx -s reload

相關焦點

  • Nginx代理功能與負載均衡詳解
    ,再說明負載均衡詳細。有哪些中負載均衡算法。這一結我就給如果操作配置的給大家做詳細說明下。首先給大家說下upstream這個配置的,這個配置是寫一組被代理的伺服器地址,然後配置負載均衡的算法。這裡的被代理伺服器地址有2中寫法。
  • Nginx 反向代理與負載均衡
    作者:chenhongdong連結:juejin.im/post/5b01336af265da0b8a67e5c9什麼是反向代理與負載均衡
  • Nginx 反向代理、負載均衡圖文教程 !
    當然很多都是隨便一說的玩笑話,聽過一笑便可,不必當真,也不必抱怨了好了,今天就直接來說一下主題吧,前端要了解一些運維的Nginx用法,內容不多,簡單看看就好,這兩個功能在工作當中就夠用了,那麼首先來看個問題,什麼是反向代理與負載均衡什麼是反向代理與負載均衡什麼是反向代理當我們有一個伺服器集群,並且伺服器集群中的每臺伺服器的內容一樣的時候,同樣我們要直接從個人電腦訪問到伺服器集群伺服器的時候無法訪問
  • Nginx+SpringBoot實現負載均衡
    前言本篇文章主要介紹的是Nginx如何實現負載均衡。負載均衡介紹介紹在介紹Nginx的負載均衡實現之前,先簡單的說下負載均衡的分類,主要分為硬體負載均衡和軟體負載均衡,硬體負載均衡是使用專門的軟體和硬體相結合的設備,設備商會提供完整成熟的解決方案,比如F5,在數據的穩定性以及安全性來說非常可靠,但是相比軟體而言造價會更加昂貴;軟體的負載均衡以Nginx這類軟體為主
  • 圖文講解,如何使用 Nginx 反向代理、負載均衡
    來源:http://t.cn/AiKual8Y學到老活到老什麼是反向代理與負載均衡Nginx反向代理與負載均衡的實現nginx配置proxy_passUpstream模塊實現負載均衡工作中的簡單使用學到老活到老前端圈一直很新
  • (實用篇)詳解 Nginx代理功能與負載均衡
    本篇文章主要介紹了詳解 Nginx代理功能與負載均衡,先描述一些關於代理功能的配置,再說明負載均衡詳細,有興趣的可以了解一下。 序言Nginx的代理功能與負載均衡功能是最常被用到的,關於nginx的基本語法常識與配置已在上篇文章中有說明,這篇就開門見山,先描述一些關於代理功能的配置,再說明負載均衡詳細。
  • Nginx七層的負載均衡
    協議配置這裡我們舉例,在nginx做負載均衡,負載多個服務,部分服務是需要7層的,部分服務是需要4層的,也就是說7層和4層配置在同一個配置文件中。在 1.9.0 的時候,增加了一個 stream 模塊,用來實現四層協議(網絡層和傳輸層)的轉發、代理、負載均衡等。
  • Nginx + Spring Boot 實現負載均衡
    前言本篇文章主要介紹的是 Nginx 如何實現負載均衡。負載均衡介紹在介紹 Nginx 的負載均衡實現之前,先簡單的說下負載均衡的分類,主要分為硬體負載均衡和軟體負載均衡,硬體負載均衡是使用專門的軟體和硬體相結合的設備,設備商會提供完整成熟的解決方案,比如 F5,在數據的穩定性以及安全性來說非常可靠,但是相比軟體而言造價會更加昂貴;軟體的負載均衡以 Nginx 這類軟體為主
  • 使用NGINX和NGINX Plus進行Docker Swarm負載均衡
    在2016年九月奧斯丁nginx.conf大會上,我做了一個關於如何在Docker Swarm集群中使用NGINX和NGINX Plus
  • Nginx+SpringBoot 實現負載均衡
    在介紹Nginx的負載均衡實現之前,先簡單的說下負載均衡的分類,主要分為硬體負載均衡和軟體負載均衡,硬體負載均衡是使用專門的軟體和硬體相結合的設備
  • 誰說前端不需要懂-Nginx反向代理與負載均衡
    今天就直接來說一下主題吧,前端要了解一些運維的Nginx用法,內容不多,簡單看看就好,這兩個功能在工作當中就夠用了,那麼首先來看個問題,什麼是反向代理與負載均衡什麼是反向代理與負載均衡什麼是反向代理當我們有一個伺服器集群,並且伺服器集群中的每臺伺服器的內容一樣的時候,同樣我們要直接從個人電腦訪問到伺服器集群伺服器的時候無法訪問
  • 使用Nginx進行四層負載均衡
    而TCP負載均衡,就是我們通常所說的"四層負載均衡",工作在"網絡層"和"傳輸層"。例如,LVS(Linux Virtual Server,Linux虛擬服務)和F5(一種硬體負載均衡設備)是屬於"四層負載均衡"的。
  • .Net分布式架構:Nginx實現負載均衡
    一:負載均衡簡介  負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP
  • nginx實現請求的負載均衡 + keepalived實現nginx的高可用
    nginx做負載均衡keepalived實現nginx高可用(HA)注意點參考前言使用集群是網站解決高並發、海量數據問題的常用手段。通過負載均衡調度伺服器,將來自瀏覽器的訪問請求分發到應用伺服器集群中的任何一臺伺服器上,如果有更多的用戶,就在集群中加入更多的應用伺服器,使應用伺服器的負載壓力不再成為整個網站的瓶頸。
  • Nginx如何優雅的實現負載均衡!(建議收藏)
    負載均衡介紹在介紹Nginx的負載均衡實現之前,先簡單的說下負載均衡的分類,主要分為硬體負載均衡和軟體負載均衡,硬體負載均衡是使用專門的軟體和硬體相結合的設備,設備商會提供完整成熟的解決方案,比如F5,在數據的穩定性以及安全性來說非常可靠,但是相比軟體而言造價會更加昂貴;軟體的負載均衡以
  • Nginx 反向代理和負載均衡策略實戰案例
    存在即合理,那為什麼要使用nginx呢?這得看看nginx能幫我們做些什麼。首先,nginx能做反向代理【關於反向代理和正向代理此處不做說明了,感興趣的小夥伴自行谷歌】;比方說,我想在本地使用 www.glmapper1.com 的域名去訪問www.taobao.com。 那麼這個時候我們就可以通過nginx去實現。
  • 超詳細!一文詳解負載均衡原理
    隨著業務流量越來越大,單臺伺服器無論如何優化,無論採用多好的硬體,總會有性能天花板,當單伺服器的性能無法滿足業務需求時,就需要把多臺伺服器組成集群系統提高整體的處理性能。基於上述需求,我們要使用統一的流量入口來對外提供服務,本質上就是需要一個流量調度器,通過均衡的算法,將用戶大量的請求流量均衡地分發到集群中不同的伺服器上。這其實就是我們今天要說的負載均衡。
  • Nginx面試三連問:Nginx如何工作?負載均衡策略有哪些?如何限流?
    1、什麼是Nginx,談談個人都理解,項目中是否用到,為什麼要用,有什麼優點?Nginx ,是一個 Web 伺服器和反向代理伺服器用於 HTTP、HTTPS、SMTP、POP3 和 IMAP 協議。主要功能如下:1、正向、反向代理2、負載均衡、分流3、虛擬主機(綁定host)優點:跨平臺、配置簡單,非阻塞、高並發連接、內存消耗小、成本低廉。2、正向代理和反向代理的區別是什麼?
  • Docker+nginx實現負載均衡
    Docker是一個開源的,輕量級容器引擎。
  • Nginx安裝配置及負載均衡集群配置tomcat
    server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library.