Nginx常用功能詳解,練習一下吧

碼農程序 / 2019-03-18 19:32:16

本公眾號只做學習分享,本公眾號會不定期的給大家分享視頻教學教程,項目源碼,文章最新動態等,感謝大家的支持!


抖音號startphp

用短視頻和大家分享PHP學習方法,學習技巧與經驗分享,

歡迎關注抖音號:startphp


教程力薦

要提升自己的學習能力的同學,自己還是要擁有一本屬于自己的書的,因為你在忘記的時候可以經常拿出來翻閱一下,鞏固一下。


文章內容

1. 正向代理

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

說反向代理之前,我們先看看正向代理,正向代理也是大家最常接觸的到的代理模式,我們會從兩個方面來說關于正向代理的處理模式,分別從軟件方面和生活方面來解釋一下什么叫正向代理。

在如今的網絡環境下,我們如果由于技術需要要去訪問國外的某些網站,此時你會發現位于國外的某網站我們通過瀏覽器是沒有辦法訪問的,此時大家可能都會用一個操作FQ進行訪問,FQ的方式主要是找到一個可以訪問國外網站的代理服務器,我們將請求發送給代理服務器,代理服務器去訪問國外的網站,然后將訪問到的數據傳遞給我們!

上述這樣的代理模式稱為正向代理,正向代理最大的特點是客戶端非常明確要訪問的服務器地址;服務器只清楚請求來自哪個代理服務器,而不清楚來自哪個具體的客戶端;正向代理模式屏蔽或者隱藏了真實客戶端信息。來看個示意圖(我把客戶端和正向代理框在一塊,同屬于一個環境,后面我有介紹):

正向代理的配置:

 1server {
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下可以:

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


正向代理的關鍵配置:

  1. resolver:DNS服務器IP地址

  2. listen:主動發起請求的內網服務器端口

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

總結來說:正向代理,"它代理的是客戶端"是一個位于客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求并指定目標(原始服務器),然后代理向原始服務器轉交請求并將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。

正向代理的用途:
(1)訪問原來無法訪問的資源,如Google
(2) 可以做緩存,加速訪問資源
(3)對客戶端訪問授權,上網進行認證
(4)代理可以記錄用戶訪問記錄(上網行為管理),對外隱藏用戶信息

2. 反向代理

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

明白了什么是正向代理,我們繼續看關于反向代理的處理方式,舉例某寶網站,每天同時連接到網站的訪問人數已經爆表,單個服務器遠遠不能滿足人民日益增長的購買欲望了,此時就出現了一個大家耳熟能詳的名詞:分布式部署;也就是通過部署多臺服務器來解決訪問人數限制的問題;某寶網站中大部分功能也是直接使用Nginx進行反向代理實現的,并且通過封裝Nginx和其他的組件之后起了個高大上的名字:Tengine,有興趣的童鞋可以訪問Tengine的官網查看具體的信息:http://tengine.taobao.org/。那么反向代理具體是通過什么樣的方式實現的分布式的集群操作呢,我們先看一個示意圖(我把服務器和反向代理框在一塊,同屬于一個環境,后面我有介紹):

通過上述的圖解大家就可以看清楚了,多個客戶端給服務器發送的請求,Nginx服務器接收到之后,按照一定的規則分發給了后端的業務處理服務器進行處理了。此時~請求的來源也就是客戶端是明確的,但是請求具體由哪臺服務器處理的并不明確了,Nginx扮演的就是一個反向代理角色。

客戶端是無感知代理的存在的,反向代理對外都是透明的,訪問者并不知道自己訪問的是一個代理。因為客戶端不需要任何配置就可以訪問。

反向代理,"它代理的是服務端",主要用于服務器集群分布式部署的情況下,反向代理隱藏了服務器的信息。

反向代理的作用:
(1)保證內網的安全,通常將反向代理作為公網訪問地址,Web服務器是內網
(2)負載均衡,通過反向代理服務器來優化網站的負載

項目場景

通常情況下,我們在實際項目操作時,正向代理和反向代理很有可能會存在在一個應用場景中,正向代理代理客戶端的請求去訪問目標服務器,目標服務器是一個反向單利服務器,反向代理了多臺真實的業務處理服務器。具體的拓撲圖如下:


反向代理配置:

 1server {
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. 負載均衡

我們已經明確了所謂代理服務器的概念,那么接下來,Nginx扮演了反向代理服務器的角色,它是以依據什么樣的規則進行請求分發的呢?不用的項目應用場景,分發的規則是否可以控制呢?

這里提到的客戶端發送的、Nginx反向代理服務器接收到的請求數量,就是我們說的負載量。

請求數量按照一定的規則進行分發到不同的服務器處理的規則,就是一種均衡規則。

所以~將服務器接收到的請求按照規則分發的過程,稱為負載均衡。

負載均衡在實際項目操作過程中,有硬件負載均衡和軟件負載均衡兩種,硬件負載均衡也稱為硬負載,如F5負載均衡,相對造價昂貴成本較高,但是數據的穩定性安全性等等有非常好的保障,如中國移動中國聯通這樣的公司才會選擇硬負載進行操作;更多的公司考慮到成本原因,會選擇使用軟件負載均衡,軟件負載均衡是利用現有的技術結合主機硬件實現的一種消息隊列分發機制。


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

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

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

1upstream 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的請求固定在某一臺服務器上,其它則按時間順序把請求分配給三臺服務器處理。

1upstream 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固定轉發到同一個后端服務器處理。

1upstream 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:按后端服務器的響應時間來分配請求,響應時間短的優先分配。

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

1upstream 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只用作備份機。

1upstream serverList {
2    server 1.2.3.4 fail_timeout=60s;
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

 1upstream 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
7server {
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 : 靜態網站訪問的域名地址。

1server {
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//一鍵安裝上面四個依賴
2yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
  1. 安裝nginx:

1yum install nginx
  1. 檢查是否安裝成功:

1nginx -v
  1. 啟動/挺尸nginx:

1/etc/init.d/nginx start
2/etc/init.d/nginx stop
  1. 編輯配置文件:

1/etc/nginx/nginx.conf 

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


以上是文章的全部內容,有需要交流與學習的,可以加小妹為好友,一起學習與交流,有技術上的問題也可以咨詢,只要我懂!我們一起加油



4399小游戏上海麻将连连看 帮忙投注赚佣金是真是假 重庆时时大师讲座 江苏快app下载专区 时时彩平台 王中王救世?7799811 贵州快3开奖查询全部 新时时个数跨杀 广东快乐十分漏洞诈骗 北京赛车开奖 极速时时直播