天天看點

nginx的n種用法,你都會嗎?

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

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

文章提綱:
  1. 正向代理
  2. 反向代理
  3. 透明代理
  4. 負載均衡
  5. 靜态伺服器
  6. nginx的安裝

1. 正向代理

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

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

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

借助解釋,回歸到nginx的概念,正向代理其實就是說用戶端無法主動或者不打算完成主動去向某伺服器發起請求,而是委托了nginx代理伺服器去向伺服器發起請求,并且獲得處理結果,傳回給用戶端。

從下圖可以看出:用戶端向目标伺服器發起的請求,是由代理伺服器代替它向目标主機發起,得到結果之後,通過代理伺服器傳回給用戶端。

nginx的n種用法,你都會嗎?

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

正向代理的配置:
server {
    #指定DNS伺服器IP位址  
    resolver 114.114.114.114;   
    #指定代理端口    
    listen 8080;  
    location / {
        #設定代理伺服器的協定和位址(固定不變)    
        proxy_pass http://$http_host$request_uri; 
    }  
}            

複制

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

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

複制

正向代理的關鍵配置:

  1. resolver:DNS伺服器IP位址
  2. listen:主動發起請求的内網伺服器端口
  3. proxy_pass:代理伺服器的協定和位址

2. 反向代理

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

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

nginx的n種用法,你都會嗎?

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

nginx的n種用法,你都會嗎?
反向代理配置:
server {
    #監聽端口
    listen 80;
    #伺服器名稱,也就是用戶端通路的域名位址
    server_name  a.xxx.com;
    #nginx日志輸出檔案
    access_log  logs/nginx.access.log  main;
    #nginx錯誤日志輸出檔案
    error_log  logs/nginx.error.log;
    root   html;
    index  index.html index.htm index.php;
    location / {
        #被代理伺服器的位址
        proxy_pass  http://localhost:8081;
        #對發送給用戶端的URL進行修改的操作
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
   }
}           

複制

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

  1. server_name:代表用戶端向伺服器發起請求時輸入的域名
  2. proxy_pass:代表源伺服器的通路位址,也就是真正處理請求的伺服器(localhost+端口号)。

3. 透明代理

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

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

nginx的n種用法,你都會嗎?

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

4. 負載均衡

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

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

nginx的n種用法,你都會嗎?

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

  1. 輪詢:每個請求按時間順序逐一配置設定到不同的後端伺服器,也是nginx的預設模式。輪詢模式的配置很簡單,隻需要把伺服器清單加入到upstream子產品中即可。

下面的配置是指:負載中有三台伺服器,當請求到達時,nginx按照時間順序把請求配置設定給三台伺服器處理。

upstream serverList {
    server 1.2.3.4;
    server 1.2.3.5;
    server 1.2.3.6;
}           

複制

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

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

upstream serverList {
    ip_hash
    server 1.2.3.4;
    server 1.2.3.5;
    server 1.2.3.6;
}           

複制

  1. url_hash:按通路url的hash結果來配置設定請求,相同的url固定轉發到同一個後端伺服器處理。
upstream serverList {
    server 1.2.3.4;
    server 1.2.3.5;
    server 1.2.3.6;
    hash $request_uri; 
    hash_method crc32; 
}           

複制

  1. fair:按後端伺服器的響應時間來配置設定請求,響應時間短的優先配置設定。
upstream serverList {
    server 1.2.3.4;
    server 1.2.3.5;
    server 1.2.3.6;
    fair;
}           

複制

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

  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處理。

upstream serverList {
    server 1.2.3.4 weight=30;
    server 1.2.3.5 weight=50;
    server 1.2.3.6 weight=20;
}           

複制

如下面的配置是指:負載中有三台伺服器,伺服器4的失敗逾時時間為60s,伺服器5暫不參與負載,伺服器6隻用作備份機。

upstream serverList {
    server 1.2.3.4 fail_timeout=60s;
    server 1.2.3.5 down;
    server 1.2.3.6 backup;
}           

複制

下面是一個配置負載均衡的示例(隻寫了關鍵配置): 其中:
  1. upstream:是負載的配置子產品,serverList是名稱,随便起
  2. server_name:是用戶端請求的域名位址
  3. proxy_pass:是指向負載的清單的子產品,如serverList
upstream serverList {
    server 1.2.3.4 weight=30;
    server 1.2.3.5 down;
    server 1.2.3.6 backup;
}   

server {
    listen 80;
    server_name  www.xxx.com;
    root   html;
    index  index.html index.htm index.php;
    location / {
        proxy_pass  http://serverList;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
   }
}           

複制

5. 靜态伺服器

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

靜态伺服器的配置如下,其中關鍵配置為:
  1. root:直接靜态項目的絕對路徑的根目錄。
  2. server_name : 靜态網站通路的域名位址。
server {
        listen       80;                                                         
        server_name  www.xxx.com;                                               
        client_max_body_size 1024M;
        location / {
               root   /var/www/xxx_static;
               index  index.html;
           }
    }           

複制

6. nginx的安裝

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

  1. 安裝依賴:
//一鍵安裝上面四個依賴
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel           

複制

  1. 安裝nginx:
yum install nginx           

複制

  1. 檢查是否安裝成功:
nginx -v           

複制

  1. 啟動/挺屍nginx:
/etc/init.d/nginx start
/etc/init.d/nginx stop           

複制

  1. 編輯配置檔案:
/etc/nginx/nginx.conf            

複制

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