其實大多數互聯網網站起初的網站架構都是(Linux+Apache+MySQL+PHP). 不過隨着時代的發展,科技的進步.互聯網進入尋常百姓家的生活。所謂的用戶的需求,鑄就了一個個互聯網大牛; http://www.trueland.net/IndustryNews/gjszl.shtml 近日研究機構we are social發布了《2014年全球社會化媒體、數字和移動業務數據洞察》,公布了其對全球互聯網、關鍵社交、數字化業務和移動應用的統計數據。報告指出全球數字化業務正以驚人的趨勢保持高速增長,而促使這一發展趨勢的正是多屏移動設備的推動。
全球數據概覽

報告指出,目前,全世界互聯網人口總數已達25億,這是一個保守估算,按照國際電信聯盟(ITU International Telecommunications Union)估算,全球互聯網用戶數量可能已接近30億。、其實國內著名網站新浪微博也是從一個小網站發展起來的。簡單的LAMP架構。如今,這樣簡單的架構已經無法支撐新浪微博快速發展的業務需求,隨着訪問用戶的逐漸增長,系統不堪重負。
今天,明則就帶大家一步步地構建日均訪問上千PV的高性能Web站點; 日均千萬PVweb站點如下圖所示:
1、前端DNS,非常簡陋負載均衡器;不過並不影響日均千萬PV訪問網站的效果。
2、LVS具有很好的伸縮縮性、可靠性和管埋性,通過LVS要實現的最終目標是:利用linux 操作系統和LVS集群軟件實現一個高可用、高性能,低成本的服務器應用集群。keepalived:LVS 必備裝備;所以前端LVS應該是雙機熱備的架構;
3、官方測試Nginx在24G內存的機器上,能夠處理的並發請求連接數達到過200萬。由於Nginx使用基於事件驅動的架構能夠並發處理百萬級別的TCP連接,高度模塊化 的設計和自由的許可證使得擴展Nginx功能的第三方模塊層出不窮,而且優秀的設計帶來了極佳的穩定性,因此其作為Web服務器的反向代理被廣泛應用到大流量的網站上,包括騰訊、新浪、網 易、淘寶等訪問量巨大的網站。
4、使用NGINX將網頁內容動靜分離;可以使NGINX能夠一心一意處理靜態內容的請求;官方測試NGINX處理用戶連接;以及處理靜態網頁內容都是無與倫比的速度;
5、緩存的引入varnish是一款高性能的web-cache server,內存緩存數據;強大的vcl語言,讓用戶能夠隨心所欲對緩存數據進行過濾; 注釋:"比如像一些用戶私密的數據呀,更新比較頻繁的數據..都不應該緩存"
6、如今由於用戶並發訪問量比較大,動輒就10萬、20萬並發都是比較常見的;高並發對於傳統的共享存儲,比如:網絡文件系統NFS、或者集群文件系統、它們都屬於集中式存儲;用戶並發量一上來;必定會產生操作系統文件鎖的機制;性能底下。分布式文件系統的引入:mogilefs 是一款分布式文件系統;適用於處理海量小文件 詳情請參考分布式文件系統 ~MogileFS~
7、構建session集群;為什么需要構建session集群?想象一個場景;當你在購物時,你狂購了一下午的商品,結果你不小心刷新了一下;購物車中的商品全部消失了;你會怎么想?
8、使用haproxy 調度MySQL MMM ,使用MMM將用戶的請求讀寫分離至MySQL DB; 一般的網站;都是8分讀2分寫;所以使用mysql 讀寫分離的機制會大大提高網站性能的;
9、其實我們可以將部分動態內容的計算結果進行緩存,並在隨后需要的時候直接從varnish 緩存服務器取出返回給用戶,對於動態網頁來說,緩存的內容實際上就是動態網頁的輸出的html,我們稱為頁面緩存(page cache) 比如:"像一些新聞信息;廣告..."
10、多級緩存機制;我們還可以在NGINX上做緩存;
好吧! 廢話不多說啦! 開始構建千萬PVweb站點吧!
前端 LVS + Keepalived 雙機熱備負載均衡器:
LVS1 keepalived configure file;
global_defs { notification_email { firefox@foxmail.com firefox@1QQ.com } notification_email_from kanotify@magedu.com smtp_connect_timeout 3 smtp_server 127.0.0.1 router_id LVS_DEVEL } vrrp_script chk_schedown { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 2 weight -2 } vrrp_instance VI_1 { interface eth0 state MASTER priority 101 virtual_router_id 51 garp_master_delay 1 authentication { auth_type PASS auth_pass password } track_interface { eth0 } virtual_ipaddress { 172.16.249.100/16 dev eth0 label eth0:0 } track_script { chk_schedown } } vrrp_instance VI_2 { interface eth0 state MASTER priority 99 virtual_router_id 52 garp_master_delay 1 authentication { auth_type PASS auth_pass password } track_interface { eth0 } virtual_ipaddress { 172.16.249.200/16 dev eth0 label eth0:1 } track_script { chk_schedown } } virtual_server 172.16.249.100 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP # sorry_server 172.16.249.100 1358 virtual_server 172.16.249.200 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP sorry_server 172.16.249.200 1358 real_server 172.16.249.75 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.249.32 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.249.33 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.249.34 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.249.35 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.249.36 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
LVS2 keepalived configure file;
global_defs { notification_email { firefox@foxmail.com firefox@1QQ.com } notification_email_from kanotify@magedu.com smtp_connect_timeout 3 smtp_server 127.0.0.1 router_id LVS_DEVEL } vrrp_script chk_schedown { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 2 weight -2 } vrrp_instance VI_1 { interface eth0 state MASTER priority 99 virtual_router_id 51 garp_master_delay 1 authentication { auth_type PASS auth_pass password } track_interface { eth0 } virtual_ipaddress { 172.16.249.100/16 dev eth0 label eth0:0 } track_script { chk_schedown } } vrrp_instance VI_2 { interface eth0 state MASTER priority 101 virtual_router_id 52 garp_master_delay 1 authentication { auth_type PASS auth_pass password } track_interface { eth0 } virtual_ipaddress { 172.16.249.200/16 dev eth0 label eth0:1 } track_script { chk_schedown } } virtual_server 172.16.249.100 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP # sorry_server 172.16.249.100 1358 virtual_server 172.16.249.200 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP sorry_server 172.16.249.200 1358 real_server 172.16.249.75 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.249.32 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.249.33 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.249.34 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.249.35 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.249.36 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
realserver configure file:
# cat realserver.sh #!/bin/bash # # Script to start LVS DR real server. # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=172.16.249.100
host=`/bin/hostname` case "$1" in start) # Start LVS-DR real server on this machine. /sbin/ifconfig lo down /sbin/ifconfig lo up echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 ;; stop) # Stop LVS-DR real server loopback device(s). /sbin/ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $VIP` isrothere=`netstat -rn | grep "lo:0" | grep $VIP` if [ ! "$islothere" -o ! "isrothere" ];then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR real server Running." fi ;; *) # Invalid entry. echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac
右邊三台NGINX :realserver configure file: # cat realserver.sh #!/bin/bash # # Script to start LVS DR real server. # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=172.16.249.200 host=`/bin/hostname` case "$1" in start) # Start LVS-DR real server on this machine. /sbin/ifconfig lo down /sbin/ifconfig lo up echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 ;; stop) # Stop LVS-DR real server loopback device(s). /sbin/ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $VIP` isrothere=`netstat -rn | grep "lo:0" | grep $VIP` if [ ! "$islothere" -o ! "isrothere" ];then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR real server Running." fi ;; *) # Invalid entry. echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac
其它配置請看 下回分解;