java架構之路-(nginx使用詳解)nginx的反向代理和優化配置


  書接上回說,nginx我們學會了簡單的配置。那么我今天來聊一下,我們ngxin的一些優化配置(我不是很懂,不敢談高級配置)。我先來看一下nginx的好處和正向代理。

nginx的好處

1、可以高並發連接,官方測試Nginx能夠支撐5萬並發連接,實際生產環境中可以支撐2~4萬並發連接數。他的NIO模式上個博客提到過,這里不再贅述了。 

2、內存消耗少,Nginx+PHP(FastCGI)服務器,在3萬並發連接下,開啟10個Nginx進程消耗150MB內存,15MB*10=150MB,開啟的64個PHP-CGI進程消耗1280內存,20MB*64=1280MB,加上系統自身消耗的內存,總共消耗不到2GB的內存。

如果服務器的內存比較小,完全可以只開啟25個PHP-CGI進程,這樣PHP-CGI消耗的總內存數才500MB。

3、成本低廉,開源軟件,不需要任何成本。

4、配置文件非常簡單,網絡和程序一樣通俗易懂,即使,非專用系統管理員也能看懂。

5、支持Rewrite重寫,能夠根據域名、URL的不同,將http請求分到不同的后端服務器群組。

6、內置的健康檢查功能如果,NginxProxy后端的某台Web服務器宕機了,不會影響前端的訪問。(這個后面會給予詳細的配置和說明)

7、節省帶寬,支持GZIP壓縮,可以添加瀏覽器本地緩存的Header頭。

8、穩定性高,用於反向代理,宕機的概率微乎其微。

9、支持熱部署,Nginx支持熱部署,它的自動特別容易,並且,幾乎可以7天*24小時不間斷的運行,即使,運行數個月也不需要重新啟動,還能夠在不間斷服務的情況下,對軟件版本進行升級。

說完了好處,我們來談談正向代理和反向代理的區別。

 其實這個玩意挺不好解釋的,但是一定注意幾點,他倆在nginx的配置是一樣的。並且不要說nginx服務器和目標服務器不在一起就是反向代理。

我們以中間商賺差價為例。

我們要去市場買肉(客戶端)。這里有有一個肉聯廠(真正的服務端)。我們心知肚明吧的知道菜市場肉販子的肉是從肉聯廠進貨的。(肉販子是代理端)。

我們從肉販子手里買了肉。可以忽略這句話(這不廢話嗎,下面反正代理也是這樣的)。關鍵差別在於肉聯廠只知道把肉給了肉販子,並不知道誰真正買走了他的肉,這就是正向代理。

一般用於爬蟲和VPN。

還是買肉的例子。

我們要去市場買肉(客戶端)。這里有有一個肉聯廠(真正的服務端)。我們從肉販子手里買了肉。關鍵差別在於我們並不知道肉販子的肉是從哪個肉聯廠購進的肉。(肉販子是代理端)。

這就是反向代理,可能他們三個都認識,但是並不能確認買賣關系。

一般用於負載均衡。

我們先來看一下如何來設置負載均衡。

反正代理的負責均衡一般是輪詢,權重(百分比),IP_hash,URL_hash,最小訪問等算法。

反向代理相關參數:

  proxy_pass:#服務名稱(地址)

  proxy_redirect on/off:#是否重定向

  proxy_set_header Host $host:#傳Header參數至后端服務

  proxy_set_header X-Forwared-For $remote_addr:#傳Header參數至后端服務

  proxy_connent_timeout 90 # 連接代理服務器超時時間

  proxy_send_timeout 90 #請求發送最大時間,默認單位秒

  proxy_read_timeout 90 # 讀取請求最大時間,默認單位秒

更多參數配置參考官網,地址http://nginx.org/en/docs/http/ngx_http_proxy_module.html。里面超詳細的。

我先來配置一個最簡單的反向代理。

 

 

 

upstream和server是同級別的,不要放置在server內部。

如果內部加入weight參數,則表示權重尋址.

 

 

 表示訪問兩次8002,訪問一次8001。循環下去。

如果其中一個服務宕機了,這時nginx會不在分發請求到那個服務上,當服務恢復,nginx會自動監控到服務啟動了,會再次發送服務到該服務。

這里說兩個配置,fail_timeout和slow_start。fail_timeout表示服務請求超過多長時間,就認為該服氣宕機了,slow_start表示繼續監控該服務多長時間,如果正常則認為服務已恢復正常。

配置如圖:

 

 注意slow_start參數不能與 haship_hash隨機 負載平衡方法一起使用,官網是這樣說的,但是我這一直說slow_start是無效參數。

   backup為備用服務,就是我們當前有任何一台服務器處於正常狀態,請求不會分發到backup服務器上。除非所有服務器全部宕機,請求才會分發到backup上。

   max_conns:允許最大連接數。

可以調節的參數還有很多,我們可以去官網查看,下面我來說一下簡單的優化配置。

當我們要做大並發時,我們優先的想到的就是緩存,我們應該把靜態的文件緩存下來,其實我想象中的架構可以是這樣的....

 

 

 這樣我們可以做到請求的分發,然后把靜態的JS,CSS文件分離出來,不至於讓這些靜態的文件占用我們的網絡帶寬,那么我們來看一下nginx是如何做緩存的吧。

 

 

用管理員啟動,你會看到你訪問以后會留下文件夾,里面是一個看不懂的文件,是一份緩存文件,我們簡單說一下上面的配置都是什么意思。

proxy_cache_path聲明配置塊,第一個參數是路徑,要和你啟動的賬號權限保持一致啊。不然沒法寫入的,levels是保存的目錄等級,我們看到最后生產的文件是一個MD5的文件。1:2就是說明一級目錄取文件名的最后一位數,2代理下級目錄是文件名的2-3位的名字。

keys_zone=名稱:文件大小,要和下面proxy_cache的名字保持一致。incative是保存的天數。max_sizes是保存的最大單位。location內部的分別是proxy_cache緩存名稱,proxy_cache_key以url來MD5進行計算。如果匹配直接取緩存。

proxy_cachr_valid代表狀態碼為200 304時進行保存,保存12小時。

優化擴展:

我們說過,我們可以啟動多個work進程,每個work都是運行在一個單獨的cpu上,但是他們的訪問cpu完全是隨機的,可能發生cpu爭搶消耗時間,我們可以采用綁定CPU的方式來解決這個問題。

參數work_cpu_affinity 0001 0010 0100 1000;這樣的配置使我們啟動了四個work,就是用1來占位綁定cpu。

盡量避免使用IP_hash來做配置,IP_hash只能分發到同一個外網地址的請求,很多用路由交換機代理的內網IP,並不使用IP_hash算法,會造成單服務器大量請求,不能達到均衡的目的。

 

nginx我們今天就聊到這里,還有很多深入的優化,官網寫的很詳細,大家可以自己去嘗試。java開發范圍的,這些我覺得差不多可以了。可以慢慢深入研究。

 

最進弄了一個公眾號,小菜技術,歡迎大家的加入


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM