對於服務器集羣的搭建,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,搞好了我會貼出來。。。。(如果不懶的話今天就會貼出來,懶的話就不知道啥時候了:)