Nginx是lgor Sysoev爲俄羅斯訪問量第二的rambler.ru站點設計開發的。從2004年發佈至今,憑藉開源的力量,已經接近成熟與完善css
Nginx功能豐富,可做爲HTTP服務器,也可做爲反向代理服務器,支持不少第三方的模塊擴展(可以使用openresty進行二次開發)。html
(1)http反向代理:前端
Nginx主要是將請求根據靈活的轉發策略進行轉發,對外暴露統一的域名,再根據請求的完整URL進行URL重定向,這樣能夠將同一域名的請求分發到不一樣的服務器進行處理,下降了用戶根據需求訪問不一樣URL的操做,同時也能夠解決跨域問題。nginx
(2)負載均衡:正則表達式
Nginx同時還能夠對後臺的集羣服務器進行負載均衡,Nginx提供的負載均衡策略有兩種大類,一種是內置策略,一種是擴展策略。其中內置策略有:輪詢,加權輪詢,Ip hash。外置擴展的能夠根據需求進行編寫。算法
這裏簡單擴展一下內置的策略:後端
1>輪詢,加權輪詢:進行簡單或者根據權值進行負載請求。但可能會出現有服務器異常後,Nginx依舊不停的分配請求給該服務器(Nginx有本身的健康檢測機制,主要爲服務心跳)。加權輪詢主要是考慮到服務器自己性能,人爲的給予權重進行優化處理。跨域
2>Ip hash:經過對來源Ip地址進行hash計算,而後將計算出的hash值相同的Ip分配到同一個服務器上。該方案主要解決了分佈式部署中session不共享的問題,可是同時也帶來了新的問題,負載可能出現不均衡。瀏覽器
(3)靜態服務器:緩存
靜態資源是指非服務器運行動態生成的文件,主要包括瀏覽器端渲染(html、css、js)、圖片(jpeg、gif、png)、視頻文件(flv、mpeg)、其餘文件(TXT等任意下載文件),所以Nginx在現階段先後端分離的狀況下,經常用來部署前端項目(本人暫時只部署過Vue項目)。
Nginx的配置文件爲nginx.conf。裏面主要分爲了全局塊,events塊,http塊,server塊,location塊等五個部分組成。下圖能夠很好的代表配置文件中各個塊的區域位置。
1.全局塊:配置影響nginx全局的指令。通常有運行nginx服務器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,容許生成worker process數等。
2.events塊:配置影響nginx服務器或與用戶的網絡鏈接。有每一個進程的最大鏈接數,選取哪一種事件驅動模型(異步非阻塞的關鍵,有興趣能夠單獨瞭解)處理鏈接請求,是否容許同時接受多個網路鏈接,開啓多個網絡鏈接序列化等。
3.http塊:能夠嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,鏈接超時時間,單鏈接請求數等。
4.server塊:配置虛擬主機的相關參數,一個http中能夠有多個server。
5.location塊:配置請求的路由,以及各類頁面的處理狀況。
如下是一個簡單配置文件的說明:
須要注意在upstream XXX{}塊中能夠配置集羣,同時能夠配置負載的算法,默認爲輪詢策略。若是須要添加權值,只須要在對應的ip後面添加weight=XXX便可。若是須要使用Ip hash,就在最後添加一行「ip_hash;」便可。
工做中,經常使用的配置主要在server塊和location塊,由於這兩塊主要是配置Nginx的反向代理和轉發的主要區域。
(1)須要配置http塊中的upstream塊,這裏能夠添加對應服務名的集羣ip。
(2)配置server塊中的監聽端口(listen)和監聽地址(server_name)
(3)在配置location的時候有一些規則
首先須要明確一點,location匹配的是Nginx的$request\_uri,而後如下是location匹配種類: \=:開頭表示精確匹配 ^~:開頭,注意這不是一個正則表達式(是提高優先級的字符串匹配)它的目的是優先於正則表達式的匹配。若是該location是最佳匹配,則再也不進行正則表達式檢測。 ~:開頭表示區分大小寫的正則匹配; ~\*:開頭表示不區分大小寫的正則匹配 !~ && !~\*:表示區分大小寫不匹配的正則和不區分大小寫的不匹配的正則 /:開頭爲字符串匹配
location匹配順序:
首先精確匹配\= 其次匹配^~ 再其次按照配置文件的順序進行正則匹配 最後是交給/進行通用匹配 其中須要注意^~這個匹配,一旦^~字符串匹配成功將再也不進行正則匹 配,當即返回命中的字符串匹配。若是\=先命中,依舊須要判斷正則匹配,若是正則匹配命中則返回正則匹配,若是正則匹配未命中就返回\=匹配。全部以前的匹配都沒有命中則判斷/匹配。同時須要注意,正則匹配是按照location配置的順序進行匹配,所以正則匹配的順序相當重要。
(4)經常使用配置指令alias、root、proxy_pass、rewrite、proxy_redirect
1.alias——別名配置,用於訪問文件系統,在匹配到location配置的URL路徑後,指向alias配置的路徑,如:
請求/test/1.jpg(省略了協議和域名),將會返回文件/usr/local/1.jpg。
若是alias配置在正則匹配的location內,則正則表達式中必須包含捕獲語句(也就是括號()),並且alias配置中也要引用這些捕獲值。如:
請求中只要能匹配到正則,好比/img/flower.png或者/resource/img/flower.png,都會轉換爲請求/usr/local/images/flower.png。
2.root——根路徑配置,用於訪問文件系統,在匹配到location配置的URL路徑後,指向root配置的路徑,並把請求路徑附加到其後,如:
請求/test/1.jpg,將會返回文件/usr/local/test/1.jpg。
3.proxy_pass——反向代理配置,用於代理請求,適用於先後端負載分離或多臺機器、服務器負載分離的場景,在匹配到location配置的URL路徑後,轉發請求到proxy_pass配置額URL,是否會附加location配置路徑與proxy_pass配置的路徑後是否有"/"有關,有"/"則不附加,如:
請求/test/1.jpg,將會被nginx轉發請求到http://127.0.0.1:8080/1.jpg(未附加/test/路徑)。
4.rewrite規則會改變部分或整個用戶請求中的URL,主要有兩個用途:
<1>通知客戶端,請求的資源已經換地方了。例如網站改版後添加了www前綴,經過rewrite規則能夠將全部請求導向新站點。
<2>控制Nginx中的處理流程。例如當須要動態生成內容時,將請求轉發到應用程序服務器。
如下爲工做中真實遇到的問題,寫法一和寫法二的區別
區別在於
寫法一是將/test1/test2/aaaaa統一轉換到/XXX/aaaaa
寫法二是將/test1/test2/aaaaa統一轉換到/XXX/
其中(.*)$表示n個字符做爲變量,$1表示(.*n)$所替換的變量。注意一點,當使用(.\*)$以後的變量替換時不須要在最後面添加?$args。
5.proxy_redirect利用這個指令能夠爲被代理服務器發出的相對重定向增長主機名,主要是修改從被代理服務器傳來的應答頭中的"Location"和"Refresh"字段。