这次要做的是在LNMP平台上的LB集群,实现将MySQL服务独立出来,然后由两个realserver提供web服务。

说明:

DirectorVIP 172.16.7.10

                DIP 172.16.7.1

Realserver1: 172.16.7.100

Realserver2:172.16.7.200

MySQL:172.16.7.110

lvs-DR  IP路由

一、首先将两个realserver上的LNMP平台搭建好。

realserver1 为例,进行平台的搭建。

1、解决依赖关系

编译安装nginx需要事先需要安装开发包组"Development Tools"和 "Development Libraries"。同时,还需要专门安装pcre-devel包:

# yum -y install pcre-devel

2、安装

首先添加用户nginx,实现以之运行nginx服务进程:

 
  
  1. # groupadd -r nginx 
  2. # useradd -r -g nginx -s /bin/false -M nginx 

接着开始编译和安装:

 

 
  
  1. # ./configure \ 
  2.   --prefix=/usr \ 
  3.   --sbin-path=/usr/sbin/nginx \ 
  4.   --conf-path=/etc/nginx/nginx..conf \ 
  5.   --error-log-path=/var/log/nginx/error.log \ 
  6.   --http-log-path=/var/log/nginx/access.log \ 
  7.   --pid-path=/var/run/nginx/nginx.pid  \ 
  8.   --lock-path=/var/lock/nginx.lock \ 
  9.   --user=nginx \ 
  10.   --group=nginx \ 
  11.   --with-http_ssl_module \ 
  12.   --with-http_flv_module \ 
  13.   --with-http_stub_status_module \ 
  14.   --with-http_gzip_static_module \ 
  15.   --http-client-body-temp-path=/var/tmp/nginx/client/ \ 
  16.   --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ 
  17.   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ 
  18.   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ 
  19.   --http-scgi-temp-path=/var/tmp/nginx/scgi \ 
  20.   --with-pcre 
  21. # make && make install 

3、为nginx提供SysV init脚本:

新建文件/etc/rc.d/init.d/nginx,内容如下:

 

 
  
  1. #!/bin/sh 
  2. # nginx - this script starts and stops the nginx daemon 
  3. # chkconfig:   - 85 15  
  4. # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \ 
  5. #               proxy and IMAP/POP3 proxy server 
  6. # processname: nginx 
  7. # config:      /etc/nginx/nginx.conf 
  8. # config:      /etc/sysconfig/nginx 
  9. # pidfile:     /var/run/nginx.pid 
  10.   
  11. # Source function library. 
  12. . /etc/rc.d/init.d/functions 
  13.   
  14. # Source networking configuration. 
  15. . /etc/sysconfig/network 
  16.   
  17. # Check that networking is up. 
  18. [ "$NETWORKING" = "no" ] && exit 0 
  19.   
  20. nginx="/usr/sbin/nginx" 
  21. prog=$(basename $nginx) 
  22.   
  23. NGINX_CONF_FILE="/etc/nginx/nginx.conf" 
  24.   
  25. [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx 
  26.   
  27. lockfile=/var/lock/subsys/nginx 
  28.   
  29. make_dirs() { 
  30.    # make required directories 
  31.    user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` 
  32.    options=`$nginx -V 2>&1 | grep 'configure arguments:'` 
  33.    for opt in $options; do 
  34.        if [ `echo $opt | grep '.*-temp-path'` ]; then 
  35.            value=`echo $opt | cut -d "=" -f 2` 
  36.            if [ ! -d "$value" ]; then 
  37.                # echo "creating" $value 
  38.                mkdir -p $value && chown -R $user $value 
  39.            fi 
  40.        fi 
  41.    done 
  42.   
  43. start() { 
  44.     [ -x $nginx ] || exit 5 
  45.     [ -f $NGINX_CONF_FILE ] || exit 6 
  46.     make_dirs 
  47.     echo -n $"Starting $prog: " 
  48.     daemon $nginx -c $NGINX_CONF_FILE 
  49.     retval=$? 
  50.     echo 
  51.     [ $retval -eq 0 ] && touch $lockfile 
  52.     return $retval 
  53.   
  54. stop() { 
  55.     echo -n $"Stopping $prog: " 
  56.     killproc $prog -QUIT 
  57.     retval=$? 
  58.     echo 
  59.     [ $retval -eq 0 ] && rm -f $lockfile 
  60.     return $retval 
  61.   
  62. restart() { 
  63.     configtest || return $? 
  64.     stop 
  65.     sleep 1 
  66.     start 
  67.   
  68. reload() { 
  69.     configtest || return $? 
  70.     echo -n $"Reloading $prog: " 
  71.     killproc $nginx -HUP 
  72.     RETVAL=$? 
  73.     echo 
  74.   
  75. force_reload() { 
  76.     restart 
  77.   
  78. configtest() { 
  79.   $nginx -t -c $NGINX_CONF_FILE 
  80.   
  81. rh_status() { 
  82.     status $prog 
  83.   
  84. rh_status_q() { 
  85.     rh_status >/dev/null 2>&1 
  86.   
  87. case "$1" in 
  88.     start) 
  89.         rh_status_q && exit 0 
  90.         $1 
  91.         ;; 
  92.     stop) 
  93.         rh_status_q || exit 0 
  94.         $1 
  95.         ;; 
  96.     restart|configtest) 
  97.         $1 
  98.         ;; 
  99.     reload) 
  100.         rh_status_q || exit 7 
  101.         $1 
  102.         ;; 
  103.     force-reload) 
  104.         force_reload 
  105.         ;; 
  106.     status) 
  107.         rh_status 
  108.         ;; 
  109.     condrestart|try-restart) 
  110.         rh_status_q || exit 0 
  111.             ;; 
  112.     *) 
  113.         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" 
  114.         exit 2 
  115. esac 

而后为此脚本赋予执行权限:

 
  
  1. # chmod +x /etc/rc.d/init.d/nginx 

添加至服务管理列表,并让其开机自动启动:

 

 
  
  1. # chkconfig --add nginx 
  2. # chkconfig nginx on 

而后就可以启动服务并测试了:

 

 
  
  1. # service nginx start 

安装mysql-5.5.20

1、准备数据存放的文件系统

新建一个逻辑卷,并将其挂载至特定目录即可。这里不再给出过程。

这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录。

参考我下面给出的脚本:

 

 
  
  1. #!/bin/bash 
  2.  
  3. lc='/usr/sbin/lvcreate' 
  4. lr='/usr/sbin/lvremove' 
  5. pc='/usr/sbin/pvcreate' 
  6. vc='/usr/sbin/vgcreate' 
  7. echo ' 
  8.  
  9.  
  10.  
  11. +1G 
  12.  
  13. +1G 
  14. 8e 
  15. 8e 
  16. w' | fdisk /dev/sda >/dev/null 2>&1 
  17.  
  18. partprobe /dev/sda 
  19. sleep 3 
  20. mkdir -pv /mydata/data 
  21. $pc /dev/sda5 /dev/sda6 
  22. $vc myvg /dev/sda5 /dev/sda6 
  23. $lc -L 1G -n mylv1 myvg 
  24. mke2fs -j /dev/myvg/mylv1 
  25. mount /dev/myvg/mylv1 /mydata 
  26. echo "mount success..." 
  27. sleep 3 

2、新建用户以安全方式运行进程:

 
  
  1. # groupadd -r mysql 
  2. # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql 
  3. # chown -R mysql:mysql /mydata/data 

3、安装并初始化mysql-5.5.20

首先下载平台对应的mysql版本至本地,这里是32位平台,因此,选择的为mysql-5.5.20-linux2.6-i686.tar.gz,其下载位置为我们学习用的ftp://172.16.0.1/pub/Sources/mysql-5.5

 

 
  
  1. # tar xf mysql-5.5.20-linux2.6-i686.tar.gz -C /usr/local 
  2. # cd /usr/local/ 
  3. # ln -sv mysql-5.5.20-linux2.6-i686  mysql 
  4. # cd mysql  
  5.  
  6. # chown -R mysql:mysql  . 
  7. # scripts/mysql_install_db --user=mysql --datadir=/mydata/data 
  8. # chown -R root  . 

4、为mysql提供主配置文件:

# cd /usr/local/mysql

# cp support-files/my-large.cnf  /etc/my.cnf

并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行:

thread_concurrency = 2

另外还需要添加如下行指定mysql数据文件的存放位置:

datadir = /mydata/data

5、为mysql提供sysv服务脚本:

 

 
  
  1. # cd /usr/local/mysql 
  2. # cp support-files/mysql.server  /etc/rc.d/init.d/mysqld 

添加至服务列表:

# chkconfig --add mysqld

# chkconfig mysqld on

而后就可以启动服务测试使用了。

编译安装php-5.3.10

1、解决依赖关系:

请配置好yum源(可以是本地系统光盘)后执行如下命令:

# yum -y groupinstall "X Software Development" 

如果想让编译的php支持mcryptmcryptmhash扩展和libevent,此处还需要下载ftp://172.16.0.1/pub/Sources/ngnix目录中的如下几个rpm包并安装之:

libmcrypt-2.5.8-4.el5.centos.i386.rpm

libmcrypt-devel-2.5.8-4.el5.centos.i386.rpm

mhash-0.9.9-1.el5.centos.i386.rpm

mhash-devel-0.9.9-1.el5.centos.i386.rpm

libevent-2.0.17-2.i386.rpm

libevent-devel-2.0.17-2.i386.rpm

mcrypt-2.6.8-1.el5.i386.rpm

最好使用升级的方式安装上面的rpm包,命令格式如下:

# rpm -Uvh 

2、编译安装php-5.3.10

首先下载源码包至本地目录。

 

 
  
  1. # tar xf php-5.3.10.tar.bz2 
  2. # cd php-5.3.10 
  3. #  ./configure --prefix=/usr/local/php4nginx --with-mysql=/usr/local/mysql \ 
  4.  --with-openssl --enable-fpm --enable-sockets --enable-sysvshm \ 
  5.   --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring \ 
  6.    --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir \ 
  7.    --with-libxml-dir=/usr --enable-xml  --with-mhash --with-mcrypt \ 
  8.     --with-config-file-path=/etc/php --with-config-file-scan-dir=/etc/php \ 
  9.      --with-bz2 --with-curl --with-mcrypt 
  10. # make

    # make test

    # make install

php提供配置文件:

# cp php.ini-production /etc/php/php.ini

php-fpm提供Sysv init脚本,并将其添加至服务列表:

# cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm

# chkconfig --add php-fpm

# chkconfig php-fpm on

php-fpm提供配置文件:

# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf 

编辑php-fpm的配置文件:

# vim /usr/local/php/etc/php-fpm.conf

配置pm.的相关选项为你所需要的值,并启用pid文件(如下最后一行):

pm.max_children = 50

pm.start_servers = 5

pm.min_spare_servers = 2

pm.max_spare_servers = 8

pid = /var/run/php-fpm.pid 

接下来就可以启动php-fpm了:

# service php-fpm start

使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):

# ps aux | grep php-fpm

整合nginxphp5

1、编辑/etc/nginx/nginx.conf,启用如下选项:

 

 
  
  1. location ~ \.php$ { 
  2.             root           html; 
  3.             fastcgi_pass   127.0.0.1:9000; 
  4.             fastcgi_index  index.php; 
  5.             fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; 
  6.             include        fastcgi_params; 
  7.         } 

2、编辑/etc/nginx/fastcgi_params,将其内容更改为如下内容:

 

 
  
  1. fastcgi_param  GATEWAY_INTERFACE  CGI/1.1; 
  2. fastcgi_param  SERVER_SOFTWARE    nginx; 
  3. fastcgi_param  QUERY_STRING       $query_string; 
  4. fastcgi_param  REQUEST_METHOD     $request_method; 
  5. fastcgi_param  CONTENT_TYPE       $content_type; 
  6. fastcgi_param  CONTENT_LENGTH     $content_length; 
  7. fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name; 
  8. fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; 
  9. fastcgi_param  REQUEST_URI        $request_uri; 
  10. fastcgi_param  DOCUMENT_URI       $document_uri; 
  11. fastcgi_param  DOCUMENT_ROOT      $document_root; 
  12. fastcgi_param  SERVER_PROTOCOL    $server_protocol; 
  13. fastcgi_param  REMOTE_ADDR        $remote_addr; 
  14. fastcgi_param  REMOTE_PORT        $remote_port; 
  15. fastcgi_param  SERVER_ADDR        $server_addr; 
  16. fastcgi_param  SERVER_PORT        $server_port; 
  17. fastcgi_param  SERVER_NAME        $server_name; 
  18.  
  19. 并在所支持的主页面格式中添加php格式的主页,类似如下: 
  20. location / { 
  21.             root   html; 
  22.             index  index.php index.html index.htm; 
  23.         } 
  24.          
  25. 而后重新载入nginx的配置文件: 
  26. # service nginx reload 

3、在/usr/html新建index.php的测试页面,测试php是否能正常工作:

# cat > /usr/html/index.php << EOF

<?php

phpinfo();

?>

接着就可以通过浏览器访问此测试页面了。

 

二、由于realserver的配置基本相同,可以采取以上步骤重做一次,也可以克隆一个realserver1,起名叫做realserver2,然后修改一下IP地址即可。

在这里不再重复步骤。

三、两个平台搭建好之后,接下来便要配置装在pmaphpMyAdmin)了。

On 172.16.7.100

php的官方网站下载phpMyAdmin并配置即可,而我们学习则是在自己的ftp目录下载。

文件包名字为:phpMyAdmin-3.4.10.1-all-languages.tar.bz2

 
  
  1. # mkdir /www/pma -pv 
  2. # tar xvf phpMyAdmin-3.4.10.1-all-languages.tar.bz2 
  3. # mv phpMyAdmin-3.4.10.1-all-languages /www/pma 
  4. # mysqladmin -uroot -hlocalhost -p password'123456' 
  5. # cd /www/pma 
  6. # cp config.sample.inc.php config.inc.php 
  7. # vim config.inc.php 

然后 输入网址:http://172.16.7.100 查看网页。如图

On 172.16.7.200

具体的配置与172.16.7.1一致,所以过程不再详述。

输入网址: http://172.16.7.200   测试一下是否成功。

 

然后 要将phpMyAdminlocalhost 指向172.16.7.110;在此之前 的先配置好172.16.7.110mysql服务。

三、on 172.16.7.110

1、准备数据存放的文件系统

新建一个逻辑卷,并将其挂载至特定目录即可。这里不再给出过程。可参考下面我个icu的脚本:

 

 
  
  1. #!/bin/bash 
  2.  
  3. lc='/usr/sbin/lvcreate' 
  4. lr='/usr/sbin/lvremove' 
  5. pc='/usr/sbin/pvcreate' 
  6. vc='/usr/sbin/vgcreate' 
  7. echo ' 
  8.  
  9.  
  10.  
  11. +1G 
  12.  
  13. +1G 
  14. 8e 
  15. 8e 
  16. w' | fdisk /dev/sda >/dev/null 2>&1 
  17.  
  18. partprobe /dev/sda 
  19. sleep 3 
  20. mkdir -pv /mydata/data 
  21. $pc /dev/sda5 /dev/sda6 > /dev/null 2>&1 
  22. $vc myvg /dev/sda5 /dev/sda6  > /dev/null 2>&1 
  23. $lc -L 1G -n mylv1 myvg  > /dev/null 2>&1 
  24. mke2fs -j /dev/myvg/mylv1  >/dev/null 2>&1 
  25. mount /dev/myvg/mylv1 /mydata 
  26. echo "mount success..." 
  27. sleep 3 

其步骤如上LNMP平台安装mysql一样,不再详述。至此,mysql服务就启动并且已配置完成了。然后新建一个用户 如 ling:

 

建好用户后可用此用户来管理mysql服务器。

五、创建关系,使两个realservermysql服务器可以连接,让他们知道mysql服务器在哪里,从而可到达共享的目的。

On 172.16.7.100

# vim /www/pma/config.inc.php

$cfg['Servers'][$i]['host'] = 'localhost'; 改为$cfg['Servers'][$i]['host'] = '172.16.7.110';

mysql服务器上的用户ling登录试试:

 

On 172.16.7.200

大致配置与上同,在此直接贴图描述:

(注: 我的phpMyAdmin装的版本不一致,不过没有大碍,因为我不是克隆的,自己一点一点弄的哦…………)

五、realserver上配置环境,根据我们自己的需要。

On 172.16.7.100

# ifconfig lo down    #lo接口先关闭,因为我们要将VIP配置在lo接口的网卡别名上。

# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore  

# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 

这两句是接口只响应目标地址和请求进来的地址在同一网段内的请求。

# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 

# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

 这两句是配置内核的arp协议栈,只给同一网络内的主机转发arp请求。

# ifconfig lo up

# ifconfig lo:0 172.16.7.10 broadcast 172.16.7.10 netmask 255..255.255.255 up

# route add -host 172.16.7.10 dev lo:0

On 172.16.7.200

配置如上,没有任何不同的地方。

七、到了最关键的时刻了,我们要配置负载均衡集群了,该Director这个老大出马了,嘻嘻。

1、我们现在做的是LVSDR(直接路由类型)的WLC调度。

所以Director的网卡是桥接的,realserver也得是桥接的。

On 172.16.7.1

# ifconfig eth0:1 172.16.7.10 broadcast 172.16.7.10 netmask 255.255.255.255 up (只给自己家的IP做广播)

# route add -host 172.16.7.10 dev eth0:1     添加主机路由

# sysctl -w net.ipv4.ip_forward=1      # 打开转发功能

# yum -y install ipvsadm

# rpm -ql ipvsadm 

# ipvsadm -A -t 172.16.7.10:80 -s rr

# ipvsadm -a -t 172.16.7.10:80 -r 172.1.6.7.100:80 -g

# ipvsadm -a -t 172.16.7.10:80 -r 172.16.7.200 :80-g

至此,所有准备工作已经完成,配置也结束了,接下来看看效果,可以在浏览器里输入VIP的地址即可。

终于做完了,很不容易啊。这次我终于记得住了,每做一次,就增加一些记忆。