第一章 简单模型实现
一、规划
二、环境准备
(一)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>
(四)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服务器上产生,另一台没有这个文件夹。
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后编写测试文档并上传附件
访问第二台WEB服务器
测试页面的内容如下:
这是一个测试的内容。
提交了一个图片的附件。
附件是放在了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服务器连接到同一个数据库,这样数据就只有一份,当然数据库在实际应用中也要考虑备份冗余、负载均衡。
这里只是一个简单的环境搭建,其他扩展以后再说。
第二章 更复杂的模型
一、规划
二、实验环境调整
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页面存在。
2、httpd服务器挂载,图片还是访问不到。解释同上。
3、都挂载,图片可以看到了,很不错。图片属性显示的URL才真正指向了图片的URL。http://172.16.23.132/sites/default/files/pub/styles/medium/public/field/image/%E5%8F%91%E5%B8%961.jpg
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。
原因分析:
php-fpm服务器挂载了,这样php程序才能判断图片存在或要处理图片(这个要看php程序的实现),所以再拼接URL返回给httpd,所以php-fpm服务器要mount,而且php-fpm服务器的脚本先执行,它就要先访问挂载目录中的资源。如果不挂载,php脚本执行就会错误或者抛出异常,最终会返回服务器端错误。
如果不挂载httpd,当拼接好的资源URL返回浏览器端,浏览器发起资源请求,httpd服务器要去读取静态资源,结果目录没有挂载,资源访问不到,返回404错误。只不过网页中,它是一个嵌入的资源,所以无法显示404错误而已。
那么验证一下,重新上面的挂载试验。
把图片位置的URL放到chrome浏览器中,F12启动开发调试工具
可以看出,不同的URL确实代表了不同意义。注意URL中,问号之后的都是GET方法提交的参数。这印证了上面的原因分析。
由此可以看出,静态资源请求确实是httpd服务器返回。而动态资源请求是通过FastCGI提交给php-fpm服务器处理,将处理结果返回给httpd,再由httpd组织好静态页面返回浏览器,浏览器端收到静态页面后发现有图片等资源,再发起请求,httpd对这些静态资源请求处理并返回。
四、DNS负载均衡实验
这是个比较难测试的效果的实验。个别浏览器有DNS缓存,系统有DNS缓存,所以每一次请求都要清除缓存。
客户端使用windows系统,浏览器使用chrome,并且打开开发工具。
如果同一台主机同一个域名访问同一个网站,返回了不同的IP,且页面都正常,就说明实验成功。
windows下清除系统缓存的命令是 ipconfig /flushdns
如图所示,实验成功。
第三章 总结
一、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