當前位置:
首頁 > 知識 > nginx常用功能全揭秘

nginx常用功能全揭秘


來自:編程無界(微信號:qianshic)





本文旨在用最通俗的語言講述最枯燥的基本知識


nginx作為一個高性能的web伺服器,想必大家垂涎已久,蠢蠢欲動,想學習一番了吧,語法不多說,網上一大堆。下面博主就nginx的非常常用的幾個功能做一些講述和分析,學會了這幾個功能,平常的開發和部署就不是什麼問題了。因此希望大家看完之後,能自己裝個nginx來學習配置測試,這樣才能真正的掌握它。



文章提綱:




  1. 正向代理



  2. 反向代理



  3. 透明代理



  4. 負載均衡



  5. 靜態伺服器



  6. nginx的安裝


1. 正向代理


正向代理:內網伺服器主動去請求外網的服務的一種行為


光看概念,可能有讀者還是搞不明白:什麼叫做「正向」,什麼叫做「代理」,我們分別來理解一下這兩個名詞。



正向:相同的或一致的方向
代理:自己做不了的事情或者自己不打算做的事情,委託或依靠別人來完成。


藉助解釋,回歸到nginx的概念,正向代理其實就是說客戶端無法主動或者不打算完成主動去向某伺服器發起請求,而是委託了nginx代理伺服器去向伺服器發起請求,並且獲得處理結果,返回給客戶端。
從下圖可以看出:

客戶端向目標伺服器發起的請求,是由代理伺服器代替它向目標主機發起,得到結果之後,通過代理伺服器返回給客戶端。





舉個栗子:廣大社會主義接班人都知道,為了保護祖國的花朵不受外界的烏煙瘴氣熏陶,國家對網路做了一些「優化」,正常情況下是不能外網的,但作為程序員的我們如果沒有谷歌等搜索引擎的幫助,再銷魂的代碼也會因此失色,因此,網路上也曾出現過一些fan qiang技術和軟體供有需要的人使用,如某VPN等,其實VPN的原理大體上也類似於一個正向代理,也就是需要訪問外網的電腦,發起一個訪問外網的請求,通過本機上的VPN去尋找一個可以訪問國外網站的代理伺服器,代理伺服器向外國網站發起請求,然後把結果返回給本機。


正向代理的配置:

1

server

 {

2

    

#指定DNS伺服器IP地址  


3

    

resolver

 

114.114.114.114

;   

4

    

#指定代理埠    


5

    

listen

 

8080

;  

6

    

location

 / {

7

        

#設定代理伺服器的協議和地址(固定不變)    


8

        

proxy_pass

 http://

$http_host

$request_uri


9

    }  

10



這樣就可以做到內網中埠為8080的伺服器主動請求到1.2.13.4的主機上,如在Linux下可以:

1

curl --proxy proxy_server:8080 http://www.taobao.com/

正向代理的關鍵配置:





  1. resolver:DNS伺服器IP地址



  2. listen:主動發起請求的內網伺服器埠



  3. proxy_pass:代理伺服器的協議和地址


2. 反向代理



反向代理:reverse proxy,是指用代理伺服器來接受客戶端發來的請求,然後將請求轉發給內網中的上游伺服器,上游伺服器處理完之後,把結果通過nginx返回給客戶端。


上面講述了正向代理的原理,相信對於反向代理,就很好理解了吧。
反向代理是對於來自外界的請求,先通過nginx統一接受,然後按需轉發給內網中的伺服器,並且把處理請求返回給外界客戶端,此時代理伺服器對外表現的就是一個web伺服器,客戶端根本不知道「上游伺服器」的存在。


舉個栗子:一個伺服器的80埠只有一個,而伺服器中可能有多個項目,如果A項目是埠是8081,B項目是8082,C項目是8083,假設指向該伺服器的域名為www.xxx.com,此時訪問B項目是www.xxx.com:8082,以此類推其它項目的URL也是要加上一個埠號,這樣就很不美觀了,這時我們把80埠給nginx伺服器,給每個項目分配一個獨立的子域名,如A項目是a.xxx.com,並且在nginx中設置每個項目的轉發配置,然後對所有項目的訪問都由nginx伺服器接受,然後根據配置轉發給不同的伺服器處理。具體流程如下圖所示:




反向代理配置:

1

server

 {

2

    

#監聽埠

3

    

listen

 

80

;

4

    

#伺服器名稱,也就是客戶端訪問的域名地址


5

    

server_name

  a.xxx.com;

6

    

#nginx日誌輸出文件


7

    

access_log

  logs/nginx.access.log  main;

8

    

#nginx錯誤日誌輸出文件


9

    

error_log

  logs/nginx.

error

.log;

10

    

root

   html;

11

    

index

  index.html index.htm index.php;

12

    

location

 / {

13

        

#被代理伺服器的地址


14

        

proxy_pass

  http://localhost:8081;

15

        

#對發送給客戶端的URL進行修改的操作


16

        

proxy_redirect

     

off

;

17

        

proxy_set_header

   Host             

$host

;

18

        

proxy_set_header

   X-Real-IP        

$remote_addr

;

19

        

proxy_set_header

   X-Forwarded-For  

$proxy_add_x_forwarded_for

;

20

        

proxy_next_upstream

 

error

 timeout invalid_header http_500 http_502 http_503 http_504;

21

        

proxy_max_temp_file_size

 

0

;

22

   }

23

}

這樣就可以通過a.xxx.com來訪問a項目對應的網站了,而不需要帶上難看的埠號。
反向代理的配置關鍵點是:





  1. server_name:代表客戶端向伺服器發起請求時輸入的域名



  2. proxy_pass:代表源伺服器的訪問地址,也就是真正處理請求的伺服器(localhost+埠號)。


3. 透明代理



透明代理:也叫做簡單代理,意思客戶端向服務端發起請求時,請求會先到達透明代理伺服器,代理伺服器再把請求轉交給真實的源伺服器處理,也就是是客戶端根本不知道有代理伺服器的存在。


舉個栗子:它的用法有點類似於攔截器,如某些制度嚴格的公司里的辦公電腦,無論我們用電腦做了什麼事情,安全部門都能攔截我們對外發送的任何東西,這是因為電腦在對外發送時,實際上先經過網路上的一個透明的伺服器,經過它的處理之後,才接著往外網走,而我們在網上衝浪時,根本沒有感知到有攔截器攔截我們的數據和信息。





有人說透明代理和反向代理有點像,都是由代理伺服器先接受請求,再轉發到源伺服器。其實本質上是有區別的,透明代理是客戶端感知不到代理伺服器的存在,而反向代理是客戶端感知只有一個代理伺服器的存在,因此他們一個是隱藏了自己,一個是隱藏了源伺服器。事實上,透明代理和正向代理才是相像的,都是由客戶端主動發起請求,代理伺服器處理;他們差異點在於:正向代理是代理伺服器代替客戶端請求,而透明代理是客戶端在發起請求時,會先經過透明代理伺服器,再達到服務端,在這過程中,客戶端是感知不到這個代理伺服器的。


4. 負載均衡


負載均衡:將伺服器接收到的請求按照規則分發的過程,稱為負載均衡。負載均衡是反向代理的一種體現。


可能絕大部分人接觸到的web項目,剛開始時都是一台伺服器就搞定了,但當網站訪問量越來越大時,單台伺服器就扛不住了,這時候需要增加伺服器做成集群來分擔流量壓力,而在架設這些伺服器時,nginx就充當了接受流量和分流的作用了,當請求到nginx伺服器時,nginx就可以根據設置好的負載信息,把請求分配到不同的伺服器,伺服器處理完畢後,nginx獲取處理結果返回給客戶端,這樣,用nginx的反向代理,即可實現了負載均衡。



nginx實現負載均衡有幾種模式:





  1. 輪詢:每個請求按時間順序逐一分配到不同的後端伺服器,也是nginx的默認模式。輪詢模式的配置很簡單,只需要把伺服器列表加入到upstream模塊中即可。


下面的配置是指:

負載中有三台伺服器,當請求到達時,nginx按照時間順序把請求分配給三台伺服器處理。

1

upstream serverList {

2

    server 

1.2

.3.4;

3

    server 

1.2

.3.5;

4

    server 

1.2

.3.6;

5

}




  1. ip_hash:每個請求按訪問IP的hash結果分配,同一個IP客戶端固定訪問一個後端伺服器。可以保證來自同一ip的請求被打到固定的機器上,可以解決session問題。


下面的配置是指:

負載中有三台伺服器,當請求到達時,nginx優先按照ip_hash的結果進行分配,也就是同一個IP的請求固定在某一台伺服器上,其它則按時間順序把請求分配給三台伺服器處理。

1

upstream serverList {

2

    ip_hash

3

    server 

1.2

.3.4;

4

    server 

1.2

.3.5;

5

    server 

1.2

.3.6;

6

}




  1. url_hash:按訪問url的hash結果來分配請求,相同的url固定轉發到同一個後端伺服器處理。

1

upstream serverList {

2

    server 

1.2

.3.4;

3

    server 

1.2

.3.5;

4

    server 

1.2

.3.6;

5

    hash $request_uri; 

6

    hash_method crc32; 

7

}




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

1

upstream serverList {

2

    server 

1.2

.3.4;

3

    server 

1.2

.3.5;

4

    server 

1.2

.3.6;

5

    fair;

6

}

而在每一種模式中,每一台伺服器後面的可以攜帶的參數有:





  1. down: 當前伺服器暫不參與負載



  2. weight: 權重,值越大,伺服器的負載量越大。



  3. max_fails:允許請求失敗的次數,默認為1。



  4. fail_timeout:max_fails次失敗後暫停的時間。



  5. backup:備份機, 只有其它所有的非backup機器down或者忙時才會請求backup機器。


如下面的配置是指:

負載中有三台伺服器,當請求到達時,nginx按時間順序和權重把請求分配給三台伺服器處理,例如有100個請求,有30%是伺服器4處理,有50%的請求是伺服器5處理,有20%的請求是伺服器6處理。

1

upstream serverList {

2

    server 

1.2

.3.4 weight=

30

;

3

    server 

1.2

.3.5 weight=

50

;

4

    server 

1.2

.3.6 weight=

20

;

5

}

如下面的配置是指:

負載中有三台伺服器,伺服器4的失敗超時時間為60s,伺服器5暫不參與負載,伺服器6隻用作備份機。

1

upstream serverList {

2

    server 

1.2

.3.4 fail_timeout=

60

s;

3

    server 

1.2

.3.5 down;

4

    server 

1.2

.3.6 backup;

5

}


下面是一個配置負載均衡的示例(只寫了關鍵配置):
其中:




  1. upstream:是負載的配置模塊,serverList是名稱,隨便起



  2. server_name:是客戶端請求的域名地址



  3. proxy_pass:是指向負載的列表的模塊,如serverList

1

upstream

 serverList {

2

    

server

 

1.2.3.4

 weight=

30

;

3

    

server

 

1.2.3.5

 down;

4

    

server

 

1.2.3.6

 backup;

5

}   

6


7

server

 {

8

    

listen

 

80

;

9

    

server_name

  www.xxx.com;

10

    

root

   html;

11

    

index

  index.html index.htm index.php;

12

    

location

 / {

13

        

proxy_pass

  http://serverList;

14

        

proxy_redirect

     

off

;

15

        

proxy_set_header

   Host             

$host

;

16

   }

17

}

5. 靜態伺服器


現在很多項目流行前後分離,也就是前端伺服器和後端伺服器分離,分別部署,這樣的方式能讓前後端人員能各司其職,不需要互相依賴,而前後分離中,前端項目的運行是不需要用Tomcat、Apache等伺服器環境的,因此可以直接用nginx來作為靜態伺服器。



靜態伺服器的配置如下,其中關鍵配置為:




  1. root:直接靜態項目的絕對路徑的根目錄。



  2. server_name : 靜態網站訪問的域名地址。

1

server

 {

2

        

listen

       

80

;                                                         

3

        

server_name

  www.xxx.com;                                               

4

        

client_max_body_size

 

1024M

;

5

        

location

 / {

6

               

root

   /var/www/xxx_static;

7

               

index

  index.html;

8

           }

9

    }

6. nginx的安裝


學了這麼多nginx的配置用法之後,我們需要對每一個知識點做一下測試,才能印象深刻,在此之前,我們需要知道nginx是怎麼安裝,下面以Linux環境為例,簡述yum方式安裝nginx的步驟:




  1. 安裝依賴:

1

//一鍵安裝上面四個依賴

2

yum

 -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel



  1. 安裝nginx:

1

yum

 install nginx



  1. 檢查是否安裝成功:

1

nginx

 -v



  1. 啟動/挺屍nginx:

1

/etc/init.d/

nginx

 start

2

/etc/init.d/nginx stop



  1. 編輯配置文件:

1

/etc/nginx/nginx.

conf

 

這些步驟都完成之後,我們就可以進入nginx的配置文件nginx.conf對上面的各個知識點,進行配置和測試了。


編號644,輸入編號直達本文



●輸入m獲取文章目錄

推薦↓↓↓



前端開發


更多推薦

25個技術類公眾微信


涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux學習 的精彩文章:

從微觀角度來看Linux內核設計
我也是一個線程,為什麼每天累得像狗一樣?

TAG:Linux學習 |