第一章 简单模型实现

一、规划

DNS负载均衡1

二、环境准备

(一)DNS服务器

IP:172.16.23.135。这一台服务器被配置成为转发服务器,它负责解析www.test.com为172.16.23.132和172.16.23.133两个地址,其它解析转发给网络服务提供商的DNS地址,这里选用114.114.114.114。

安装BIND,并配置。# yum -y install bind bind-utils

BIND的安装和配置,请看博主博文《DNS服务及基于BIND的实现》。

编辑主配置文件和区域文件

# vim /etc/named.conf
 
//    
// named.conf     
//
options {    
    directory     "/var/named";     
//    recursion yes;     
    forward only;        
    forwarders { 114.114.114.114; };     
};
 
zone "." IN {    
    type hint;     
    file "named.ca";     
};
 
include "/etc/named.rfc1912.zones";
 
 
 
# vim /etc/named.rfc1912.zones
 
zone "test.com" IN {    
        type master;     
        file "test.com.zfile";     
        allow-update { 127.0.0.1; };     
        allow-transfer { 127.0.0.1; };     
}; 
 
[root@localhost ~]# cd /var/named/
[root@localhost named]# vim test.com.zfile
[root@localhost named]# cat test.com.zfile    
$TTL 3600
 
@    IN    SOA    ns1    webadmin (    
        2014081601     
        1D     
        1H     
        1W     
        3600)
 
    IN    NS    ns1    
    IN    MX 10    mail
 
ns1    IN    A    172.16.0.10    
mail    IN    A    172.16.0.15
 
www    IN    A    172.16.23.132    
www    IN    A    172.16.23.133
 
[root@localhost named]# named-checkzone "test.com" test.com.zfile    
zone test.com/IN: loaded serial 2014081601     
OK

 

启动服务开始测试

[root@localhost named]# dig -t A www.test.com
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A www.test.com    
;; global options: +cmd     
;; Got answer:     
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36091     
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:    
;www.test.com.            IN    A
 
;; ANSWER SECTION:    
www.test.com.        3418    IN    CNAME    test.blockdos.com.     
test.blockdos.com.    118    IN    A    208.64.121.188
 
;; Query time: 39 msec    
;; SERVER: 172.16.0.1#53(172.16.0.1)     
;; WHEN: Sat Aug 16 22:14:53 2014     
;; MSG SIZE  rcvd: 74
 
[root@localhost named]# dig -t A www.test.com @127.0.0.1
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A www.test.com @127.0.0.1    
;; global options: +cmd     
;; Got answer:     
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43764     
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1
 
;; QUESTION SECTION:    
;www.test.com.            IN    A
 
;; ANSWER SECTION:    
www.test.com.        3600    IN    A    172.16.23.132     
www.test.com.        3600    IN    A    172.16.23.133
 
;; AUTHORITY SECTION:    
test.com.        3600    IN    NS    ns1.test.com.
 
;; ADDITIONAL SECTION:    
ns1.test.com.        3600    IN    A    172.16.0.10
 
;; Query time: 2 msec    
;; SERVER: 127.0.0.1#53(127.0.0.1)     
;; WHEN: Sat Aug 16 22:15:05 2014     
;; MSG SIZE  rcvd: 96
 
[root@localhost named]# dig -t A www.test.com @127.0.0.1
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A www.test.com @127.0.0.1    
;; global options: +cmd     
;; Got answer:     
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38708     
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1
 
;; QUESTION SECTION:    
;www.test.com.            IN    A
 
;; ANSWER SECTION:    
www.test.com.        3600    IN    A    172.16.23.133     
www.test.com.        3600    IN    A    172.16.23.132
 
;; AUTHORITY SECTION:    
test.com.        3600    IN    NS    ns1.test.com.
 
;; ADDITIONAL SECTION:    
ns1.test.com.        3600    IN    A    172.16.0.10
 
;; Query time: 2 msec    
;; SERVER: 127.0.0.1#53(127.0.0.1)     
;; WHEN: Sat Aug 16 22:15:53 2014     
;; MSG SIZE  rcvd: 96

 

说明:

可以看出,当指向DNS服务器172.16.23.135即本机的时候,返回aa即权威解答,同时注意解析的www服务器地址的顺序在变。

默认DNS工作在round-robin轮询模式。

可以考虑使用windows 的nslookup来查询

 

(二)WEB服务器1

关于WEB服务器的安装,请看博主博文《LAMP的几种简单实现及drupal、WordPress、phpMyAdmin部署》。这里不再赘述。

[root@localhost ~]# yum -y install httpd httpd-tools

默认站点根目录是/var/www/html

在其中增加页面index.html。

内容如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>测试页</title>
</head>
<body>
<hr />
<h1>Welcom to HTML World! 172.16.23.132 </h1>
<hr />
</body>
</html>

 

(三)WEB服务器2

方法同上,修改index.html的内容为

<h1>Welcom to HTML World! 172.16.23.133 </h1>

WEB静态测试

 

(四)NFS服务器

服务器端172.16.23.134

# yum install nfs-utils
# rpm -ql nfs-utils
/etc/nfsmount.conf    
/etc/rc.d/init.d/nfs     
/etc/rc.d/init.d/nfslock     
/etc/rc.d/init.d/rpcgssd     
/etc/rc.d/init.d/rpcidmapd     
/etc/rc.d/init.d/rpcsvcgssd     
/etc/request-key.d/id_resolver.conf     
/etc/sysconfig/nfs     
/sbin/mount.nfs     
/sbin/mount.nfs4     
/sbin/nfs_cache_getent     
/sbin/rpc.statd     
/sbin/umount.nfs     
/sbin/umount.nfs4     
/usr/sbin/exportfs     
/usr/sbin/mountstats     
/usr/sbin/nfsidmap     
/usr/sbin/nfsiostat     
/usr/sbin/nfsstat     
/usr/sbin/rpc.gssd     
/usr/sbin/rpc.idmapd     
/usr/sbin/rpc.mountd     
/usr/sbin/rpc.nfsd     
/usr/sbin/rpc.svcgssd     
/usr/sbin/rpcdebug     
/usr/sbin/showmount     
/usr/sbin/sm-notify     
/usr/sbin/start-statd
 
……
 
安装完nfs,如果rpcbind没有启动,建议重启系统,重启后使用# netstat -utnlp,查看rpcbind是否启动。
 
[root@localhost ~]# netstat -utnlp    
Active Internet connections (only servers)     
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      967/rpcbind         
tcp        0      0 0.0.0.0:33042               0.0.0.0:*                   LISTEN      1007/rpc.statd      
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1063/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1139/master         
tcp        0      0 :::111                      :::*                        LISTEN      967/rpcbind         
tcp        0      0 :::53875                    :::*                        LISTEN      1007/rpc.statd      
tcp        0      0 :::22                       :::*                        LISTEN      1063/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1139/master         
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               967/rpcbind         
udp        0      0 0.0.0.0:759                 0.0.0.0:*                               1007/rpc.statd      
udp        0      0 0.0.0.0:718                 0.0.0.0:*                               967/rpcbind         
udp        0      0 0.0.0.0:58601               0.0.0.0:*                               1007/rpc.statd      
udp        0      0 :::111                      :::*                                    967/rpcbind         
udp        0      0 :::58770                    :::*                                    1007/rpc.statd      
udp        0      0 :::718                      :::*                                    967/rpcbind         
[root@localhost ~]# service nfs start     
启动 NFS 服务:                                            [确定]     
启动 NFS mountd:                                          [确定]     
启动 NFS 守护进程:                                        [确定]     
正在启动 RPC idmapd:                                      [确定]
 
[root@localhost ~]# mkdir /public/
[root@localhost ~]# useradd -M -u 5000 nfs    
[root@localhost ~]# id nfs     
uid=5000(nfs) gid=5000(nfs) 组=5000(nfs)     
[root@localhost ~]# chown nfs:nfs /public/     
[root@localhost ~]# ll /public/ -d     
drwxr-xr-x. 2 nfs nfs 4096 8月  17 16:10 /public/
 
[root@localhost ~]# vim /etc/exports    
/public    172.16.23.0/24(rw,all_squash,anonuid=5000,anongid=5000)
 
[root@localhost ~]# showmount -e 127.0.0.1    
Export list for 127.0.0.1:     
[root@localhost ~]# service nfs reload     
[root@localhost /]# showmount -e 127.0.0.1     
Export list for 127.0.0.1:     
/public 172.16.23.0/24

 

(五)数据库服务器

使用已经配置好的MariaDB服务器。详细创建方式请参照博主博文《LAMP的几种简单实现及drupal、WordPress、phpMyAdmin部署》。

数据库服务器的IP地址是:172.16.23.121

(六)安装PHP环境

两台WEB服务器分别执行

# yum -y install php php-gd php-zts php-mbstring php-mysql php-pdo php-xml
# service httpd restart

安装完后,重启httpd服务即可。

 

三、drupal 7部署

具体的部署,请参照博文《LAMP的几种简单实现及drupal、WordPress、phpMyAdmin部署》,这里不再赘述。

每一台WEB服务器都在站点根目录下部署drupal 7。

0、插曲:

放置测试页test.php,测试,不成功。

# tail -3 /var/log/httpd/error_log    
[Sun Aug 17 20:47:29 2014] [error] [client 172.16.23.150] PHP Warning:  mysql_connect(): Can't connect to MySQL server on '172.16.23.121' (13) in /var/www/html/test.php on line 14    
[Sun Aug 17 20:47:29 2014] [error] [client 172.16.23.150] PHP Warning:  mysql_close(): no MySQL-Link resource supplied in /var/www/html/test.php on line 22

检查,数据库权限配置、php脚本中IP、用户名、密码,没有任何错误。

又检查数据库服务器,没有问题。使用navicat连接数据库也没有问题。WEB服务器本机安装mysql客户端连接也没有问题。这说明不是防火墙问题。

难道是数据库版本太高了?也不对啊,就当php使用的和mysql客户端的不一样。

重新安装一台数据库,使用包安装mysql和mysql-server,配置好以后,测试,依然无法连接。

将web服务器的php-mysql卸载,测试,页面返回服务器错误。看来php的mysql模块还是起了作用。

分析了原因:

不是驱动问题

不是防火墙问题

不是数据库版本问题

不是测试页代码问题

那是什么问题呢?只能求助Google,在英文搜索的角落里,竟然有一个人和我的问题一样,后面有人提到了selinux。

# getsebool -a | grep httpd    
allow_httpd_anon_write --> off     
allow_httpd_mod_auth_ntlm_winbind --> off     
allow_httpd_mod_auth_pam --> off     
allow_httpd_sys_script_anon_write --> off     
httpd_builtin_scripting --> on     
httpd_can_check_spam --> off     
httpd_can_network_connect --> off     
httpd_can_network_connect_cobbler --> off     
httpd_can_network_connect_db --> off      
httpd_can_network_memcache --> off     
httpd_can_network_relay --> off     
httpd_can_sendmail --> off     
httpd_dbus_avahi --> on     
httpd_enable_cgi --> on     
httpd_enable_ftp_server --> off     
httpd_enable_homedirs --> off     
httpd_execmem --> off     
httpd_manage_ipa --> off     
httpd_read_user_content --> off     
httpd_run_stickshift --> off     
httpd_serve_cobbler_files --> off     
httpd_setrlimit --> off     
httpd_ssi_exec --> off     
httpd_tmp_exec --> off     
httpd_tty_comm --> on     
httpd_unified --> on     
httpd_use_cifs --> off     
httpd_use_fusefs --> off     
httpd_use_gpg --> off     
httpd_use_nfs --> off     
httpd_use_openstack --> off     
httpd_verify_dns --> off

原来是它,找到了!那就有办法了。可以使用下面的语句,让httpd能够正常地建立连接。

# setsebool -P httpd_can_network_connect 1

# setsebool -P httpd_can_network_connect_db 1

seLinux还有很多控制策略,为了以后提供其他服务方便,请关闭seLinux。

临时生效的命令是

# setenforce 0

重新配置/etc/selinux/config,将其中的

SELINUX=enforcing

替换为

SELINUX=disabled

这样系统重启后,就能永久不启用seLinux。

测试通过。

1、配置drupal的上传文件夹

开始配置drupal的公共文件夹为sites/default/files/pub,填写好之后网页程序会自己创建pub文件夹。

配置的文件夹,是当前服务器的本机文件系统目录,只可能在当前WEB服务器上产生,另一台没有这个文件夹。

drupal共享目录设置1

drupal共享目录设置2

drupal共享目录设置3

2、部署第二台

直接将第一台/var/www/html归档压缩(这个压缩文件后面扩展架构的时候还要用,不要删除),scp到另一台,解压即可。不然第二台安装drupal 时,安装向导会提示清空数据库。

使用tar解压方式,可以把公共文件夹pub也创建好了。

WEB1执行如下命令
# cd /var/www/    
# tar -jcvpf html.tar.bz2 html/     
# scp ht.tar.gz 172.16.23.133:/root/     
# scp html.tar.bz2 172.16.23.133:/root/
 
WEB2上执行下面的命令   
# tar xf html.tar.bz2 -C /var/www/

 

3、NFS挂载

选一台WEB服务器作为nfs的客户端,请确保安装了# yum -y install nfs-utils,分别执行如下语句。   

# showmount -e 172.16.23.134     
Export list for 172.16.23.134:     
/public 172.16.23.0/24     
[root@localhost ~]# mount -t nfs 172.16.23.134:/public /var/www/html/sites/default/files/pub
 
挂载后,它会变成nobody属主属组了。
 
# pwd;ll    
/var/www/html/sites/default/files     
总用量 12     
drwxrwxr-x. 2 apache apache 4096 8月  17 21:55 languages     
drwxr-xr-x  5 nobody nobody 4096 8月  18 22:49 pub     
drwxrwxr-x. 2 apache apache 4096 8月  17 21:05 styles
 
为了永久保存,那么要把挂载写入fstab
echo "172.16.23.134:/public /var/www/html/sites/default/files/pub nfs defaults 0 0" >> /etc/fstab

以上的操作,在另一台WEB服务器上同样的做一遍

 

4、在WEB服务器1(172.16.23.132)上编写帖子

登录drupal后编写测试文档并上传附件

发帖测试1

发帖测试2

发帖测试3

 

访问第二台WEB服务器

发帖测试4

测试页面的内容如下:

这是一个测试的内容。    
提交了一个图片的附件。
附件是放在了sites/default/files/pub下。
而sites/default/files/pub的绝对路径是/var/www/html/sites/default/files/pub
它是172.16.23.134:/public通过nfs的挂载点。
现在提交图片的服务器是WEB1,IP是172.16.23.132,它把图片提交到了pub目录下,由于pub目录是共享的。
实际上,数据一旦提交,另一台服务器WEB2,也可以看到一篇新的文章,并且能访问到图片。

 

至此,使用同一个网络资源存储和同一个数据库的双WEB服务器基于DNS轮询的负载均衡方案部署完成。

网络存储使用NFS,将网站中非结构化数据集中存放在网络中可扩展的存储服务器上。本方案中,网络存储是单节点,没有考虑冗余,而且使用的是某台主机的本地硬盘,未做效率和冗余的考虑。实际应用中一般使用的是一个磁盘阵列,当然可以使用其他的协议,不一定是NFS。

保证2台WEB服务器连接到同一个数据库,这样数据就只有一份,当然数据库在实际应用中也要考虑备份冗余、负载均衡。

这里只是一个简单的环境搭建,其他扩展以后再说。

 

第二章 更复杂的模型

一、规划

DNS负载均衡2

二、实验环境调整

CentOS 6.5 提供的rpm安装的httpd的版本是2.2.15;php的版本是5.3.3,支持php-fpm的。

Apache Http Server要求2.3以上才能支持FastCGI。

所以编译安装,更多内容,参看《LAMP的几种简单实现及drupal、WordPress、phpMyAdmin部署》。

 

(一)WEB服务器1上

 

# umount /var/www/html/sites/default/files/pub/    
# service httpd stop     
# chkconfig httpd off     
# chkconfig --list httpd     
httpd              0:关闭    1:关闭    2:关闭    3:关闭    4:关闭    5:关闭    6:关闭
 
# yum -y groupinstall "Development tools"    
# yum -y install pcre-devel openssl-devel
 
# cd    
# tar xf apr-1.5.1.tar.bz2     
# cd apr-1.5.1     
# ./configure --prefix=/usr/local/apr15     
# make && make install
 
# cd    
# tar xf apr-util-1.5.3.tar.bz2     
# cd apr-util-1.5.3     
# ./configure --prefix=/usr/local/apr-util15 --with-apr=/usr/local/apr15/     
# make && make install
 
# cd    
# tar xf httpd-2.4.10.tar.bz2     
# cd httpd-2.4.10     
# ./configure  --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-z --with-pcre --with-apr=/usr/local/apr15/ --with-apr-util=/usr/local/apr-util15/ --enable-mpms-shared=all --with-mpm=event --enable-modules=most --enable-proxy --enable-proxy-fcgi     
# make && make install

1、主配置文件/etc/httpd24/httpd.conf 中

1)指定pid文件

在ServerRoot "/usr/local/apache24"之后追加

PidFile /var/run/httpd/httpd.pid

2)装载模块部分开放如下的模块:

LoadModule proxy_module modules/mod_proxy.so    
#LoadModule proxy_connect_module modules/mod_proxy_connect.so     
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so     
#LoadModule proxy_http_module modules/mod_proxy_http.so     
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so     
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so     
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so     
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so     
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so     
#LoadModule proxy_express_module modules/mod_proxy_express.so     
#LoadModule session_module modules/mod_session.so     
#LoadModule session_cookie_module modules/mod_session_cookie.so     
#LoadModule session_dbd_module modules/mod_session_dbd.so     
#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so     
#LoadModule ssl_module modules/mod_ssl.so     
#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so     
#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so     
#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so     
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so     
LoadModule mpm_event_module modules/mod_mpm_event.so     
LoadModule unixd_module modules/mod_unixd.so

 

2、提供sysV风格服务控制脚本

# cd /etc/rc.d/init.d/    
# cp httpd httpd24     
# : > httpd24     
# vim httpd24  
# cat httpd24 
#!/bin/bash    
#     
# httpd        Startup script for the Apache HTTP Server     
#     
# chkconfig: - 85 15     
# description: The Apache HTTP Server is an efficient and extensible  \     
#           server implementing the current HTTP standards.     
# processname: httpd     
# config: /etc/httpd24/httpd.conf     
# pidfile: /var/run/httpd24/httpd.pid     
#     
### BEGIN INIT INFO     
# Provides: httpd     
# Required-Start: $local_fs $remote_fs $network $named     
# Required-Stop: $local_fs $remote_fs $network     
# Should-Start: distcache     
# Short-Description: start and stop Apache HTTP Server     
# Description: The Apache HTTP Server is an extensible server     
#  implementing the current HTTP standards.     
### END INIT INFO
 
# Source function library.    
. /etc/rc.d/init.d/functions
 
# Start httpd in the C locale by default.    
HTTPD_LANG=${HTTPD_LANG-"C"}
 
# This will prevent initlog from swallowing up a pass-phrase prompt if    
# mod_ssl needs a pass-phrase from the user.     
INITLOG_ARGS=""
 
# Path to the apachectl script, server binary, and short-form for messages.    
sbinPath=/usr/local/apache24/bin     
pidPath=/var/run/httpd     
lockPath=/var/lock/subsys/httpd
 
apachectl=$sbinPath/apachectl    
httpd=${HTTPD-$sbinPath/httpd}     
prog=httpd     
pidfile=${PIDFILE-$pidPath/httpd.pid}     
lockfile=${LOCKFILE-$lockPath}
 
RETVAL=0    
STOP_TIMEOUT=${STOP_TIMEOUT-10}
 
start() {    
        echo -n $"Starting $prog: "     
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS     
        RETVAL=$?     
        echo     
        [ $RETVAL = 0 ] && touch ${lockfile}     
        return $RETVAL     
}
 
stop() {    
    echo -n $"Stopping $prog: "     
    killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd     
    RETVAL=$?     
    echo     
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}     
}     
reload() {     
    echo -n $"Reloading $prog: "     
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then     
        RETVAL=6     
        echo $"not reloading due to configuration syntax error"     
        failure $"not reloading $httpd due to configuration syntax error"     
    else     
        # Force LSB behaviour from killproc     
        LSB=1 killproc -p ${pidfile} $httpd -HUP     
        RETVAL=$?     
        if [ $RETVAL -eq 7 ]; then     
            failure $"httpd shutdown"     
        fi     
    fi     
    echo     
}
 
# See how we were called.    
case "$1" in     
  start)     
    start     
    ;;     
  stop)     
    stop     
    ;;     
  status)     
        status -p ${pidfile} $httpd     
    RETVAL=$?     
    ;;     
  restart)     
    stop     
    start     
    ;;     
  condrestart|try-restart)     
    if status -p ${pidfile} $httpd >&/dev/null; then     
        stop     
        start     
    fi     
    ;;     
  force-reload|reload)     
        reload     
    ;;     
  graceful|help|configtest|fullstatus)     
    $apachectl $@     
    RETVAL=$?     
    ;;     
  *)     
    echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"     
    RETVAL=2     
esac
 
exit $RETVAL
 

上面这个脚本是基于原有的httpd修改的,它实际上是调用了/usr/local/apache24/bin目录下的apachectl和httpd的功能。

3、设置开机启动httpd2.4的功能,并启动、关闭、查看httpd24。

# chkconfig --add httpd24    
# chkconfig --list httpd24     
httpd24            0:off    1:off    2:off    3:off    4:off    5:off    6:off     
# chkconfig httpd24 on     
# chkconfig --list httpd24     
httpd24            0:off    1:off    2:on    3:on    4:on    5:on    6:off     
 
# service httpd24 start    
Starting httpd:                                            [  OK  ]     
# service httpd24 status     
httpd (pid  2437) is running...     
# ss -tnlp | grep 80     
LISTEN     0      128                      :::80                      :::*      users:(("httpd",2437,4),("httpd",2439,4),("httpd",2440,4),("httpd",2441,4))     
# service httpd24 stop     
Stopping httpd:                                            [  OK  ]     
# service httpd24 status     
httpd is stopped     
# service httpd24 start     
Starting httpd:                                            [  OK  ]

测试成功。

 

(二)php-fpm服务器 172.16.23.136

1、php安装

# yum -y install php php-gd php-fpm php-mbstring php-mysql php-pdo php-xml
 
# rpm -ql php-fpm    
/etc/logrotate.d/php-fpm     
/etc/php-fpm.conf     
/etc/php-fpm.d     
/etc/php-fpm.d/www.conf     
/etc/rc.d/init.d/php-fpm     
/etc/sysconfig/php-fpm     
/usr/sbin/php-fpm     
/usr/share/doc/php-fpm-5.3.3     
/usr/share/doc/php-fpm-5.3.3/LICENSE     
/usr/share/doc/php-fpm-5.3.3/php-fpm.conf.default     
/usr/share/fpm/status.html     
/usr/share/man/man8/php-fpm.8.gz     
/var/log/php-fpm     
/var/run/php-fpm
 
# service php-fpm start    
Starting php-fpm:                                          [  OK  ]     
# ss -tnl     
State       Recv-Q Send-Q                             Local Address:Port                               Peer Address:Port     
LISTEN      0      128                                    127.0.0.1:9000                                          *:*  

2、修改配置文件

让它监听在9000端口,同时只允许172.16.23.132和172.16.23.133访问。

# vim /etc/php-fpm.d/www.conf    
listen = 9000     
listen.allowed_clients = 172.16.23.132,172.16.23.133
 
# service php-fpm start     
Starting php-fpm:                                          [  OK  ]
[root@localhost etc]# ss -tnlp | grep 9000     
LISTEN  0  128    *:9000   *:*   users:(("php-fpm",1380,7),("php-fpm",1381,0),("php-fpm",1382,0),("php-fpm",1383,0),("php-fpm",1384,0),("php-fpm",1385,0))
 
 

(三)WEB服务器1上

在主配置文件/etc/httpd24/httpd.conf 中为httpd提供FastCGI配置

ServerRoot "/usr/local/apache24"    
PidFile /var/run/httpd/httpd.pid     
ProxyRequests Off     
ProxyPassMatch ^(/.*\.php)$ fcgi://172.16.23.136:9000/web$1
 
<IfModule mime_module>    
    AddType application/x-httpd-php .php
 
<IfModule dir_module>    
    DirectoryIndex index.php index.html index.htm     
</IfModule>
 
DocumentRoot "/var/www/html"    
<Directory "/var/www/html">     
    Options None

注意:

fcgi://172.16.23.136:9000/web,这就是说,172.16.23.136上站点部署在/web目录下

 

三、drupal 7的部署

(一)部署

在WEB1上把前面准备的归档压缩文件再传到172.16.23.136

# scp html.tar.bz2 172.16.23.136:/root/

在172.16.23.136上部署drupal7。

注意:这里故意换了目录

# tar xf html.tar.bz2
# cd html
# cp -R ./* /web/

 

(二)做一个有趣的实验

172.16.23.132上要执行的命令

# mount -t nfs 172.16.23.134:/public /var/www/html/sites/default/files/pub    
# umount /var/www/html/sites/default/files/pub

172.16.23.136上要执行的命令

# mount -t nfs 172.16.23.134:/public /web/sites/default/files/pub/    
# umount /web/sites/default/files/pub/

为了永久保存,那么要把挂载写入172.16.23.136的fstab

echo "172.16.23.134:/public /web/sites/default/files/pub/ nfs defaults 0 0" >> /etc/fstab

 

开始测试

测试结果

 

说明:

1、都不挂载,图片访问不到,但是图片属性中显示的URL是请求的默认页面(index.php),并送给了index.php两个参数,第一个是q,这是要请求的图片的相对路径。

注意“?”问号前才是URL,也就是说这个URL(http://172.16.23.132/)请求的页面实际指向的是默认页面,配置文件中第一个默认页面是index.php,而网站根目录下确实有index.php页面存在。

4

 

2、httpd服务器挂载,图片还是访问不到。解释同上。

1

 

3、都挂载,图片可以看到了,很不错。图片属性显示的URL才真正指向了图片的URL。http://172.16.23.132/sites/default/files/pub/styles/medium/public/field/image/%E5%8F%91%E5%B8%961.jpg

2

 

4、httpd服务器不挂载,php-fpm服务器挂载。图片又看不到了,看URL,还是http://172.16.23.132/sites/default/files/pub/styles/medium/public/field/image/%E5%8F%91%E5%B8%961.jpg。指向图片的URL。

3

 

原因分析:

php-fpm服务器挂载了,这样php程序才能判断图片存在或要处理图片(这个要看php程序的实现),所以再拼接URL返回给httpd,所以php-fpm服务器要mount,而且php-fpm服务器的脚本先执行,它就要先访问挂载目录中的资源。如果不挂载,php脚本执行就会错误或者抛出异常,最终会返回服务器端错误。

如果不挂载httpd,当拼接好的资源URL返回浏览器端,浏览器发起资源请求,httpd服务器要去读取静态资源,结果目录没有挂载,资源访问不到,返回404错误。只不过网页中,它是一个嵌入的资源,所以无法显示404错误而已。

那么验证一下,重新上面的挂载试验。

把图片位置的URL放到chrome浏览器中,F12启动开发调试工具

11

12

可以看出,不同的URL确实代表了不同意义。注意URL中,问号之后的都是GET方法提交的参数。这印证了上面的原因分析。

由此可以看出,静态资源请求确实是httpd服务器返回。而动态资源请求是通过FastCGI提交给php-fpm服务器处理,将处理结果返回给httpd,再由httpd组织好静态页面返回浏览器,浏览器端收到静态页面后发现有图片等资源,再发起请求,httpd对这些静态资源请求处理并返回。

 

四、DNS负载均衡实验

这是个比较难测试的效果的实验。个别浏览器有DNS缓存,系统有DNS缓存,所以每一次请求都要清除缓存。

客户端使用windows系统,浏览器使用chrome,并且打开开发工具。

如果同一台主机同一个域名访问同一个网站,返回了不同的IP,且页面都正常,就说明实验成功。

windows下清除系统缓存的命令是 ipconfig /flushdns

dns1

dns2

如图所示,实验成功。

 

第三章 总结

一、LAMP架构

这次博客有采用了2种不同的LAMP架构实现了动态网站的搭建。并且第二种方案实现了动静的分离,但是也能从实验中看出,这种动静的分离是要结合网站开发者的架构方案,不能简单的部署。

LAMP架构可以根据访问量,选择适用的架构,必要的时候,选择新的架构来实现。

每一种架构都有其适用性,要做到灵活使用。

二、DNS实现的负载均衡

简单、成本低,但是其缺点也是十分明显。

1、无法共享服务器端内存数据。

实际上,DNS实现的负载均衡,是对不同的地址解析请求返回不同的IP地址实现,从而减轻WEB服务器压力的。但是,实验环境搭建的简单模型中,遗留的问题是,每一台WEB服务器相对是独立的,服务器端内存中维护的变量信息不能共享。如果用户本地DNS缓存清空了,原来是通过解析的IP地址登录的是WEB1,重新获得了另外的WEB2服务器的IP地址,而访问服务器2没有WEB服务器1上内存空间的变量保存的用户的信息。即使是使用cookie,也只是在客户端保留部分的信息,不能和服务器端为会话建立的变量而保存的信息等同。

2、可靠性低

如果DNS解析的地址列表中的主机有故障不能工作,但是DNS不能知晓,就会把客户端指向这个故障机器,从而是客户端不能成功访问。

即使是从DNS服务器中去除该服务器的解析记录,等全网更新DNS记录,也要等几小时甚至几天。

3、负载分配不均衡

DNS如果采用轮循的工作方式,不能根据链路通信带宽、服务器性能等参数做出均衡,只是简单的轮询,有可能造成某一台服务器负担着更多的用户请求。

 

参考资料

PHP Warning:  mysql_connect(): Can't connect to MySQL server 错误

http://www.blogjava.net/ycyk168/archive/2012/09/09/387340.html