基于LVS負載均衡的高性能Web站點設計與實現
1、部署環境架構設計
隨著Web站點訪問量的不斷提高,Web服務器處理請求的壓力將會日益增大,進而影響到Web站點的性能。當單臺Web服務器所能承受的壓力到達極限時, 就需要有更多的服務器來分擔工作,將流量合理轉移到更多的服務器上。本文主要介紹通過LVS來組建服務器集群,同時配置反向代理服務器實現Web頁面的動 靜分離,以滿足高并發、高可用的生產環境要求。
機器清單列表:
兩臺LVS服務器,兩臺反向代理服務器,兩臺靜態內容緩存服務器,兩臺動態請求處理服務器,具體用途說明詳見下表。
組件 |
IP地址 |
用途 | </tr>||||||||||||||||||||||||||||||||||||
虛擬Web服務器 | 192.168.85.10 | 虛擬IP,高性能Web站點的訪問入口 | </tr>||||||||||||||||||||||||||||||||||||
Master主服務器 |
192.168.85.80 |
均衡調度Web請求 |
</tr>
||||||||||||||||||||||||||||||||||||
Backup備份服務器 |
192.168.85.81 |
雙機熱備,保證LVS的可用性和穩定性 |
</tr>
||||||||||||||||||||||||||||||||||||
Nginx |
192.168.85.90 |
zone A的反向代理,記錄接入訪問操作 |
</tr>
||||||||||||||||||||||||||||||||||||
Nginx |
192.168.85.95 |
zone B的反向代理,記錄接入訪問操作 |
</tr>
||||||||||||||||||||||||||||||||||||
Varnish + Apache |
192.168.85.91 |
緩存zone A的靜態頁面 |
</tr>
||||||||||||||||||||||||||||||||||||
Varnish + Apache |
192.168.85.96 |
緩存zone B的靜態頁面 |
</tr>
||||||||||||||||||||||||||||||||||||
Apache + PHP-FPM |
192.168.85.93 |
處理zone A的動態請求和跳轉規則 |
</tr>
||||||||||||||||||||||||||||||||||||
Apache + PHP-FPM |
192.168.85.97 |
處理zone B的動態請求和跳轉規則 | </tr> </tbody> </table>
… top_dir = /usr/lib64/httpd … |
# make
# make install
4. 加載模塊
# vim /etc/httpd/conf/httpd.conf
找到LoadModule部分,添加一行加載語句
... LoadModule fastcgi_module modules/mod_fastcgi.so ... |
5. 重啟服務
# /etc/init.d/httpd restart
如果能正常啟動,則log里面將顯示以下信息
# grep -i "FastCGI" /var/log/httpd/error_log
[Mon Jul 29 06:54:27 2013] [notice] FastCGI: process manager initialized (pid 2098)
[Mon Jul 29 06:54:27 2013] [notice] Apache/2.2.15 (Unix) DAV/2 mod_fastcgi/2.4.6 configured -- resuming normal operations
6. 安裝PHP-FPM(FastCGI進程管理器)
PHP-FPM(FastCGI 進程管理器)用于替換 PHP FastCGI 的大部分附加功能,對于高負載網站是非常有用的。
# yum install php-fpm
# /etc/init.d/php-fpm start
# chkconfig php-fpm on
# netstat -anp |grep php
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 2575/php-fpm
unix 3 [ ] STREAM CONNECTED 25812 2575/php-fpm
unix 3 [ ] STREAM CONNECTED 25811 2575/php-fpm
7. 修改配置
新建一個配置文件/etc/httpd/conf.d/fastcgi.php.conf
DirectoryIndex index.html index.shtml index.cgi index.php AddHandler php5-fcgi .php Action php5-fcgi /php5-fcgi Alias /php5-fcgi /var/www/cgi-bin/php5-fcgi FastCgiExternalServer /var/www/cgi-bin/php5-fcgi -idle-timeout 60 -host 127.0.0.1:9000 -pass-header Authorization |
重啟Apache和PHP-FPM:
# service httpd restart
# service php-fpm restart
2.2 Varnish與Apache
192.168.85.91
192.168.85.96
1. 安裝repo源及軟件
# rpm --nosignature -i http://repo.varnish-cache.org/redhat/varnish-3.0/el6/noarch/varnish-\
release-3.0-1.el6.noarch.rpm
# yum install varnish
# yum install httpd
2. 修改配置文件
(1) Apache的默認服務端口更改為8080
… #Listen 12.34.56.78:80 Listen 8080 … |
啟動Apache服務:
# service httpd start
# vim /etc/varnish/default.vcl
backend default { .host = "127.0.0.1"; .port = "8080"; } |
3. 啟動Varnish
# varnishd -f /etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:80
其中,-f指定的是Varnish配置文件位置,-s指定分配的緩存空間大小,-T為Varnish管理接口的監聽地址,-a指定對外接收HTTP請求的監聽地址。
2.3 Nginx反向代理
192.168.85.90
192.168.85.95
1. 安裝repo源及軟件
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install nginx
2. 修改配置文件
主配置文件/etc/nginx/nginx.conf無需做太大改動,只需將worker_processes設置成與機器CPU核數相等即可(如CPU數為1,則worker_processes 1;),以zone A為例:
# vim /etc/nginx/conf.d/virtual.conf
upstream backend { server 192.168.85.90; } server { listen 80; server_name 192.168.85.91; # 靜態緩存 location / { proxy_pass http://backend; } # 動態請求 location ~ \.(php)?$ { 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_pass http:// 192.168.85.93; } } |
3. 啟動nginx服務
# service nginx start
2.4 LVS負載均衡
192.168.85.80
192.168.85.81
LVS有四種常見的工作模式:NAT、DR、TUNNEL、FNAT。本文選用的工作模式為DR(Direct Route),負載均衡器接收用戶的請求,然后根據負載均衡算法選取一臺realserver,將包轉發過去,最后由realserver直接回復給用戶。
1. 下載所需軟件
#cd /opt/
# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
# wget http://www.keepalived.org/software/keepalived-1.1.18.tar.gz
# yum install -y openssl openssl-devel* popt*
2. 安裝ipvsadm(master和backup都需要安裝)
首先,建立內核快捷方式
# ln -s /usr/src/kernels/2.6.32-358.14.1.el6.x86_64/ /usr/src/linux
如果沒有找到相關路徑或文件,則需要手動安裝內核
# yum -y install kernel-devel
然后,解壓并編譯ipvsadm
# cd /opt/
# tar zxvf ipvsadm-1.24.tar.gz
# cd ipvsadm-1.24
# make
# make install
接下來,測試ipvsadm是否安裝成功
# /sbin/ipvsadm –v
ipvsadm v1.24 2005/12/10 (compiled with getopt_long and IPVS v1.2.1)
顯示上述信息則表示安裝成功。
3. 安裝keepalived(master和backup都需要安裝)
# cd /opt/
# tar zxvf keepalived-1.1.18.tar.gz
# cd keepalived-1.1.18
# ./configure --prefix=/usr/local/keepalived
# make
# make install
# cd /usr/local/keepalived/
# cp etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
# cp etc/sysconfig/keepalived /etc/sysconfig/
# mkdir /etc/keepalived
# cp etc/keepalived/keepalived.conf /etc/keepalived/
# cp sbin/keepalived /usr/sbin/
啟動keepalived
# service keepalived start
4. 修改master和backup的配置文件
首先,開啟ip_forward轉發功能
# sysctl -w net.ipv4.ip_forward=1
然后,配置keepalived.conf文件
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER # 備份服務器上將MASTER改為BACKUP interface eth0 # HA監測網絡接口 virtual_router_id 51 # 主、備機的virtual_router_id必須相同 priority 30 # 主、備機取不同的優先級,主機值較大,備份機值較小 advert_int 1 # VRRP Multicast廣播周期秒數 authentication { auth_type PASS # VRRP認證方式 auth_pass 1111 # VRRP口令字 } virtual_ipaddress { 192.168.85.10 # 如果有多個VIP,繼續換行填寫 } } virtual_server 192.168.85.10 80 { delay_loop 2 # 每隔2秒查詢realserver狀態 lb_algo rr # lvs 算法 lb_kind DR # Direct Route persistence_timeout 50 # 同一IP的連接50秒內被分配到同一臺realserver |
BACKUP服務器同上配置,先安裝lvs再按裝keepalived,仍后配置/etc/keepalived/keepalived.conf,只需將紅色標示的部分改一下即可。 5. 配置VIP
# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0 IPADDR=192.168.85.10 NETMASK=255.255.255.255 ONBOOT=yes NAME=loopback |
添加負載均衡器
# /sbin/ipvsadm -A -t 192.168.85.10:80 -s rr
增加realserver
# /sbin/ipvsadm -a -t 192.168.85.10:80 -r 192.168.85.90:80 -g # 192.168.85.90是真實機的ip
# /sbin/ipvsadm -a -t 192.168.85.10:80 -r 192.168.85.95:80 -g # 192.168.85.95是真實機的ip
# route add -host 192.168.85.10 dev lo:0
7.配置realserver(所有的Proxy Server都要設置好)
配置vip地址
# /sbin/ifconfig lo:0 192.168.85.10 netmask 255.255.255.255 broadcast 192.168.85.10 up
# route add -host 192.168.85.10 dev lo:0
3、環境測試
3.1 Apache與PHP-FPM
創建phpinfo頁面,查看詳細配置信息。# echo "<?php phpinfo(); ?>" > /var/www/html/info.php
瀏覽器中訪問http://192.168.85.93/info.php,顯示頁面如下。

Server API顯示為通過FPM提供服務,使用FastCGI協議傳遞請求,配置成功。
3.2 Varnish與Apache
輸入varnishstat指令查看varnish運行情況,最重要的是 cache_hit 和 cache_miss 這兩行。如果沒有任何命中,cache_hits 不會顯示。當越來越多的請求進來,計數器會不斷更新以反應新的命中數和未命中數。
另外,常用的還有varnishlog指令,當中有很多的選項可以在查詢時使用。因此,強烈推薦在排錯或測試時使用varnishlog。可以閱讀varnish的man page來查看這個命令的詳細使用情況。下面是一些使用的例子。
顯示varnish和客戶端之間的通信(忽略后端web服務器): # varnishlog -b 顯示varnish接收到的HTTP頭信息(既有客戶端請求的,也有web服務器響應的): # varnishlog -c -i RxHeader 只顯示web服務器響應的頭信息: # varnishlog -Dw /var/log/varnish.log 從/var/log/varnish.log中讀取所有日志信息 # kill `cat /var/run/varnish.pid` 這個命令會從/var/run/varnish.pid中讀取varnish的主進程的PID,并給這個進程發送TERM信號,從而關閉varnish。 |
3.3 Nginx
通過分別訪問靜態頁面(.html)和動態頁面(.php),測試動靜分離是否生效,以zone A為例:訪問靜態頁面:
# curl –I http://192.168.85.90/index.html
HTTP/1.1 200 OK Server: nginx/1.0.15 Date: Tue, 30 Jul 2013 05:58:21 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive Last-Modified: Sun, 28 Jul 2013 19:30:16 GMT ETag: "bff82-16-4e29767d7c8be" Content-Length: 22 Accept-Ranges: bytes X-Varnish: 810334599 Age: 0 Via: 1.1 varnish |
訪問動態頁面:
# curl –I http://192.168.85.90/info.php
HTTP/1.1 200 OK Server: nginx/1.0.15 Date: Tue, 30 Jul 2013 06:00:23 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/5.3.3 |
3.4 LVS負載均衡
Zone A:192.168.85.91
# echo " This is zone A! " > /var/www/html/index.html
Zone B:192.168.85.96
# echo " This is zone B! " > /var/www/html/index.html
在master機器上查看負載均衡器的運行狀況:
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.85.10:80 rr persistent 50
-> 192.168.85.90:80 Route 40 0 0
-> 192.168.85.95:80 Route 1 0 0
訪問Web站點,從瀏覽器頁面可知,訪問請求跳轉到了zone A

(注意清空瀏覽器緩存)
