作者:vbirdbest
blog.csdn.net/vbirdbest/article/details/80913319
一、HTTP服務(wù)器
Nginx本身也是一個靜態(tài)資源的服務(wù)器,當(dāng)只有靜態(tài)資源的時候,就可以使用Nginx來做服務(wù)器,如果一個網(wǎng)站只是靜態(tài)頁面的話住练,那么就可以通過這種方式來實現(xiàn)部署交洗。
1梧躺、 首先在文檔根目錄Docroot(/usr/local/var/www)下創(chuàng)建html目錄, 然后在html中放一個test.html;
2劣挫、 配置nginx.conf中的server
usermengday?staff;http{server{listen80;server_namelocalhost;client_max_body_size1024M;#?默認locationlocation/?{root/usr/local/var/www/html;indexindex.html?index.htm;????????}????}}
3册养、訪問測試
http://localhost/?指向/usr/local/var/www/index.html, index.html是安裝nginx自帶的html
http://localhost/test.html?指向/usr/local/var/www/html/test.html
注意:如果訪問圖片出現(xiàn)403 Forbidden錯誤,可能是因為nginx.conf 的第一行user配置不對压固,默認是#user nobody;是注釋的球拦,linux下改成user root; macos下改成user 用戶名 所在組; 然后重新加載配置文件或者重啟,再試一下就可以了邓夕, 用戶名可以通過who am i 命令來查看刘莹。
4、指令簡介
server : 用于定義服務(wù)焚刚,http中可以有多個server塊
listen : 指定服務(wù)器偵聽請求的IP地址和端口点弯,如果省略地址,服務(wù)器將偵聽所有地址矿咕,如果省略端口抢肛,則使用標準端口
server_name : 服務(wù)名稱,用于配置域名
location : 用于配置映射路徑uri對應(yīng)的配置碳柱,一個server中可以有多個location, location后面跟一個uri,可以是一個正則表達式, / 表示匹配任意路徑, 當(dāng)客戶端訪問的路徑滿足這個uri時就會執(zhí)行l(wèi)ocation塊里面的代碼
root : 根路徑捡絮,當(dāng)訪問http://localhost/test.html,“/test.html”會匹配到”/”uri, 找到root為/usr/local/var/www/html莲镣,用戶訪問的資源物理地址=root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.html
index : 設(shè)置首頁福稳,當(dāng)只訪問server_name時后面不跟任何路徑是不走root直接走index指令的;如果訪問路徑中沒有指定具體的文件瑞侮,則返回index設(shè)置的資源的圆,如果訪問http://localhost/html/?則默認返回index.html
5、location uri正則表達式
.?:匹配除換行符以外的任意字符
??:重復(fù)0次或1次
+?:重復(fù)1次或更多次
*?:重復(fù)0次或更多次
\d?:匹配數(shù)字
^?:匹配字符串的開始
$?:匹配字符串的結(jié)束
{n}?:重復(fù)n次
{n,}?:重復(fù)n次或更多次
[c]?:匹配單個字符c
[a-z]?:匹配a-z小寫字母的任意一個
(a|b|c)?: 屬線表示匹配任意一種情況半火,每種情況使用豎線分隔越妈,一般使用小括號括括住,匹配符合a字符 或是b字符 或是c字符的字符串
\?反斜杠:用于轉(zhuǎn)義特殊字符
小括號()之間匹配的內(nèi)容钮糖,可以在后面通過$1來引用梅掠,$2表示的是前面第二個()里的內(nèi)容。正則里面容易讓人困惑的是\轉(zhuǎn)義特殊字符店归。
二阎抒、靜態(tài)服務(wù)器
在公司中經(jīng)常會遇到靜態(tài)服務(wù)器,通常會提供一個上傳的功能娱节,其他應(yīng)用如果需要靜態(tài)資源就從該靜態(tài)服務(wù)器中獲取挠蛉。
1、在/usr/local/var/www?下分別創(chuàng)建images和img目錄肄满,分別在每個目錄下放一張test.jpg
http{server{listen80;server_namelocalhost;set$doc_root/usr/local/var/www;#?默認locationlocation/?{root/usr/local/var/www/html;indexindex.html?index.htm;????????}location?^~/images/?{root$doc_root;???????}location~*?\.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)${root$doc_root/img;???????}????}}
自定義變量使用set指令谴古,語法 set 變量名值;引用使用變量名值;引用使用變量名; 這里自定義了doc_root變量质涛。
靜態(tài)服務(wù)器location的映射一般有兩種方式:
使用路徑,如 /images/ 一般圖片都會放在某個圖片目錄下掰担,
使用后綴汇陆,如 .jpg、.png 等后綴匹配模式
訪問http://localhost/test.jpg?會映射到?$doc_root/img
訪問http://localhost/images/test.jpg?當(dāng)同一個路徑滿足多個location時带饱,優(yōu)先匹配優(yōu)先級高的location毡代,由于^~?的優(yōu)先級大于?~, 所以會走/images/對應(yīng)的location
常見的location路徑映射路徑有以下幾種:
=?進行普通字符精確匹配。也就是完全匹配勺疼。
^~?前綴匹配教寂。如果匹配成功,則不再匹配其他location执庐。
~?表示執(zhí)行一個正則匹配酪耕,區(qū)分大小寫
~*?表示執(zhí)行一個正則匹配,不區(qū)分大小寫
/xxx/?常規(guī)字符串路徑匹配
/?通用匹配轨淌,任何請求都會匹配到
location優(yōu)先級
當(dāng)一個路徑匹配多個location時究竟哪個location能匹配到時有優(yōu)先級順序的迂烁,而優(yōu)先級的順序于location值的表達式類型有關(guān),和在配置文件中的先后順序無關(guān)递鹉。相同類型的表達式盟步,字符串長的會優(yōu)先匹配。推薦:Java面試題大全
以下是按優(yōu)先級排列說明:
等號類型(=)的優(yōu)先級最高躏结。一旦匹配成功却盘,則不再查找其他匹配項,停止搜索媳拴。
^~類型表達式谷炸,不屬于正則表達式。一旦匹配成功禀挫,則不再查找其他匹配項,停止搜索拓颓。
正則表達式類型(~ ~*)的優(yōu)先級次之语婴。如果有多個location的正則能匹配的話,則使用正則表達式最長的那個驶睦。
常規(guī)字符串匹配類型砰左。按前綴匹配。
/ 通用匹配场航,如果沒有匹配到,就匹配通用的
優(yōu)先級搜索問題:不同類型的location映射決定是否繼續(xù)向下搜索
等號類型、^~類型:一旦匹配上就停止搜索了糊昙,不會再匹配其他location了
正則表達式類型(~ ~*),常規(guī)字符串匹配類型/xxx/?: 匹配到之后,還會繼續(xù)搜索其他其它location憋他,直到找到優(yōu)先級最高的,或者找到第一種情況而停止搜索
location優(yōu)先級從高到底:
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)
location?=?/?{#?精確匹配/髓削,主機名后面不能帶任何字符串?/[?configuration?A?]}location?/?{#?匹配所有以?/?開頭的請求竹挡。#?但是如果有更長的同類型的表達式,則選擇更長的表達式立膛。#?如果有正則表達式可以匹配揪罕,則優(yōu)先匹配正則表達式。[?configuration?B?]}location?/documents/?{#?匹配所有以?/documents/?開頭的請求宝泵,匹配符合以后好啰,還要繼續(xù)往下搜索。#?但是如果有更長的同類型的表達式儿奶,則選擇更長的表達式框往。#?如果有正則表達式可以匹配,則優(yōu)先匹配正則表達式廓握。[?configuration?C?]}location?^~?/images/?{#?匹配所有以?/images/?開頭的表達式搅窿,如果匹配成功,則停止匹配查找隙券,停止搜索男应。#?所以,即便有符合的正則表達式location娱仔,也不會被使用[?configuration?D?]}location?~*?\.(gif|jpg|jpeg)$?{#?匹配所有以 gif jpg jpeg結(jié)尾的請求沐飘。#?但是?以?/images/開頭的請求,將使用?Configuration?D牲迫,D具有更高的優(yōu)先級[?configuration?E?]}location?/images/?{#?字符匹配到?/images/耐朴,還會繼續(xù)往下搜索[?configuration?F?]}location?=?/test.htm?{????root???/usr/local/var/www/htm;????index??index.htm;}
注意:location的優(yōu)先級與location配置的位置無關(guān)
三、反向代理
反向代理應(yīng)該是Nginx使用最多的功能了盹憎,反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請求筛峭,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端陪每,此時代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器影晓。
簡單來說就是真實的服務(wù)器不能直接被外部網(wǎng)絡(luò)訪問,所以需要一臺代理服務(wù)器檩禾,而代理服務(wù)器能被外部網(wǎng)絡(luò)訪問的同時又跟真實服務(wù)器在同一個網(wǎng)絡(luò)環(huán)境挂签,當(dāng)然也可能是同一臺服務(wù)器,端口不同而已盼产。
反向代理通過proxy_pass指令來實現(xiàn)饵婆。
啟動一個Java Web項目,端口號為8081
server{listen80;server_namelocalhost;location/?{proxy_passhttp://localhost:8081;proxy_set_headerHost$host:$server_port;#?設(shè)置用戶ip地址proxy_set_headerX-Forwarded-For$remote_addr;#?當(dāng)請求服務(wù)器出錯去尋找其他服務(wù)器proxy_next_upstreamerrortimeout?invalid_header?http_500?http_502?http_503;?????}}
當(dāng)我們訪問localhost的時候戏售,就相當(dāng)于訪問?localhost:8081了
四侨核、負載均衡
負載均衡也是Nginx常用的一個功能草穆,負載均衡其意思就是分攤到多個操作單元上進行執(zhí)行,例如Web服務(wù)器芹关、FTP服務(wù)器续挟、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)侥衬。
簡單而言就是當(dāng)有2臺或以上服務(wù)器時诗祸,根據(jù)規(guī)則隨機的將請求分發(fā)到指定的服務(wù)器上處理,負載均衡配置一般都需要同時配置反向代理轴总,通過反向代理跳轉(zhuǎn)到負載均衡直颅。而Nginx目前支持自帶3種負載均衡策略,還有2種常用的第三方策略怀樟。
負載均衡通過upstream指令來實現(xiàn)功偿。推薦:Java面試題大全
1. RR(round robin :輪詢 默認)
每個請求按時間順序逐一分配到不同的后端服務(wù)器,也就是說第一次請求分配到第一臺服務(wù)器上往堡,第二次請求分配到第二臺服務(wù)器上械荷,如果只有兩臺服務(wù)器,第三次請求繼續(xù)分配到第一臺上虑灰,這樣循環(huán)輪詢下去吨瞎,也就是服務(wù)器接收請求的比例是 1:1, 如果后端服務(wù)器down掉穆咐,能自動剔除颤诀。輪詢是默認配置,不需要太多的配置
同一個項目分別使用8081和8082端口啟動項目
upstreamweb_servers?{serverlocalhost:8081;serverlocalhost:8082;??}server{listen80;server_namelocalhost;#access_log??logs/host.access.log??main;location/?{proxy_passhttp://web_servers;#?必須指定Header?Hostproxy_set_headerHost$host:$server_port;????}?}
訪問地址仍然可以獲得響應(yīng)?http://localhost/api/user/login?username=zhangsan&password=111111?对湃,這種方式是輪詢的
2. 權(quán)重
指定輪詢幾率崖叫,weight和訪問比率成正比, 也就是服務(wù)器接收請求的比例就是各自配置的weight的比例,用于后端服務(wù)器性能不均的情況,比如服務(wù)器性能差點就少接收點請求拍柒,服務(wù)器性能好點就多處理點請求心傀。
upstreamtest?{serverlocalhost:8081weight=1;serverlocalhost:8082weight=3;serverlocalhost:8083weight=4backup;}
示例是4次請求只有一次被分配到8081上,其他3次分配到8082上拆讯。backup是指熱備剧包,只有當(dāng)8081和8082都宕機的情況下才走8083
3. ip_hash
上面的2種方式都有一個問題,那就是下一個請求來的時候請求可能分發(fā)到另外一個服務(wù)器往果,當(dāng)我們的程序不是無狀態(tài)的時候(采用了session保存數(shù)據(jù)),這時候就有一個很大的很問題了一铅,比如把登錄信息保存到了session中陕贮,那么跳轉(zhuǎn)到另外一臺服務(wù)器的時候就需要重新登錄了,所以很多時候我們需要一個客戶只訪問一個服務(wù)器潘飘,那么就需要用iphash了肮之,iphash的每個請求按訪問ip的hash結(jié)果分配掉缺,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決session的問題戈擒。
upstreamtest{ip_hash;serverlocalhost:8080;serverlocalhost:8081;}
4. fair(第三方)
按后端服務(wù)器的響應(yīng)時間來分配請求眶明,響應(yīng)時間短的優(yōu)先分配。這個配置是為了更快的給用戶響應(yīng)
upstreambackend{fair;serverlocalhost:8080;serverlocalhost:8081;}
5. url_hash(第三方)
按訪問url的hash結(jié)果來分配請求筐高,使每個url定向到同一個后端服務(wù)器搜囱,后端服務(wù)器為緩存時比較有效。在upstream中加入hash語句柑土,server語句中不能寫入weight等其他的參數(shù)蜀肘,hash_method是使用的hash算法
upstreambackend?{hash$request_uri;hash_methodcrc32;serverlocalhost:8080;serverlocalhost:8081;}
以上5種負載均衡各自適用不同情況下使用,所以可以根據(jù)實際情況選擇使用哪種策略模式,不過fair和url_hash需要安裝第三方模塊才能使用稽屏。
五扮宠、動靜分離
動靜分離是讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動靜資源做好了拆分以后狐榔,我們就可以根據(jù)靜態(tài)資源的特點將其做緩存操作坛增,這就是網(wǎng)站靜態(tài)化處理的核心思路。
upstreamweb_servers?{serverlocalhost:8081;serverlocalhost:8082;??}server{listen80;server_namelocalhost;set$doc_root/usr/local/var/www;location~*?\.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)${root$doc_root/img;????}location/?{proxy_passhttp://web_servers;#?必須指定Header?Hostproxy_set_headerHost$host:$server_port;????}error_page500502503504/50x.html;location=?/50x.html?{root$doc_root;????}?}
六薄腻、其他
1.return指令
返回http狀態(tài)碼 和 可選的第二個參數(shù)可以是重定向的URL
location?/permanently/moved/url?{return301http://www.example.com/moved/here;}
2. rewrite指令
重寫URI請求 rewrite收捣,通過使用rewrite指令在請求處理期間多次修改請求URI,該指令具有一個可選參數(shù)和兩個必需參數(shù)被廓。
第一個(必需)參數(shù)是請求URI必須匹配的正則表達式坏晦。
第二個參數(shù)是用于替換匹配URI的URI。
可選的第三個參數(shù)是可以停止進一步重寫指令的處理或發(fā)送重定向(代碼301或302)的標志
location/users/?{rewrite?^/users/(.*)$/show?user=$1break;}
3. error_page指令
使用error_page指令嫁乘,您可以配置NGINX返回自定義頁面以及錯誤代碼昆婿,替換響應(yīng)中的其他錯誤代碼,或?qū)g覽器重定向到其他URI蜓斧。在以下示例中仓蛆,error_page指令指定要返回404頁面錯誤代碼的頁面(/404.html)。
error_page404/404.html;
4. 日志
訪問日志:需要開啟壓縮 gzip on; 否則不生成日志文件挎春,打開log_format看疙、access_log注釋
log_formatmain'$remote_addr-$remote_user[$time_local]?"$request"?''$status$body_bytes_sent"$http_referer"?''"$http_user_agent"?"$http_x_forwarded_for"';access_log/usr/local/etc/nginx/logs/host.access.log??main;gzipon;
5. deny 指令
#?禁止訪問某個目錄location~*?\.(txt|doc)${
????root?$doc_root;
????deny?all;
}
6. 內(nèi)置變量
nginx的配置文件中可以使用的內(nèi)置變量以美元符$開始,也有人叫全局變量直奋。其中能庆,部分預(yù)定義的變量的值是可以改變的。另外脚线,關(guān)注Java知音公眾號搁胆,回復(fù)“后端面試”,送你一份面試題寶典!
$args?:#這個變量等于請求行中的參數(shù)渠旁,同$query_string
$content_length?:請求頭中的Content-length字段攀例。
$content_type?:請求頭中的Content-Type字段。
$document_root?:當(dāng)前請求在root指令中指定的值顾腊。
$host?:請求主機頭字段粤铭,否則為服務(wù)器名稱。
$http_user_agent?:客戶端agent信息
$http_cookie?:客戶端cookie信息
$limit_rate?:這個變量可以限制連接速率杂靶。
$request_method?:客戶端請求的動作梆惯,通常為GET或POST。
$remote_addr?:客戶端的IP地址伪煤。
$remote_port?:客戶端的端口加袋。
$remote_user?:已經(jīng)經(jīng)過Auth Basic Module驗證的用戶名。
$request_filename?:當(dāng)前請求的文件路徑抱既,由root或alias指令與URI請求生成职烧。
$scheme?:HTTP方法(如http,https)防泵。
$server_protocol?:請求使用的協(xié)議蚀之,通常是HTTP/1.0或HTTP/1.1。
$server_addr?:服務(wù)器地址捷泞,在完成一次系統(tǒng)調(diào)用后可以確定這個值足删。
$server_name?:服務(wù)器名稱。
$server_port?:請求到達服務(wù)器的端口號锁右。
$request_uri?:包含請求參數(shù)的原始URI失受,不包含主機名,如:”/foo/bar.php?arg=baz”咏瑟。
$uri?:不帶請求參數(shù)的當(dāng)前URI拂到,$uri不包含主機名,如”/foo/bar.html”码泞。
$document_uri?:與$uri相同
如果有需要領(lǐng)取免費資料的小伙伴們兄旬,可以點擊此處領(lǐng)取資料哦!