nginx負載均衡的一些問題和具體配置

對於服務器集羣的搭建,nginx負載均衡是很好的方式:思路如下圖

這裏的session採用了session共享的方式,這樣來避免一些情況下的session丟失。下面我會具體說到。

session丟失:是因爲文件存儲session的方式會把session存儲到當前服務器中,通過cookie中的sessionID來獲取相應的session,如果第二次請求跟第一次請求不再一個服務器上那麼session就沒了。

nginx的分配方式:

1.輪詢,也是nginx的默認分配方式

這種方式就會造成我上面說到的session丟失的問題。

輪詢的方式可以通過配置weight的方式來實現權重的控制 權重越高 分配到的機率也就越高。

2.ip_hash

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,就不會造成session丟失的問題。

3.url_hash

按訪問url的hash結果來分配請求,使同樣的url定向到同一個後端服務器。

4.fair(需要服務器支持)

這種分配方式就比較智能了,根據服務器的響應時間來分配請求,根據時時的服務器狀態來職能分配。


明確了上面的問題,session最好放到緩存中,最常用的memcache就可以 只要簡單的配置下就ok了。

修改php.ini

session.save_handler = memcache  
session.save_path = "tcp://127.0.0.1:11211" 

把文件存儲緩存緩存存儲就可以實現session的貢獻 key是sessionID value就是序列號後的session內容

ps:memcache服務器要是宕機的話會很尷尬。

==============================================

知道了session的問題,明確了分配方式下面就是具體的配置了:

在http {}配置模塊裏添加upstream 在server配置中通過proxy_pass命令來實現代理分配

upstream test {

             #ip_hash;//分配方式,默認爲輪詢

 

             server 192.168.1.111 weight 1;

             server 192.168.1.112;

             server 192.168.1.113;

         }

 

server {

        listen       80;

        server_name  test;

 

        location / {

              #設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實IP

             proxy_set_header Host $host;

             proxy_set_header X-Real-IP $remote_addr;

             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 

             #禁用緩存

             proxy_buffering off;


             #反向代理的地址

             proxy_pass http://test;     

        }

}

ps:如果不設置proxy_set_header  你獲取到的客戶端地址都變成你代理服務器的地址了 就尷尬了。。。所以最好都設置一下。


總結:

注意session的問題,選擇合理的分配方式。還要根據公司的流量,pv來看看是不是真的需要應用負載均衡。

每一個服務器的運行狀態,安裝的環境版本最好都保持一致,否則會有問題,對於DB的讀取,也要做好合理的安排。如果單機的時候mysql的可訪問權限要是localhost那麼換成集羣以後記得修改,否則就死了......

值得注意的是,如果採用了負載均衡,在佈置代碼的時候就會很麻煩,所以自動化運維也是很必要的一件事,我看過一篇帖子是美團的自動化運維發展史,每個公司的具體情況都不一樣,所以沒有好的公共的方法可以實現 適合大多數公司的自動化運維。一般都是自己的運維人員開發一套適合公司情況的自動化運維繫統。

目前就想到這麼多,歡迎指正。= =  今天搞一下HHVM,搞好了我會貼出來。。。。(如果不懶的話今天就會貼出來,懶的話就不知道啥時候了:)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章