1. 程式人生 > >【修真院JAVA小課堂】nginx伺服器有什麼作用?什麼叫反向代理?為什麼要使用反向代理?

【修真院JAVA小課堂】nginx伺服器有什麼作用?什麼叫反向代理?為什麼要使用反向代理?

大家好,我是IT修真院深圳分院第十二期學員,一枚正直純潔善良的JAVA程式設計師。

今天給大家分享一下,修真院官網JAVA任務三的一個知識點:

nginx伺服器有什麼作用?什麼叫反向代理?為什麼要使用反向代理?

課題:nginx伺服器有什麼作用?什麼叫反向代理?為什麼要使用反向代理?

1.背景介紹

2.知識剖析

3.常見問題

4.解決方案

5.編碼實戰

6.擴充套件思考

7.參考文獻      

8.更多討論

 

1.背景介紹

1.1 Nginx是什麼?

在傳統的Web伺服器體系結構中,每個客戶端連線作為一個單獨的程序或執行緒處理,隨著網站的流行度增加,併發連線數量的增加,Web伺服器減慢,延遲了對使用者的響應。

從技術的角度來看,產生一個單獨的程序/執行緒需要將CPU切換到新的任務並建立一個新的執行時上下文,消耗額外的記憶體和CPU時間,從而對效能產生負面影響。

Nginx (engine x) 是一個高效能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。其特 點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、京東、新浪、網易、騰訊、淘寶等。

 

2 知識剖析

2.1.nginx伺服器有什麼作用?

2.2.什麼叫反向代理?

2.3.為什麼要使用反向代理?

2.4 什麼是負載均衡?負載均衡的作用是什麼?

2.5 什麼是動靜分離?動靜分離的作用?

 

 

2.1 nginx伺服器有什麼作用?

1、反向代理

2、負載均衡

3、動靜分離

 

2.2 什麼叫反向代理?

反向代理:反向代理(ReverseProxy)是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,簡單來說就是真實的伺服器不能直接被外部網路訪問,想要訪問必須通過代理。

 

2.3 為什麼要使用反向代理

1、防止主伺服器被惡意攻擊

2、為負載均衡和動靜分離提供實現支援

 

2.4 什麼是負載均衡?負載均衡的作用是什麼?

負載均衡:使用反向代理同時代理多個相同內容的應用伺服器(比如tomcat),將客戶端請求分發到各個應用伺服器上並接收響應返回給客戶端。對於Nginx而言,就是將收到的訪問請求分發給不同的Web伺服器, 以提高訪問效能以及可靠性。負載均衡可以有效防止一個伺服器宕機而導致服務停止。

 負載均衡的作用是什麼?

當一臺伺服器的單位時間內的訪問量越大時,伺服器壓力就越大,大到超過自身承受能力時,伺服器就會崩潰。為了避免伺服器崩潰,讓使用者有更好的體驗,我們通過負載均衡的方式來分擔伺服器壓力。我們可以建立很多很多伺服器,組成一個伺服器叢集,當用戶訪問網站時,先訪問一箇中間伺服器,在讓這個中間伺服器在伺服器叢集中選擇一個壓力較小的伺服器,然後將該訪問請求引入該伺服器。如此一來,使用者的每次訪問,都會保證伺服器叢集中的每個伺服器壓力趨於平衡,分擔了伺服器壓力,避免了伺服器崩潰的情況。

 

2.5 什麼是動靜分離?動靜分離的作用?

動靜分離:運用Nginx的反向代理功能分發請求:所有動態資源的請求交給應用伺服器,而靜態資源的請求(例如圖片、視訊、CSS、JavaScript檔案等)則直接由Nginx返回到瀏覽器。

動靜分離的作用:

主要是nginx處理靜態頁面的效率遠高於tomcat的處理能力,使用c語言開發的nginx對靜態資源每秒的吞吐量是使用Java語言開發的tomcat的6倍,也遠高於其它應用伺服器。

nginx應用之所以廣泛,我認為這歸功於它的靈活配置,一個nginx.conf檔案解決大部分問題,不論是nginx建立虛擬伺服器、nginx的反向代理伺服器,還是nginx的負載均衡,幾乎都在這個配置檔案中進行。伺服器上只負責把nginx搭好,跑起來即可。而且它本身輕量級,不需要佔用伺服器太多資源就可以達到較好的效果,是一個非常值得推崇的伺服器。

 

3.常見問題

如何配置反向代理

如何配置負載均衡

如何配置動靜分離

 

4.解決方案

參見編碼實戰

4.1.

a.主要是對proxy_pass的使用

 

4.2.

a.兩臺或以上的應用伺服器

b.主要是upstream和反向代理的聯合使用

nginx的upstream常用分發策略

1)、輪詢(預設)——每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。

2)、weight ——指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。

3)、ip_hash ——每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器。

4)、backup——其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。

5)、down——表示當前的server暫時不參與負載

 

4.3.

a、正則表示式匹配靜態資源字尾

b、找到靜態資源本地存放路徑

 

5.編碼實戰

 

6.擴充套件思考

什麼是正向代理:

是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向代理。正向代理的典型用途是為在防火牆內的區域網客戶端提供訪問Internet的途徑。 正向代理還可以使用緩衝特性(由mod_cache提供)減少網路使用率。

 

7.參考文獻      

CSDN、百度百科

 

8.更多討論

8.1 什麼是伺服器叢集?

伺服器叢集就是指將很多伺服器集中起來一起進行同一種服務,在客戶端看來就像是隻有一個伺服器。叢集可以利用多個計算機進行平行計算從而獲得很高的計算速度,也可以用多個計算機做備份,從而使得任何一個機器壞了整個系統還是能正常執行。

8.2 什麼是分散式

分散式系統(distributed system)是建立在網路之上的軟體系統。正是因為軟體的特性,所以分散式系統具有高度的內聚性和透明性。因此,網路和分散式系統之間的區別更多的在於高層軟體(特別是作業系統),而不是硬體。內聚性是指每一個數據庫分佈節點高度自治,有本地的資料庫管理系統。透明性是指每一個數據庫分佈節點對使用者的應用來說都是透明的,看不出是本地還是遠端。在分散式資料庫系統中,使用者感覺不到資料是分佈的,即使用者不須知道關係是否分割、有無副本、資料存於哪個站點以及事務在哪個站點上執行等。

8.3除了Nginx,還有哪些代理伺服器?

1、Varnish

Varnish是一款反向HTTP代理伺服器,提供加速設計給大流量的網站應用。

2、HAProxy

HAProxy是一個免費且開源的軟體。它提供3層(TCP)和7層(http)協議支援負載均衡以及反向代理伺服器功能。

 

 

 

#執行使用者
user www-data;    
#啟動程序,通常設定成和cpu的數量相等
worker_processes  1;

#全域性錯誤日誌及PID檔案
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

#工作模式及連線數上限
events {
    use   epoll;             #epoll是多路複用IO(I/O Multiplexing)中的一種方式,但是僅用於linux2.6以上核心,可以大大提高nginx的效能
    worker_connections  1024;#單個後臺worker process程序的最大併發連結數
    # multi_accept on; 
}

#設定http伺服器,利用它的反向代理功能提供負載均衡支援
http {
     #設定mime型別,型別由mime.type檔案定義
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #設定日誌格式
    access_log    /var/log/nginx/access.log;

    #sendfile 指令指定 nginx 是否呼叫 sendfile 函式(zero copy 方式)來輸出檔案,對於普通應用,
    #必須設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為 off,以平衡磁碟與網路I/O處理速度,降低系統的uptime.
    sendfile        on;
    #tcp_nopush     on;

    #連線超時時間
    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;
    
    #開啟gzip壓縮
    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    #設定請求緩衝
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    #設定負載均衡的伺服器列表
     upstream mysvr {
    #weigth引數表示權值,權值越高被分配到的機率越大
    #本機上的Squid開啟3128埠
    server 192.168.8.1:3128 weight=5;
    server 192.168.8.2:80  weight=1;
    server 192.168.8.3:80  weight=6;
    }


   server {
    #偵聽80埠
        listen       80;
        #定義使用www.xx.com訪問
        server_name  www.xx.com;

        #設定本虛擬主機的訪問日誌
        access_log  logs/www.xx.com.access.log  main;

    #預設請求
    location / {
          root   /root;      #定義伺服器的預設網站根目錄位置
          index index.php index.html index.htm;   #定義首頁索引檔案的名稱

          fastcgi_pass  www.xx.com;
         fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name; 
          include /etc/nginx/fastcgi_params;
        }

    # 定義錯誤提示頁面
    error_page   500 502 503 504 /50x.html;  
        location = /50x.html {
        root   /root;
    }

    #靜態檔案,nginx自己處理
    location ~ ^/(images|javascript|js|css|flash|media|static)/ {
        root /var/www/virtual/htdocs;
        #過期30天,靜態檔案不怎麼更新,過期可以設大一點,如果頻繁更新,則可以設定得小一點。
        expires 30d;
    }
    #PHP 指令碼請求全部轉發到 FastCGI處理. 使用FastCGI預設配置.
    location ~ \.php$ {
        root /root;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
        include fastcgi_params;
    }
    #設定檢視Nginx狀態的地址
    location /NginxStatus {
        stub_status            on;
        access_log              on;
        auth_basic              "NginxStatus";
        auth_basic_user_file  conf/htpasswd;
    }
    #禁止訪問 .htxxx 檔案
    location ~ /\.ht {
        deny all;
    }
     
     }

 

如果要使用負載均衡的話,可以修改配置http節點如下:

 

#設定http伺服器,利用它的反向代理功能提供負載均衡支援
http {
     #設定mime型別,型別由mime.type檔案定義
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #設定日誌格式
    access_log    /var/log/nginx/access.log;

    #省略上文有的一些配置節點

    #。。。。。。。。。。

    #設定負載均衡的伺服器列表
     upstream mysvr {
    #weigth引數表示權值,權值越高被分配到的機率越大
    server 192.168.8.1x:3128 weight=5;#本機上的Squid開啟3128埠
    server 192.168.8.2x:80  weight=1;
    server 192.168.8.3x:80  weight=6;
    }

   upstream mysvr2 {
    #weigth引數表示權值,權值越高被分配到的機率越大

    server 192.168.8.x:80  weight=1;
    server 192.168.8.x:80  weight=6;
    }

   #第一個虛擬伺服器
   server {
    #偵聽192.168.8.x的80埠
        listen       80;
        server_name  192.168.8.x;

      #對aspx字尾的進行負載均衡請求
    location ~ .*\.aspx$ {

         root   /root;      #定義伺服器的預設網站根目錄位置
          index index.php index.html index.htm;   #定義首頁索引檔案的名稱

          proxy_pass  http://mysvr ;#請求轉向mysvr 定義的伺服器列表

          #以下是一些反向代理的配置可刪除.

          proxy_redirect off;

          #後端的Web伺服器可以通過X-Forwarded-For獲取使用者真實IP
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          client_max_body_size 10m;    #允許客戶端請求的最大單檔案位元組數
          client_body_buffer_size 128k;  #緩衝區代理緩衝使用者端請求的最大位元組數,
          proxy_connect_timeout 90;  #nginx跟後端伺服器連線超時時間(代理連線超時)
          proxy_send_timeout 90;        #後端伺服器資料回傳時間(代理髮送超時)
          proxy_read_timeout 90;         #連線成功後,後端伺服器響應時間(代理接收超時)
          proxy_buffer_size 4k;             #設定代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小
          proxy_buffers 4 32k;               #proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設定
          proxy_busy_buffers_size 64k;    #高負荷下緩衝大小(proxy_buffers*2)
          proxy_temp_file_write_size 64k;  #設定快取資料夾大小,大於這個值,將從upstream伺服器傳

       }

     }
}

 

Nginx負載均衡是通過upstream模組來實現的,內建實現了三種負載策略,配置還是比較簡單的。官網負載均衡配置說明:http://nginx.org/en/docs/http/load_balancing.html

  • 輪循(預設) 
    Nginx根據請求次數,將每個請求均勻分配到每臺伺服器
  • 最少連線 
    將請求分配給連線數最少的伺服器。Nginx會統計哪些伺服器的連線數最少。
  • IP Hash 
    繫結處理請求的伺服器。第一次請求時,根據該客戶端的IP算出一個HASH值,將請求分配到叢集中的某一臺伺服器上。後面該客戶端的所有請求,都將通過HASH演算法,找到之前處理這臺客戶端請求的伺服器,然後將請求交給它來處理。

 

今天的分享就到這裡啦,歡迎大家點贊、轉發、留言、拍磚~

技能樹.IT修真院   

  “我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷茫”。

   這裡是技能樹.IT修真院,成千上萬的師兄在這裡找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。

快來與我一起學習吧~http://www.jnshu.com/login/1/12744596

騰訊視訊:https://v.qq.com/x/page/k0754yntl75.html