2021-02-22 分類: 網(wǎng)站建設(shè)
nginx作為一個(gè)高性能的web服務(wù)器,想必大家垂涎已久,蠢蠢欲動(dòng),想學(xué)習(xí)一番了吧,語(yǔ)法不多說(shuō),網(wǎng)上一大堆。下面博主就nginx的非常常用的幾個(gè)功能做一些講述和分析,學(xué)會(huì)了這幾個(gè)功能,平常的開發(fā)和部署就不是什么問(wèn)題了。因此希望大家看完之后,能自己裝個(gè)nginx來(lái)學(xué)習(xí)配置測(cè)試,這樣才能真正的掌握它。
文章提綱:
1. 正向代理
正向代理:內(nèi)網(wǎng)服務(wù)器主動(dòng)去請(qǐng)求外網(wǎng)的服務(wù)的一種行為
光看概念,可能有讀者還是搞不明白:什么叫做“正向”,什么叫做“代理”,我們分別來(lái)理解一下這兩個(gè)名詞。
正向:相同的或一致的方向
代理:自己做不了的事情或者自己不打算做的事情,委托或依靠別人來(lái)完成。
借助解釋,回歸到nginx的概念,正向代理其實(shí)就是說(shuō)客戶端無(wú)法主動(dòng)或者不打算完成主動(dòng)去向某服務(wù)器發(fā)起請(qǐng)求,而是委托了nginx代理服務(wù)器去向服務(wù)器發(fā)起請(qǐng)求,并且獲得處理結(jié)果,返回給客戶端。
從下圖可以看出:客戶端向目標(biāo)服務(wù)器發(fā)起的請(qǐng)求,是由代理服務(wù)器代替它向目標(biāo)主機(jī)發(fā)起,得到結(jié)果之后,通過(guò)代理服務(wù)器返回給客戶端。
舉個(gè)栗子:廣大社會(huì)主義接班人都知道,為了保護(hù)祖國(guó)的花朵不受外界的烏煙瘴氣熏陶,國(guó)家對(duì)網(wǎng)絡(luò)做了一些“優(yōu)化”,正常情況下是不能外網(wǎng)的,但作為程序員的我們?nèi)绻麤](méi)有谷歌等搜索引擎的幫助,再銷魂的代碼也會(huì)因此失色,因此,網(wǎng)絡(luò)上也曾出現(xiàn)過(guò)一些fan qiang技術(shù)和軟件供有需要的人使用,如某VPN等,其實(shí)VPN的原理大體上也類似于一個(gè)正向代理,也就是需要訪問(wèn)外網(wǎng)的電腦,發(fā)起一個(gè)訪問(wèn)外網(wǎng)的請(qǐng)求,通過(guò)本機(jī)上的VPN去尋找一個(gè)可以訪問(wèn)國(guó)外網(wǎng)站的代理服務(wù)器,代理服務(wù)器向外國(guó)網(wǎng)站發(fā)起請(qǐng)求,然后把結(jié)果返回給本機(jī)。
正向代理的配置:
- server {
- #指定DNS服務(wù)器IP地址
- resolver 114.114.114.114;
- #指定代理端口
- listen 8080;
- location / {
- #設(shè)定代理服務(wù)器的協(xié)議和地址(固定不變)
- proxy_pass http://$http_host$request_uri;
- }
- }
這樣就可以做到內(nèi)網(wǎng)中端口為8080的服務(wù)器主動(dòng)請(qǐng)求到1.2.13.4的主機(jī)上,如在Linux下可以:
- curl --proxy proxy_server:8080 http://www.taobao.com/
正向代理的關(guān)鍵配置:
2. 反向代理
反向代理:reverse proxy,是指用代理服務(wù)器來(lái)接受客戶端發(fā)來(lái)的請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)中的上游服務(wù)器,上游服務(wù)器處理完之后,把結(jié)果通過(guò)nginx返回給客戶端。
上面講述了正向代理的原理,相信對(duì)于反向代理,就很好理解了吧。
反向代理是對(duì)于來(lái)自外界的請(qǐng)求,先通過(guò)nginx統(tǒng)一接受,然后按需轉(zhuǎn)發(fā)給內(nèi)網(wǎng)中的服務(wù)器,并且把處理請(qǐng)求返回給外界客戶端,此時(shí)代理服務(wù)器對(duì)外表現(xiàn)的就是一個(gè)web服務(wù)器,客戶端根本不知道“上游服務(wù)器”的存在。
舉個(gè)栗子:一個(gè)服務(wù)器的80端口只有一個(gè),而服務(wù)器中可能有多個(gè)項(xiàng)目,如果A項(xiàng)目是端口是8081,B項(xiàng)目是8082,C項(xiàng)目是8083,假設(shè)指向該服務(wù)器的域名為www.xxx.com,此時(shí)訪問(wèn)B項(xiàng)目是www.xxx.com:8082,以此類推其它項(xiàng)目的URL也是要加上一個(gè)端口號(hào),這樣就很不美觀了,這時(shí)我們把80端口給nginx服務(wù)器,給每個(gè)項(xiàng)目分配一個(gè)獨(dú)立的子域名,如A項(xiàng)目是a.xxx.com,并且在nginx中設(shè)置每個(gè)項(xiàng)目的轉(zhuǎn)發(fā)配置,然后對(duì)所有項(xiàng)目的訪問(wèn)都由nginx服務(wù)器接受,然后根據(jù)配置轉(zhuǎn)發(fā)給不同的服務(wù)器處理。具體流程如下圖所示:
反向代理配置:
- server {
- #監(jiān)聽端口
- listen 80;
- #服務(wù)器名稱,也就是客戶端訪問(wèn)的域名地址
- server_name a.xxx.com;
- #nginx日志輸出文件
- access_log logs/nginx.access.log main;
- #nginx錯(cuò)誤日志輸出文件
- error_log logs/nginx.error.log;
- root html;
- index index.html index.htm index.php;
- location / {
- #被代理服務(wù)器的地址
- proxy_pass http://localhost:8081;
- #對(duì)發(fā)送給客戶端的URL進(jìn)行修改的操作
- 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;
- }
- }
這樣就可以通過(guò)a.xxx.com來(lái)訪問(wèn)a項(xiàng)目對(duì)應(yīng)的網(wǎng)站了,而不需要帶上難看的端口號(hào)。
反向代理的配置關(guān)鍵點(diǎn)是:
server_name:代表客戶端向服務(wù)器發(fā)起請(qǐng)求時(shí)輸入的域名
proxy_pass:代表源服務(wù)器的訪問(wèn)地址,也就是真正處理請(qǐng)求的服務(wù)器(localhost+端口號(hào))。
3. 透明代理
透明代理:也叫做簡(jiǎn)單代理,意思客戶端向服務(wù)端發(fā)起請(qǐng)求時(shí),請(qǐng)求會(huì)先到達(dá)透明代理服務(wù)器,代理服務(wù)器再把請(qǐng)求轉(zhuǎn)交給真實(shí)的源服務(wù)器處理,也就是是客戶端根本不知道有代理服務(wù)器的存在。
舉個(gè)栗子:它的用法有點(diǎn)類似于攔截器,如某些制度嚴(yán)格的公司里的辦公電腦,無(wú)論我們用電腦做了什么事情,安全部門都能攔截我們對(duì)外發(fā)送的任何東西,這是因?yàn)殡娔X在對(duì)外發(fā)送時(shí),實(shí)際上先經(jīng)過(guò)網(wǎng)絡(luò)上的一個(gè)透明的服務(wù)器,經(jīng)過(guò)它的處理之后,才接著往外網(wǎng)走,而我們?cè)诰W(wǎng)上沖浪時(shí),根本沒(méi)有感知到有攔截器攔截我們的數(shù)據(jù)和信息。
有人說(shuō)透明代理和反向代理有點(diǎn)像,都是由代理服務(wù)器先接受請(qǐng)求,再轉(zhuǎn)發(fā)到源服務(wù)器。其實(shí)本質(zhì)上是有區(qū)別的,透明代理是客戶端感知不到代理服務(wù)器的存在,而反向代理是客戶端感知只有一個(gè)代理服務(wù)器的存在,因此他們一個(gè)是隱藏了自己,一個(gè)是隱藏了源服務(wù)器。事實(shí)上,透明代理和正向代理才是相像的,都是由客戶端主動(dòng)發(fā)起請(qǐng)求,代理服務(wù)器處理;他們差異點(diǎn)在于:正向代理是代理服務(wù)器代替客戶端請(qǐng)求,而透明代理是客戶端在發(fā)起請(qǐng)求時(shí),會(huì)先經(jīng)過(guò)透明代理服務(wù)器,再達(dá)到服務(wù)端,在這過(guò)程中,客戶端是感知不到這個(gè)代理服務(wù)器的。
4. 負(fù)載均衡
負(fù)載均衡:將服務(wù)器接收到的請(qǐng)求按照規(guī)則分發(fā)的過(guò)程,稱為負(fù)載均衡。負(fù)載均衡是反向代理的一種體現(xiàn)。
可能絕大部分人接觸到的web項(xiàng)目,剛開始時(shí)都是一臺(tái)服務(wù)器就搞定了,但當(dāng)網(wǎng)站訪問(wèn)量越來(lái)越大時(shí),單臺(tái)服務(wù)器就扛不住了,這時(shí)候需要增加服務(wù)器做成集群來(lái)分擔(dān)流量壓力,而在架設(shè)這些服務(wù)器時(shí),nginx就充當(dāng)了接受流量和分流的作用了,當(dāng)請(qǐng)求到nginx服務(wù)器時(shí),nginx就可以根據(jù)設(shè)置好的負(fù)載信息,把請(qǐng)求分配到不同的服務(wù)器,服務(wù)器處理完畢后,nginx獲取處理結(jié)果返回給客戶端,這樣,用nginx的反向代理,即可實(shí)現(xiàn)了負(fù)載均衡。
nginx實(shí)現(xiàn)負(fù)載均衡有幾種模式:
下面的配置是指:負(fù)載中有三臺(tái)服務(wù)器,當(dāng)請(qǐng)求到達(dá)時(shí),nginx按照時(shí)間順序把請(qǐng)求分配給三臺(tái)服務(wù)器處理。
- upstream serverList {
- server 1.2.3.4;
- server 1.2.3.5;
- server 1.2.3.6;
- }
下面的配置是指:負(fù)載中有三臺(tái)服務(wù)器,當(dāng)請(qǐng)求到達(dá)時(shí),nginx優(yōu)先按照ip_hash的結(jié)果進(jìn)行分配,也就是同一個(gè)IP的請(qǐng)求固定在某一臺(tái)服務(wù)器上,其它則按時(shí)間順序把請(qǐng)求分配給三臺(tái)服務(wù)器處理。
- upstream serverList {
- ip_hash
- server 1.2.3.4;
- server 1.2.3.5;
- server 1.2.3.6;
- }
url_hash:按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,相同的url固定轉(zhuǎn)發(fā)到同一個(gè)后端服務(wù)器處理。
- upstream serverList {
- server 1.2.3.4;
- server 1.2.3.5;
- server 1.2.3.6;
- hash $request_uri;
- hash_method crc32;
- upstream serverList {
- server 1.2.3.4;
- server 1.2.3.5;
- server 1.2.3.6;
- fair;
- }}
而在每一種模式中,每一臺(tái)服務(wù)器后面的可以攜帶的參數(shù)有:
如下面的配置是指:負(fù)載中有三臺(tái)服務(wù)器,當(dāng)請(qǐng)求到達(dá)時(shí),nginx按時(shí)間順序和權(quán)重把請(qǐng)求分配給三臺(tái)服務(wù)器處理,例如有100個(gè)請(qǐng)求,有30%是服務(wù)器4處理,有50%的請(qǐng)求是服務(wù)器5處理,有20%的請(qǐng)求是服務(wù)器6處理。
- upstream serverList {
- server 1.2.3.4 weight=30;
- server 1.2.3.5 weight=50;
- server 1.2.3.6 weight=20;
如下面的配置是指:負(fù)載中有三臺(tái)服務(wù)器,服務(wù)器4的失敗超時(shí)時(shí)間為60s,服務(wù)器5暫不參與負(fù)載,服務(wù)器6只用作備份機(jī)。
- upstream serverList {
- server 1.2.3.4 fail_timeout=60s;
- server 1.2.3.5 down;
- server 1.2.3.6 backup;
- }
下面是一個(gè)配置負(fù)載均衡的示例(只寫了關(guān)鍵配置):
其中:
- 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. 靜態(tài)服務(wù)器
現(xiàn)在很多項(xiàng)目流行前后分離,也就是前端服務(wù)器和后端服務(wù)器分離,分別部署,這樣的方式能讓前后端人員能各司其職,不需要互相依賴,而前后分離中,前端項(xiàng)目的運(yùn)行是不需要用Tomcat、Apache等服務(wù)器環(huán)境的,因此可以直接用nginx來(lái)作為靜態(tài)服務(wù)器。
靜態(tài)服務(wù)器的配置如下,其中關(guān)鍵配置為:
- server {
- listen 80;
- server_name www.xxx.com;
- client_max_body_size 1024M;
- location / {
- root /var/www/xxx_static;
- index index.html;
- }
- }
6. nginx的安裝
學(xué)了這么多nginx的配置用法之后,我們需要對(duì)每一個(gè)知識(shí)點(diǎn)做一下測(cè)試,才能印象深刻,在此之前,我們需要知道nginx是怎么安裝,下面以Linux環(huán)境為例,簡(jiǎn)述yum方式安裝nginx的步驟:
安裝依賴:
安裝nginx:
- 1yum install nginx
檢查是否安裝成功:
- nginx -v
啟動(dòng)/挺尸nginx:
- /etc/init.d/nginx start
- /etc/init.d/nginx stop
編輯配置文件:
- /etc/nginx/nginx.conf
這些步驟都完成之后,我們就可以進(jìn)入nginx的配置文件nginx.conf對(duì)上面的各個(gè)知識(shí)點(diǎn),進(jìn)行配置和測(cè)試了。
當(dāng)前文章:Nginx常用功能全揭秘
當(dāng)前URL:http://jinyejixie.com/news/102343.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站內(nèi)鏈、全網(wǎng)營(yíng)銷推廣、網(wǎng)站設(shè)計(jì)公司、建站公司、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容