書接上回說,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參數不能與 hash,ip_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開發范圍的,這些我覺得差不多可以了。可以慢慢深入研究。
最進弄了一個公眾號,小菜技術,歡迎大家的加入