以下這段設(shè)置是通過(guò)location指令來(lái)對(duì)網(wǎng)頁(yè)URL進(jìn)行分析處理," />
時(shí)間:2023-07-14 12:45:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-07-14 12:45:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
Nginx---代理、虛擬主機(jī)以及負(fù)載均衡的配置:location主要用于對(duì)URL進(jìn)行匹配。 location支持正則表達(dá)式匹配,也支持條件判斷匹配。
以下這段設(shè)置是通過(guò)location指令來(lái)對(duì)網(wǎng)頁(yè)URL進(jìn)行分析處理,所有擴(kuò)展名以.gif、.jpg、.jpeg、.png、.bmp、.swf結(jié)尾的靜態(tài)文件都交給nginx處理。
location ~ .*/.(gif|jpg|jpeg|png|bmp|swf)$ { root /data/wwwroot/www.ixdba.net; }
以下這段設(shè)置是將upload和html下的所有文件都交給nginx來(lái)處理,需要注意的是,upload和html目錄是在/data/wwwroot/http://www.ixdba.net目錄下的一個(gè)子目錄。
location ~ ^/(upload|html)/ { root /data/wwwroot/www.ixdba.net; }
在下面這段設(shè)置中,location是對(duì)此虛擬主機(jī)下動(dòng)態(tài)網(wǎng)頁(yè)的過(guò)濾處理,也就是將所有以.jsp為后綴的文件都交給本機(jī)的8080端口處理。
location ~ .*.jsp$ { index index.jsp; proxy_pass http://localhost:8080;}
location支持各種匹配規(guī)則,在多個(gè)匹配規(guī)則下,Nginx對(duì)location的處理是有優(yōu)先級(jí)的,優(yōu)先級(jí)高的規(guī)則會(huì)優(yōu)先進(jìn)行處理,而優(yōu)先級(jí)低的規(guī)則可能會(huì)最后處理或者不進(jìn)行處理,下面列出location多個(gè)匹配規(guī)則下,每個(gè)規(guī)則的處理優(yōu)先級(jí)順序。
location = / { [ config A ]}location ^~ /images/ { [ config B ]}location ~* /.(gif|jpg|png|swf)$ { [ config C ]} location /abc/def { [ config D ]}location /abc { [ config E ]}location / { [ config F ]}
反向代理(Reverse Proxy)方式是指通過(guò)代理服務(wù)器來(lái)接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并且將從內(nèi)部網(wǎng)絡(luò)服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)服務(wù)器。當(dāng)一個(gè)代理服務(wù)器能夠代理外部網(wǎng)絡(luò)上的訪問(wèn)請(qǐng)求來(lái)訪問(wèn)內(nèi)部網(wǎng)絡(luò)時(shí),這種代理服務(wù)的方式稱為反向代理服務(wù)。
客戶端無(wú)法直接訪問(wèn)外部的web,需要在客戶端所在的網(wǎng)絡(luò)內(nèi)架設(shè)一臺(tái)代理服務(wù)器,客戶端通過(guò)代理服務(wù)器訪問(wèn)外部的web(需要在客戶端的瀏覽器中設(shè)置代理服務(wù)器),這就是正向代理。
正向代理適用于:
①局域網(wǎng)的代理服務(wù)器
②訪問(wèn)某個(gè)受限網(wǎng)絡(luò)的代理服務(wù)器,如教育網(wǎng)訪問(wèn)某些國(guó)外網(wǎng)站需要找代理
server { listen 80; server_name www.a.com; location / { proxy_pass http://172.16.213.18; }}
實(shí)現(xiàn)反向代理功能的是一個(gè)叫做proxy_pass的模塊,這個(gè)反向代理實(shí)現(xiàn)的功能是:當(dāng)訪問(wèn)http://www.a.com的時(shí)候,所有訪問(wèn)請(qǐng)求都會(huì)轉(zhuǎn)發(fā)到后端172.16.213.18這個(gè)服務(wù)器的80端口上。server { listen 80; server_name www.b.com; location / { 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_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_pass http://172.16.213.77:5601; }}
這個(gè)反向代理實(shí)現(xiàn)的功能是:當(dāng)訪問(wèn)http://www.b.com的時(shí)候,所有訪問(wèn)請(qǐng)求都會(huì)轉(zhuǎn)發(fā)到后端172.16.213.77這個(gè)服務(wù)器的5601端口上。與上面那個(gè)反向代理實(shí)例相比,此反向代理配置增加了一些反向代理屬性,這些屬性一般用于生產(chǎn)環(huán)境下對(duì)代理性能要求很高的環(huán)境中。server { server_name www.abc.com; location /uri/ { proxy_pass http://192.168.99.100:8000; }}
nginx的proxy_pass對(duì)于此種情況的處理方式是:將location中的uri傳遞給后端服務(wù)器,也就是當(dāng)客戶端訪問(wèn)http://www.abc.com/uri/iivey.html 時(shí),會(huì)被反向代理到http://192.168.99.100:8000/uri/iivey.html 進(jìn)行訪問(wèn)。server { server_name www.abc.com; location /uri/ { proxy_pass http://192.168.99.100:8000/new_uri/; } }
nginx的proxy_pass對(duì)于此種情況的處理方式是:替換成proxy_pass指令中URL中含有的uri,也就是當(dāng)客戶端訪問(wèn)http://www.abc.com/uri/iivey.html 時(shí),會(huì)被反向代理到http://192.168.99.100:8000/new_uri/iivey.html 進(jìn)行訪問(wèn)。server { server_name www.abc.com; location /uri/ { proxy_pass http://192.168.99.100:8000/; } }
nginx的proxy_pass對(duì)于此種情況的處理方式是:替換成proxy_pass指令中URL中含有的uri,也就是當(dāng)客戶端訪問(wèn)http://www.abc.com/uri/iivey.html 時(shí),會(huì)被反向代理到http://192.168.99.100:8000/iivey.html 進(jìn)行訪問(wèn)。常見(jiàn)的內(nèi)置變量有如下幾種:? $args,此變量與請(qǐng)求行中的參數(shù)相等? $document_root,此變量等同于當(dāng)前請(qǐng)求的root指令指定的值? $uri,表示不帶請(qǐng)求參數(shù)的當(dāng)前URL,$uri不包含主機(jī)名。? $document_uri,此變量與$uri含義一樣。? $host,此變量與請(qǐng)求頭部中“Host”行指定的值一致。? $limit_rate,此變量用來(lái)設(shè)置限制連接的速率。? $request_method,此變量等同于request的method,通常是“GET”或“POST”。? $remote_addr,此變量表示客戶端IP地址。? $remote_port,此變量表示客戶端端口。? $remote_user,此變量等同于用戶名,由ngx_http_auth_basic_module認(rèn)證。? $request_filename,此變量表示當(dāng)前請(qǐng)求的文件的路徑名,由root或alias和URI request組合而成。? $request_uri,此變量表示含有參數(shù)的完整的初始URI。? $query_string,此變量與$args含義一致。? $server_addr #表示請(qǐng)求的服務(wù)器地址。? $server_name,此變量表示請(qǐng)求到達(dá)的服務(wù)器名。默認(rèn)是localhost? $server_port,此變量表示請(qǐng)求到達(dá)的服務(wù)器的端口號(hào)。? $request_uri #包含請(qǐng)求參數(shù)的原始URI,不包含主機(jī)名,由客戶端請(qǐng)求決定,不能修改。
以http://188.19.236.18:8000/abc?test=123&test2=abc 為例子:其中:? $args:test=123&test2=abc? $uri: /abc? $server_addr:188.19.236.18 $server_port:8000 $request_filename:abc? $request_uri:/abc?test=123&test2=abc例2:http://172.16.213.199:88/test1/test2/test.php ,假定虛擬主機(jī)根目錄為/var/www/html其中: $host:172.16.213.199 $server_port:88 $request_uri: /test1/test2/test.php $document_uri:/test1/test2/test.php $document_root:/var/www/html $request_filename:/var/www/html/test1/test2/test.php
f指令用于判斷一個(gè)條件,如果條件成立,則后面的大括號(hào)內(nèi)的語(yǔ)句將執(zhí)行,相關(guān)配置從上級(jí)繼承。if指令的使用方法如下:
語(yǔ)法:if (condition) { … }
默認(rèn)值:none
使用字段:server, location
在默認(rèn)情況下,if指令默認(rèn)值為空,可在nginx配置文件的server、location部分使用,另外,if指令可以在判斷語(yǔ)句中指定正則表達(dá)式或通過(guò)nginx內(nèi)置變量匹配條件等,相關(guān)匹配條件如下:
正則表達(dá)式匹配規(guī)則:? ~ 表示區(qū)分大小寫(xiě)匹配 ? ~* 表示不區(qū)分大小寫(xiě)匹配 ? !~和!~*分別表示區(qū)分大小寫(xiě)不匹配及不區(qū)分大小寫(xiě)不匹配文件及目錄匹配:? -f和!-f用來(lái)判斷是否存在文件 ? -d和!-d用來(lái)判斷是否存在目錄 ? -e和!-e用來(lái)判斷是否存在文件或目錄 ? -x和!-x用來(lái)判斷文件是否可執(zhí)行
Nginx通過(guò)ngx_http_rewrite_module模塊支持url重寫(xiě)、支持if條件判斷,但要使用rewrite功能,需要PCRE支持,應(yīng)在編譯nginx時(shí)指定PCRE源碼目錄。rewrite的使用語(yǔ)法如下:
語(yǔ)法:rewrite regex flag
默認(rèn)值:none
使用字段:server, location, if
rewrite指令的最后一項(xiàng)參數(shù)為flag標(biāo)記,其支持的flag標(biāo)記主要有以下幾種:? last, 相當(dāng)于Apache里的[L]標(biāo)記,表示完成rewrite之后搜索相應(yīng)的URI或location。? break,表示終止匹配, 不再匹配后面的規(guī)則。? redirect,將返回302臨時(shí)重定向,在瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址。? permanent,將返回301永久重定向,在瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址。 其中,last和break用來(lái)實(shí)現(xiàn)URL重寫(xiě),瀏覽器地址欄中的URL地址不變。
location ~ ^/new/ { rewrite ^/new/(.*)$ /old/$1 break; proxy_pass http://www.tb.com; }
在這個(gè)例子中,假定訪問(wèn)的域名是www.newtb.com,那么當(dāng)訪問(wèn)http://www.newtb.com/new/web.html時(shí),nginx可以通過(guò)rewrite將頁(yè)面重定向到http://www.tb.com/old/web.html,由于是通過(guò)反向代理實(shí)現(xiàn)了重定向,因此頁(yè)面重寫(xiě)后不會(huì)引起瀏覽器地址欄中URL的變化。這個(gè)功能在新舊網(wǎng)站交替的時(shí)候非常有用。
通過(guò)set指令可以設(shè)置一個(gè)變量并為其賦值,其值可以是文本、變量或它們的組合。也可以使用set定義一個(gè)新的變量,但是不能使用set設(shè)置$http_xxx頭部變量的值。
set使用語(yǔ)法如下:
語(yǔ)法:set variable value
默認(rèn)值:none
使用字段:server, location, if
location / { if ($query_string ~ "id=(.*)") { set $myid $1; rewrite ^/app.php$ /m-$myid.html?; }}
這是一個(gè)偽靜態(tài)的例子,假如訪問(wèn)的域名是http://www.abc.com,那么上面這個(gè)配置要實(shí)現(xiàn)的功能是將請(qǐng)求為http://www.abc.com/app.php?id=100重定向到http://www.abc.com/m-100.html。
這里用到了if指令和set指令,并且還使用了$query_string變量,此變量用于獲取請(qǐng)求行中的參數(shù),if指令用來(lái)判斷請(qǐng)求參數(shù)中的id值,然后通過(guò)set指令定義了一個(gè)變量$myid,并將$query_string變量中獲取到的id值賦給$myid,最后通過(guò)rewrite指令進(jìn)行了url重寫(xiě)。
這里需要注意的是:rewrite只能針對(duì)請(qǐng)求的uri進(jìn)行重寫(xiě),而對(duì)請(qǐng)求參數(shù)無(wú)能為力,/app.php問(wèn)號(hào)后面的“id=100”是請(qǐng)求參數(shù),要獲取到參數(shù),需要使用nginx的一個(gè)內(nèi)部變量$query_string,這樣在重寫(xiě)的時(shí)候只需把$query_string變量追加到重寫(xiě)的uri后面即可,另外,為了防止url中的參數(shù)追加到重寫(xiě)后的uri上,需要在rewrite最后面加個(gè)問(wèn)號(hào)。
break的用法在前面的介紹中其實(shí)已經(jīng)出現(xiàn)過(guò),它表示完成當(dāng)前設(shè)置的規(guī)則后,不再匹配后面的重寫(xiě)規(guī)則。break使用語(yǔ)法如下:
語(yǔ)法:break
默認(rèn)值:none
使用字段:server, location, if
server { listen 80; server_name www.tb.cn; if ($host != 'www.tb.cn') { rewrite ^/(.*)$ http://www.tb.cn/error.txt break; rewrite ^/(.*)$ http://www.tb.cn/$1 permanent; }}
在這個(gè)例子中,定義了一個(gè)域名http://www.tb.cn,當(dāng)訪問(wèn)的域名不是http://www.tb.cn時(shí),會(huì)將請(qǐng)求重定向到“http://www.tb.cn/error.txt” 頁(yè)面, 由于設(shè)置了break指令,因此下面的rewrite規(guī)則不再被執(zhí)行,直接退出。而當(dāng)訪問(wèn)的域名是http://www.tb.cn時(shí),將直接執(zhí)行最后一個(gè)rewrite指令。
這里需要重點(diǎn)掌握一下break的功能,它表示完成當(dāng)前設(shè)置的規(guī)則后,不再匹配后面的重寫(xiě)規(guī)則,也就是當(dāng)滿足if指令后,直接退出,而不會(huì)去執(zhí)行最后一個(gè)rewrite指令的規(guī)則。
http { server { listen 80; server_name www.domain1.com; access_log logs/domain1.access.log main; location / { index index.html; root /data/www/domain1.com; } } server { listen 80; server_name www.domain2.com; access_log logs/domain2.access.log main; location / { index index.html; root /data/www/domain2.com; } } include /usr/local/nginx/conf/vhosts/www.domain3.conf;}
Nginx的負(fù)載均衡模塊目前支持4種調(diào)度算法,下面分別進(jìn)行介紹,其中后兩項(xiàng)屬于第三方的調(diào)度方法。
輪詢(默認(rèn)),每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端某臺(tái)服務(wù)器死機(jī),故障系統(tǒng)被自動(dòng)剔除,使用戶訪問(wèn)不受影響。
Weight,指定輪詢權(quán)值,Weight值越大,分配到的訪問(wèn)機(jī)率越高,主要用于后端每個(gè)服務(wù)器性能不均的情況下。
ip_hash,每個(gè)請(qǐng)求按訪問(wèn)IP的hash結(jié)果分配,這樣來(lái)自同一個(gè)IP的訪客固定訪問(wèn)一個(gè)后端服務(wù)器,有效解決了動(dòng)態(tài)網(wǎng)頁(yè)存在的session共享問(wèn)題。
fair,比上面兩個(gè)更加智能的負(fù)載均衡算法。此種算法可以依據(jù)頁(yè)面大小和加載時(shí)間長(zhǎng)短智能地進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。Nginx本身是不支持fair的,如果需要使用這種調(diào)度算法,必須下載Nginx的upstream_fair模塊。
url_hash,按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,可以進(jìn)一步提高后端緩存服務(wù)器的效率。Nginx本身是不支持url_hash的,如果需要使用這種調(diào)度算法,必須安裝Nginx 的hash軟件包。
在HTTP Upstream模塊中,可以通過(guò)server指令指定后端服務(wù)器的IP地址和端口,同時(shí)還可以設(shè)定每個(gè)后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)。常用的狀態(tài)有:
down,表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡。
backup,預(yù)留的備份機(jī)器。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時(shí)候,才會(huì)請(qǐng)求backup機(jī)器,因此這臺(tái)機(jī)器的壓力最輕。
max_fails,允許請(qǐng)求失敗的次數(shù),默認(rèn)為1。當(dāng)超過(guò)最大次數(shù)時(shí),返回proxy_next_upstream 模塊定義的錯(cuò)誤。
fail_timeout,在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時(shí)間。max_fails可以和fail_timeout一起使用。
注意 當(dāng)負(fù)載調(diào)度算法為ip_hash時(shí),后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)不能是weight和backup。
http { upstream myserver { server 192.168.12.181:80 weight=3 max_fails=3 fail_timeout=20s; server 192.168.12.182:80 weight=1 max_fails=3 fail_timeout=20s; server 192.168.12.183:80 weight=4 max_fails=3 fail_timeout=20s; } server { listen 80; server_name www.domain.com 192.168.12.189; index index.htm index.html; root /data/web/wwwroot; location / { proxy_pass http://myserver; proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; include /usr/local/nginx/conf/proxy.conf; } }}
關(guān)鍵詞:負(fù)載,均衡,配置,代理,虛擬,主機(jī)
客戶&案例
營(yíng)銷資訊
關(guān)于我們
客戶&案例
營(yíng)銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。