本文旨在用最通俗的語言講述最枯燥的基本知識
nginx作為一個高效能的web伺服器,想必大家垂涎已久,蠢蠢欲動,想學習一番了吧,語法不多說,網上一大堆。下面博主就nginx的非常常用的幾個功能做一些講述和分析,學會了這幾個功能,平常的開發和部署就不是什麼問題了。因此希望大家看完之後,能自己裝個nginx來學習配置測試,這樣才能真正的掌握它。前方高能,文末有福利。
文章提綱:
- 正向代理
- 反向代理
- 透明代理
- 負載均衡
- 靜態伺服器
- nginx的安裝
- 一點點小福利
正向代理
正向代理:內網伺服器主動去請求外網的服務的一種行為
光看概念,可能有讀者還是搞不明白:什麼叫做“正向”,什麼叫做“代理”,我們分別來理解一下這兩個名詞。
正向:相同的或一致的方向
代理:自己做不了的事情或者自己不打算做的事情,委託或依靠別人來完成。
藉助解釋,迴歸到nginx的概念,正向代理其實就是說客戶端無法主動或者不打算完成主動去向某伺服器發起請求,而是委託了nginx代理伺服器去向伺服器發起請求,並且獲得處理結果,返回給客戶端。
從下圖可以看出:客戶端向目標伺服器發起的請求,是由代理伺服器代替它向目標主機發起,得到結果之後,通過代理伺服器返回給客戶端。
舉個例子:廣大社會主義接班人都知道,為了保護祖國的花朵不受外界的烏煙瘴氣薰陶,國家對網路做了一些“優化”,正常情況下是不能外網的,但作為程式設計師的我們如果沒有谷歌等搜尋引擎的幫助,再銷魂的程式碼也會因此失色,因此,網路上也曾出現過一些fan qiang技術和軟體供有需要的人使用,如某VPN等,其實VPN的原理大體上也類似於一個正向代理,也就是需要訪問外網的電腦,發起一個訪問外網的請求,通過本機上的VPN去尋找一個可以訪問國外網站的代理伺服器,代理伺服器向外國網站發起請求,然後把結果返回給本機。
正向代理的配置:
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/
複製程式碼
正向代理的關鍵配置:
- resolver:DNS伺服器IP地址
- listen:主動發起請求的內網伺服器埠
- proxy_pass:代理伺服器的協議和地址
反向代理
反向代理: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伺服器接受,然後根據配置轉發給不同的伺服器處理。具體流程如下圖所示:
反向代理配置:
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專案對應的網站了,而不需要帶上難看的埠號。
反向代理的配置關鍵點是:
- server_name:代表客戶端向伺服器發起請求時輸入的域名
- proxy_pass:代表源伺服器的訪問地址,也就是真正處理請求的伺服器(localhost+埠號)。
3. 透明代理
透明代理:也叫做簡單代理,意思客戶端向服務端發起請求時,請求會先到達透明代理伺服器,代理伺服器再把請求轉交給真實的源伺服器處理,也就是是客戶端根本不知道有代理伺服器的存在。
舉個例子:它的用法有點類似於攔截器,如某些制度嚴格的公司裡的辦公電腦,無論我們用電腦做了什麼事情,安全部門都能攔截我們對外傳送的任何東西,這是因為電腦在對外傳送時,實際上先經過網路上的一個透明的伺服器,經過它的處理之後,才接著往外網走,而我們在網上衝浪時,根本沒有感知到有攔截器攔截我們的資料和資訊。
有人說透明代理和反向代理有點像,都是由代理伺服器先接受請求,再轉發到源伺服器。其實本質上是有區別的,透明代理是客戶端感知不到代理伺服器的存在,而反向代理是客戶端感知只有一個代理伺服器的存在,因此他們一個是隱藏了自己,一個是隱藏了源伺服器。事實上,透明代理和正向代理才是相像的,都是由客戶端主動發起請求,代理伺服器處理;他們差異點在於:正向代理是代理伺服器代替客戶端請求,而透明代理是客戶端在發起請求時,會先經過透明代理伺服器,再達到服務端,在這過程中,客戶端是感知不到這個代理伺服器的。
4. 負載均衡
負載均衡:將伺服器接收到的請求按照規則分發的過程,稱為負載均衡。負載均衡是反向代理的一種體現。
可能絕大部分人接觸到的web專案,剛開始時都是一臺伺服器就搞定了,但當網站訪問量越來越大時,單臺伺服器就扛不住了,這時候需要增加伺服器做成叢集來分擔流量壓力,而在架設這些伺服器時,nginx就充當了接受流量和分流的作用了,當請求到nginx伺服器時,nginx就可以根據設定好的負載資訊,把請求分配到不同的伺服器,伺服器處理完畢後,nginx獲取處理結果返回給客戶端,這樣,用nginx的反向代理,即可實現了負載均衡。
nginx實現負載均衡有幾種模式:
- 輪詢:每個請求按時間順序逐一分配到不同的後端伺服器,也是nginx的預設模式。輪詢模式的配置很簡單,只需要把伺服器列表加入到upstream模組中即可。
下面的配置是指:負載中有三臺伺服器,當請求到達時,nginx按照時間順序把請求分配給三臺伺服器處理。
1upstream serverList {
2 server 1.2.3.4;
3 server 1.2.3.5;
4 server 1.2.3.6;
5}
複製程式碼
- 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}
複製程式碼
- 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}
複製程式碼
- fair:按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
1upstream serverList {
2 server 1.2.3.4;
3 server 1.2.3.5;
4 server 1.2.3.6;
5 fair;
6}
複製程式碼
而在每一種模式中,每一臺伺服器後面的可以攜帶的引數有:
- down: 當前伺服器暫不參與負載
- weight: 權重,值越大,伺服器的負載量越大。
- max_fails:允許請求失敗的次數,預設為1。
- fail_timeout:max_fails次失敗後暫停的時間。
- 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}
複製程式碼
下面是一個配置負載均衡的示例(只寫了關鍵配置):
其中:
- upstream serverList是負載的配置模組
- server_name是客戶端請求的域名地址
- proxy_pass是指向負載的列表的模組
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來作為靜態伺服器。
靜態伺服器的配置如下,其中關鍵配置為:
- root:直接靜態專案的絕對路徑的根目錄。
- 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 }
複製程式碼
- nginx的安裝
學了這麼多nginx的配置用法之後,我們需要對每一個知識點做一下測試,才能印象深刻,在此之前,我們需要知道nginx是怎麼安裝,下面以Linux環境為例,簡述yum方式安裝nginx的步驟:
- 安裝依賴:
1//一鍵安裝上面四個依賴
2yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
複製程式碼
- 安裝nginx:
1yum install nginx
複製程式碼
- 檢查是否安裝成功:
1nginx -v
複製程式碼
- 啟動/停止nginx:
1/etc/init.d/nginx start
2/etc/init.d/nginx stop
複製程式碼
- 編輯配置檔案:
1/etc/nginx/nginx.conf
複製程式碼
這些步驟都完成之後,我們就可以進入nginx的配置檔案nginx.conf對上面的各個知識點,進行配置和測試了。
- 一點點小福利:
有的人說看到這裡好像都懂了,但是沒Linux可以測試呀,其實nginx也有Windows版本,當然Windows版本在實際專案中用的並不多,因為web專案的伺服器都是Linux,因此你可以在自己的電腦上裝個虛擬機器,然後裝個Linux來玩耍,不過如果如果你想要學以致用,並且更接近公司專案的生產環境的配備的話,作者建議你還是自己買一臺雲伺服器來學習,剛好阿里雲有雙十一活動,一臺伺服器只需要90元一年,這是明顯的擼羊毛活動啊,你忍心放棄嗎?
你花在裝虛擬機器和Linux系統上的時間都不止90塊錢了!
你有沒有想過有朝一日親手上傳自己的程式碼到伺服器呢?
你有沒有憧憬擁有自己搭建和維護的個人部落格呢?
你試過從專案釋出上線到域名解析訪問整個流程嗎?
….
如果都沒有,建議你買一臺吧:
也可以掃描二維碼直接購買:
————劃重點—————-
注意了!!!
點連結註冊購買之後,阿里雲會有返現給博主,為了感謝各位大大的厚愛,博主決定把所有返現歸還給各位大大,因此凡是新使用者註冊購買的,請加博主V(sisi-ceo)聯絡博主,博主核實後把返現以紅包的形式給你您,讓你最低的價格買到伺服器,能學到更多的東西!!!
(老使用者以及點別的連結註冊購買的大大,博主是收不到返現的哦,所以這部分博主無能為力的啦~~~)
覺得本文對你有幫助?請分享給更多人
關注「程式設計無界」,提升裝逼技能