掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Nginx本身也是一個(gè)靜態(tài)資源的服務(wù)器,當(dāng)只有靜態(tài)資源的時(shí)候,就可以使用Nginx來做服務(wù)器,如果一個(gè)網(wǎng)站只是靜態(tài)頁面的話,那么就可以通過這種方式來實(shí)現(xiàn)部署。

10年積累的成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有淮南免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
1、首先在文檔根目錄?Docroot(/usr/local/var/www)下創(chuàng)建html目錄, 然后在html中放一個(gè)test.html;
user?mengday?staff;
http?{
????server?{
????????listen???????80;
????????server_name??localhost;
????????client_max_body_size?1024M;
????????#?默認(rèn)location
????????location?/?{
????????????root???/usr/local/var/www/html;
????????????index??index.html?index.htm;
????????}
????}
}
注意:如果訪問圖片出現(xiàn)403 Forbidden錯(cuò)誤,可能是因?yàn)閚ginx.conf 的第一行user配置不對,默認(rèn)是#user nobody;是注釋的,linux下改成user root; macos下改成user 用戶名 所在組; 然后重新加載配置文件或者重啟,再試一下就可以了, 用戶名可以通過who am i 命令來查看。
. :匹配除換行符以外的任意字符
? :重復(fù)0次或1次
+?:重復(fù)1次或更多次
*?:重復(fù)0次或更多次
\d :匹配數(shù)字
^?:匹配字符串的開始
$?:匹配字符串的結(jié)束
{n}?:重復(fù)n次
{n,}?:重復(fù)n次或更多次
[c]?:匹配單個(gè)字符c
[a-z]?:匹配a-z小寫字母的任意一個(gè)
(a|b|c)?:?屬線表示匹配任意一種情況,每種情況使用豎線分隔,一般使用小括號括括住,匹配符合a字符?或是b字符?或是c字符的字符串
\?反斜杠:用于轉(zhuǎn)義特殊字符
小括號()之間匹配的內(nèi)容,可以在后面通過來引用,2表示的是前面第二個(gè)()里的內(nèi)容。正則里面容易讓人困惑的是\轉(zhuǎn)義特殊字符。
在公司中經(jīng)常會(huì)遇到靜態(tài)服務(wù)器,通常會(huì)提供一個(gè)上傳的功能,其他應(yīng)用如果需要靜態(tài)資源就從該靜態(tài)服務(wù)器中獲取。
1、在/usr/local/var/www 下分別創(chuàng)建images和img目錄,分別在每個(gè)目錄下放一張test.jpg
http?{
????server?{
????????listen???????80;
????????server_name??localhost;
????????set?$doc_root?/usr/local/var/www;
????????#?默認(rèn)location
????????location?/?{
????????????root???/usr/local/var/www/html;
????????????index??index.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的映射一般有兩種方式:
訪問http://localhost/test.jpg 會(huì)映射到 $doc_root/img
訪問http://localhost/images/test.jpg 當(dāng)同一個(gè)路徑滿足多個(gè)location時(shí),優(yōu)先匹配優(yōu)先級高的location,由于^~ 的優(yōu)先級大于 ~, 所以會(huì)走/images/對應(yīng)的location。
常見的location路徑映射路徑有以下幾種:
當(dāng)一個(gè)路徑匹配多個(gè)location時(shí)究竟哪個(gè)location能匹配到時(shí)有優(yōu)先級順序的,而優(yōu)先級的順序于location值的表達(dá)式類型有關(guān),和在配置文件中的先后順序無關(guān)。相同類型的表達(dá)式,字符串長的會(huì)優(yōu)先匹配。
以下是按優(yōu)先級排列說明:
優(yōu)先級搜索問題:不同類型的location映射決定是否繼續(xù)向下搜索
location優(yōu)先級從高到底:
(location?=)?>?(location?完整路徑)?>?(location?^~?路徑)?>?(location?~,~*?正則順序)?>?(location?部分起始路徑)?>?(/)
location?=?/?{
????#?精確匹配/,主機(jī)名后面不能帶任何字符串?/
????[?configuration?A?]
}
location?/?{
????#?匹配所有以?/?開頭的請求。
????#?但是如果有更長的同類型的表達(dá)式,則選擇更長的表達(dá)式。
????#?如果有正則表達(dá)式可以匹配,則優(yōu)先匹配正則表達(dá)式。
????[?configuration?B?]
}
location?/documents/?{
????#?匹配所有以?/documents/?開頭的請求,匹配符合以后,還要繼續(xù)往下搜索。
????#?但是如果有更長的同類型的表達(dá)式,則選擇更長的表達(dá)式。
????#?如果有正則表達(dá)式可以匹配,則優(yōu)先匹配正則表達(dá)式。
????[?configuration?C?]
}
location?^~?/images/?{
????#?匹配所有以?/images/?開頭的表達(dá)式,如果匹配成功,則停止匹配查找,停止搜索。
????#?所以,即便有符合的正則表達(dá)式location,也不會(huì)被使用
????[?configuration?D?]
}
location?~*?\.(gif|jpg|jpeg)$?{
????#?匹配所有以 gif jpg jpeg結(jié)尾的請求。
????#?但是?以?/images/開頭的請求,將使用?Configuration?D,D具有更高的優(yōu)先級
????[?configuration?E?]
}
location?/images/?{
????#?字符匹配到?/images/,還會(huì)繼續(xù)往下搜索
????[?configuration?F?]
}
location?=?/test.htm?{
????root???/usr/local/var/www/htm;
????index??index.htm;
}
注意:location的優(yōu)先級與location配置的位置無關(guān),Nginx配置中一個(gè)不起眼字符"/"的巨大作用,失之毫厘謬以千里。
反向代理應(yīng)該是Nginx使用最多的功能了,反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端,此時(shí)代理服務(wù)器對外就表現(xiàn)為一個(gè)反向代理服務(wù)器。
簡單來說就是真實(shí)的服務(wù)器不能直接被外部網(wǎng)絡(luò)訪問,所以需要一臺代理服務(wù)器,而代理服務(wù)器能被外部網(wǎng)絡(luò)訪問的同時(shí)又跟真實(shí)服務(wù)器在同一個(gè)網(wǎng)絡(luò)環(huán)境,當(dāng)然也可能是同一臺服務(wù)器,端口不同而已。
反向代理通過proxy_pass指令來實(shí)現(xiàn)。
啟動(dòng)一個(gè)Java Web項(xiàng)目,端口號為8081
server?{
????listen???????80;
????server_name??localhost;
????location?/?{
????????proxy_pass?http://localhost:8081;
????????proxy_set_header?Host?$host:$server_port;
????????#?設(shè)置用戶ip地址
?????????proxy_set_header?X-Forwarded-For?$remote_addr;
?????????#?當(dāng)請求服務(wù)器出錯(cuò)去尋找其他服務(wù)器
?????????proxy_next_upstream?error?timeout?invalid_header?http_500?http_502?http_503;?
????}
}?
當(dāng)我們訪問localhost的時(shí)候,就相當(dāng)于訪問 localhost:8081了
負(fù)載均衡也是Nginx常用的一個(gè)功能,負(fù)載均衡其意思就是分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行執(zhí)行,例如Web服務(wù)器、FTP服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。一文詳解負(fù)載均衡和反向代理的真實(shí)區(qū)別。
簡單而言就是當(dāng)有2臺或以上服務(wù)器時(shí),根據(jù)規(guī)則隨機(jī)的將請求分發(fā)到指定的服務(wù)器上處理,負(fù)載均衡配置一般都需要同時(shí)配置反向代理,通過反向代理跳轉(zhuǎn)到負(fù)載均衡。而Nginx目前支持自帶3種負(fù)載均衡策略,還有2種常用的第三方策略。
負(fù)載均衡通過upstream指令來實(shí)現(xiàn)。
每個(gè)請求按時(shí)間順序逐一分配到不同的后端服務(wù)器,也就是說第一次請求分配到第一臺服務(wù)器上,第二次請求分配到第二臺服務(wù)器上,如果只有兩臺服務(wù)器,第三次請求繼續(xù)分配到第一臺上,這樣循環(huán)輪詢下去,也就是服務(wù)器接收請求的比例是 1:1,如果后端服務(wù)器down掉,能自動(dòng)剔除。輪詢是默認(rèn)配置,不需要太多的配置
同一個(gè)項(xiàng)目分別使用8081和8082端口啟動(dòng)項(xiàng)目
upstream?web_servers?{??
???server?localhost:8081;??
???server?localhost:8082;??
}
server?{
????listen???????80;
????server_name??localhost;
????#access_log??logs/host.access.log??main;
????location?/?{
????????proxy_pass?http://web_servers;
????????#?必須指定Header?Host
????????proxy_set_header?Host?$host:$server_port;
????}
?}
訪問地址仍然可以獲得響應(yīng) http://localhost/api/user/login?username=zhangsan&password=111111 ,這種方式是輪詢的
指定輪詢幾率,weight和訪問比率成正比, 也就是服務(wù)器接收請求的比例就是各自配置的weight的比例,用于后端服務(wù)器性能不均的情況,比如服務(wù)器性能差點(diǎn)就少接收點(diǎn)請求,服務(wù)器性能好點(diǎn)就多處理點(diǎn)請求。
upstream?test?{
????server?localhost:8081?weight=1;
????server?localhost:8082?weight=3;
????server?localhost:8083?weight=4?backup;
}
示例是4次請求只有一次被分配到8081上,其他3次分配到8082上。backup是指熱備,只有當(dāng)8081和8082都宕機(jī)的情況下才走8083
上面的2種方式都有一個(gè)問題,那就是下一個(gè)請求來的時(shí)候請求可能分發(fā)到另外一個(gè)服務(wù)器,當(dāng)我們的程序不是無狀態(tài)的時(shí)候(采用了session保存數(shù)據(jù)),這時(shí)候就有一個(gè)很大的很問題了,比如把登錄信息保存到了session中,那么跳轉(zhuǎn)到另外一臺服務(wù)器的時(shí)候就需要重新登錄了,所以很多時(shí)候我們需要一個(gè)客戶只訪問一個(gè)服務(wù)器,那么就需要用iphash了,iphash的每個(gè)請求按訪問ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器,可以解決session的問題。
upstream?test?{
????ip_hash;
????server?localhost:8080;
????server?localhost:8081;
}
按后端服務(wù)器的響應(yīng)時(shí)間來分配請求,響應(yīng)時(shí)間短的優(yōu)先分配。這個(gè)配置是為了更快的給用戶響應(yīng)
upstream?backend?{
????fair;
????server?localhost:8080;
????server?localhost:8081;
}
按訪問url的hash結(jié)果來分配請求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。在upstream中加入hash語句,server語句中不能寫入weight等其他的參數(shù),hash_method是使用的hash算法
upstream?backend?{
????hash?$request_uri;
????hash_method?crc32;
????server?localhost:8080;
????server?localhost:8081;
}
以上5種負(fù)載均衡各自適用不同情況下使用,所以可以根據(jù)實(shí)際情況選擇使用哪種策略模式,不過fair和url_hash需要安裝第三方模塊才能使用。
動(dòng)靜分離是讓動(dòng)態(tài)網(wǎng)站里的動(dòng)態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動(dòng)靜資源做好了拆分以后,我們就可以根據(jù)靜態(tài)資源的特點(diǎn)將其做緩存操作,這就是網(wǎng)站靜態(tài)化處理的核心思路。
upstream?web_servers?{??
???????server?localhost:8081;??
???????server?localhost:8082;??
}
server?{
????listen???????80;
????server_name??localhost;
????set?$doc_root?/usr/local/var/www;
????location?~*?\.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$?{
???????root?$doc_root/img;
????}
????location?/?{
????????proxy_pass?http://web_servers;
????????#?必須指定Header?Host
????????proxy_set_header?Host?$host:$server_port;
????}
????error_page?500?502?503?504??/50x.html;??
????location?=?/50x.html?{??
????????root?$doc_root;
????}
?}
返回http狀態(tài)碼 和 可選的第二個(gè)參數(shù)可以是重定向的URL
location?/permanently/moved/url?{
????return?301?http://www.example.com/moved/here;
}
重寫URI請求 rewrite,通過使用rewrite指令在請求處理期間多次修改請求URI,該指令具有一個(gè)可選參數(shù)和兩個(gè)必需參數(shù)。
第一個(gè)(必需)參數(shù)是請求URI必須匹配的正則表達(dá)式。
第二個(gè)參數(shù)是用于替換匹配URI的URI。
可選的第三個(gè)參數(shù)是可以停止進(jìn)一步重寫指令的處理或發(fā)送重定向(代碼301或302)的標(biāo)志
location?/users/?{
????rewrite?^/users/(.*)$?/show?user=$1?break;
}
使用error_page指令,您可以配置NGINX返回自定義頁面以及錯(cuò)誤代碼,替換響應(yīng)中的其他錯(cuò)誤代碼,或?qū)g覽器重定向到其他URI。在以下示例中,error_page指令指定要返回404頁面錯(cuò)誤代碼的頁面(/404.html)。
error_page?404?/404.html;
訪問日志:需要開啟壓縮 gzip on; 否則不生成日志文件,打開log_format、access_log注釋
log_format??main??'$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;
gzip??on;
#?禁止訪問某個(gè)目錄
location?~*?\.(txt|doc)${
????root?$doc_root;
????deny?all;
}???
nginx的配置文件中可以使用的內(nèi)置變量以美元符$開始,也有人叫全局變量。其中,部分預(yù)定義的變量的值是可以改變的。

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流