1、概述: php
上篇博客《Linux网络服务-LAMP之Php基于Apache的模块实现》介绍了一个由基于Centos6.5_x86-64+Httpd+Php(module)+Mysql构建的一个简单的LAMP环境,其中中我使用Php基于httpd服务的一部分、而后再结合mysql一同工做;也概括了httpd与Php结合的常见三种方式,以及和mysql它们三者之间是如何通讯的,最后实现了一个博客系统的部署。
如今假设就上篇博文中的拓扑图来说,个人httpd服务器不足以知足需求,须要多增长一台,以达到平均分摊工做量的目的,因而我就加了一台和以前同样的httpd服务器,但是如今又遇到一个问题他们之间的网页数据存放该如何解决,又如何能达到两台httpd服务器存的数据能如出一辙,因而引入了NFS这个概念,首先须要了解,什么是NFS,它是如何工做的?
NFS,是Network File System的简写,即网络文件系统。NFS会常常用到,用于在网络上共享存储。这样讲,你对NFS可能不太了解,我不妨举一个例子来讲明一下NFS是用来作什么的。假若有三台机器A、B、C,它们须要访问同一个目录,目录中都是图片,传统的作法是把这些图片分别放到A、B、C。可是使用NFS只须要放到A上,而后A共享给B和C便可。访问的时候,B和C是经过网络的方式去访问A上的那个目录的。它的配置我将在下面的实验中展开。先看一下图吧:html
1.我经过DNS一个域名对应两台服务器作轮询,将两台Web Server发布出去,客户端发起请求后,其中的一台Web服务器对其响应,此时客户端没法察觉是哪台,它也不用去关心哪台;
2.两台Web Server经过在Fastcgi上面的NFS服务将其共享出来的文件系统挂载至本地存放网页数据文件;
3.若是客户端请求的是Php脚本文件,httpd将基于Fastcgi协议与后端的Fastcgi Server进行通讯,并将Php脚本文件在Fastcgi内部执行后返回到其中的一台Web Server,最后在经过http/https协议将结果响应给客户端;
mysql
4.若客户提交的请求包括了Php脚本文件而且还须要用到数据库,此时Fastcgi则会基于mysql协议与Mysql Server进行通讯,工做;web
2、实践操做
sql
1.实验准备:数据库
关于httpd以及mysql的编译安装在此处再也不演示,若是须要请看上章博文;下面是个人实验环境:apache
操做系统Centos6.5_x86-64vim
IP、主机名等规划已在上图代表后端
2.实验步骤:api
==================================安装DNS服务==================================
1.解决依赖关系:
请配置好yum源后执行以下命令:
[root@ns ~]# yum intall -y bind
2.修改主配置文件
首先要到达DNS轮询的方式咱们须要在主配置文件中填如下代码: options { rrset-order { class IN type A name "www.maoqiu.com" order cyclic; }; }; rrset-order 支持三个参数:fixed, random, cyclic. fixed 会将多个A记录按配置文件的顺序固定给出 random 会随机给出 cyclic 会循环给出 #注销如下信息 [root@ns ~]# vim /etc/named.conf options { // listen-on port 53 { 127.0.0.1; }; // listen-on-v6 port 53 { ::1; }; directory "/var/named"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; recursion yes; // dnssec-enable yes; // dnssec-validation yes; // dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; rrset-order { class IN type A name "www.maoqiu.com" order cyclic; }; #→新添加的内容 managed-keys-directory "/var/named/dynamic"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; //include "/etc/named.root.key"; #继续编辑/etc/named.rfc1912.zons配置文件为其建立区域信息 [root@ns ~]# vim /etc/named.rfc1912.zones #在文件最后添加如下信息 zone "maoqiu.com" IN { type master; file "maoqiu.com.zone" }; zone "41.16.172.in-addr.arpa" IN { type master; file "172.16.41.zone" }; #检查主配置文件语法 [root@ns ~]# named-checkconf#→若是执行结果没有任何输出则表示语法上面对了,可是不能保证咱们填写的信息是对的,等下看看,有问题再修改 [root@ns ~]#
3.建立区域文件
[root@ns ~]# cd /var/named/ [root@ns named]# vim maoqiu.com.zone #→建立正向区域配置文件 $TTL 6400 @ IN SOA ns.maoqiu.com. admin.maoqiu.com ( 2014032701 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS ns ns IN A 172.16.41.3 www IN A 172.16.41.1 www IN A 172.16.41.2 [root@ns named]# vim 172.16.41.zone #→建立反向区域配置文件 $TTL 6400 @ IN SOA ns.maoqiu.com. admin.maoqiu.com ( 2014032701 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS ns.maoqiu.com. 3 IN PTR ns.maoqiu.com. 1 IN PTR www.maoqiu.com. 2 IN PTR www.maoqiu.com. [root@ns named]# named-checkzone maoqiu.com /var/named/maoqiu.com.zone #→检查正向区域配置文件语法 zone maoqiu.com/IN: loaded serial 2014032701 OK [root@ns named]# named-checkzone 41.16.172.in-addr.arpa /var/named/172.16.41.zone #→检查反向区域配置文件语法 zone 41.16.172.in-addr.arpa/IN: loaded serial 2014032701 OK [root@ns named]#
4.修改区域文件属性
[root@ns named]# chmod 640 maoqiu.com.zone 172.16.41.zone [root@ns named]# chown root:named maoqiu.com.zone 172.16.41.zone
5.修改系统配置文件:/etc/resolv.conf
[root@ns named]# vim /etc/resolv.conf # Generated by NetworkManager search maoqiu.com nameserver 172.16.41.3
5.启动服务并测试:
[root@ns named]# service named start Starting named: [ OK ] [root@ns named]# ss -tunl | grep :53 udp UNCONN 0 0 172.16.41.3:53 *:* udp UNCONN 0 0 127.0.0.1:53 *:* tcp LISTEN 0 3 172.16.41.3:53 *:* tcp LISTEN 0 3 127.0.0.1:53 *:* [root@ns named]#
ok.下面我分别在两台Server上面放两个网页再经过客户端访问测试一下,看可否解析
启动服务(注意,虽然主机名同样,可是他们是不一样的两台服务器)
[root@www ~]# echo "<h1>web1</h1>" >/usr/local/apache2/htdocs/index.html [root@www ~]# service httpd2 start Starting httpd: [root@www ~]# [root@www ~]# echo "<h1>web2</h1>" >/usr/local/apache2/htdocs/index.html [root@www ~]# service httpd2 start Starting httpd: [root@www ~]#
ok.看来DNS正常可以作到轮询了
==================================安装NFS服务==================================
1.建立一个20G的分区做为NFS共享出去给web服务器使用的网页数据存放目录
[root@fast ~]# mke2fs -t ext4 /dev/sda3 #建立共享目录,并挂载此分区 [root@fast ~]# mkdir /usr/local/apache2/htdocs [root@fast ~]# mount /dev/sda3 /webshared/ [root@fast ~]# vim /etc/fstab#→实现开机自动挂载 /dev/sda3 /usr/local/apache2/htdocs ext4 defaults,acl 0 0
2.编辑NFS服务配置文件:
#查看是否安装了服务器端程序 [root@fast ~]# rpm -qa | grep nfs nfs-utils-lib-1.1.5-6.el6.x86_64 nfs-utils-1.2.3-39.el6.x86_64 #→服务安装程序 nfs4-acl-tools-0.3.3-6.el6.x86_64 [root@fast ~]# vim /etc/exports /usr/local/apache2/htdocs 172.16.41.1(rw,async,no_root_squash) 172.16.41.2(rw,async,no_root_squash)
3.重启服务验证
[root@fast ~]# service nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ] [root@fast ~]# showmount -e localhost #→本地测试没有问题 Export list for localhost: /webshared 172.16.41.2,172.16.41.1 [root@www ~]# showmount -e 172.16.41.4 #→在nfs客户端(web1)执行,探查fastcgi主机所导出的nfs文件系统 Export list for 172.16.41.4: /webshared 172.16.41.2,172.16.41.1 [root@www ~]# [root@www ~]# showmount -e 172.16.41.4 #→在nfs客户端(web2)执行,探查fastcgi主机所导出的nfs文件系统 Export list for 172.16.41.4: /webshared 172.16.41.2,172.16.41.1 [root@www ~]#
4.客户端(web服务器)尝试将此网络共享挂载至本身的网站根目录
[root@www ~]# mount -t nfs 172.16.41.4:/usr/local/apache2/htdocs /usr/local/apache2/htdocs #→在web1上挂载 [root@www ~]# mount -t nfs 172.16.41.4:/usr/local/apache2/htdocs /usr/local/apache2/htdocs #→在web2上挂载
5.编辑/etc/fstab文件,实现开机自动挂载
[root@www ~]# vim /etc/fstab 172.16.41.4:/usr/local/apache2/htdocs /usr/local/apache2/htdocs nfs defaults 0 0 [root@www ~]# vim /etc/fstab 172.16.41.4:/usr/local/apache2/htdocs /usr/local/apache2/htdocs nfs defaults 0 0 #注意我是在两台web服务器上作的操做哦,不要认为我作了两遍.
==================================编译安装Php==================================
上篇博文中已经提到了fastcgi的工做模式,在此将Php以一个服务独立安装在一台Server上面(和NFS服务在一台上面)
1.解决依赖关系:
请配置好yum源后执行以下命令:
[root@fast ~]# yum -y groupinstall "Desktop Platform Development" [root@fast ~]# yum -yinstall bzip2-devel libmcrypt-devel
二、编译安装php-5.4.26
[root@fast ~]# tar xf php-5.4.26.tar.bz2 [root@fast ~]# cd php-5.4.26 [root@fast ~]## ./configure --prefix=/usr/local/php --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd [root@fast ~]# make [root@fast ~]# make test [root@fast ~]# make install
说明:若是使用PHP5.3以上版本,为了连接MySQL数据库,能够指定mysqlnd,这样在本机就不须要先安装MySQL或MySQL开发包了。mysqlnd从php 5.3开始可用,能够编译时绑定到它(而不用和具体的MySQL客户端库绑定造成依赖),但从PHP 5.4开始它就是默认设置了。故此处要与数据库连接就须要加上这些选项: --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
3.为php提供配置文件:
[root@fast ~]# cp php.ini-production /etc/php.ini
4.配置php-fpm
#为php-fpm提供Sysv init脚本,并将其添加至服务列表: [root@fast ~]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm [root@fast ~]# chmod +x /etc/rc.d/init.d/php-fpm [root@fast ~]# chkconfig --add php-fpm [root@fast ~]# chkconfig php-fpm on
5.为php-fpm提供配置文件:
[root@fast ~]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
6.编辑php-fpm的配置文件:
[root@fast ~]# vim /usr/local/php/etc/php-fpm.conf #配置fpm的相关选项为你所须要的值,并启用pid文件(以下最后一行): pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8 pid = run/php-fpm.pid #→将此行取消注释
7.接下来就能够启动php-fpm了:
[root@fast ~]# service php-fpm start Starting php-fpm done [root@fast ~]# #使用以下命令来验正(若是此命令输出有中几个php-fpm进程就说明启动成功了): [root@fast ~]# ps -aux | grep php #默认状况下,fpm监听在127.0.0.1的9000端口,也可使用以下命令验正其是否已经监听在相应的套接字。 # netstat -tnlp | grep php-fpm tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 689/php-fpm #php-fpm是为外面的httpd服务的,故咱们须要将它的监听端口改成172.16.41.4 [root@fast ~]# vim /usr/local/php/etc/php-fpm.conf listen= 172.16.41.4:9000
=============================配置httpd-2.4.9=============================
(因为两台web服务器提供的服务同样,它的配置也同样,因此在此我就只把一台的配置贴出来,另一台配置同样)
一、启用httpd的相关模块
在Apache httpd 2.4之后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它实际上是做为mod_proxy.so模块的扩充,所以,这两个模块都要加载
[root@www ~]# vim /etc/httpd2/httpd.conf LoadModule proxy_module modules/mod_proxy.so #→启用 LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so #→启用
二、关闭中心主机、配置虚拟主机支持使用fcgi
[root@www ~]# vim /etc/httpd2/httpd.conf #DocumentRoot "/usr/local/apache2/htdocs" 将此行注释掉 [root@www ~]# vim /etc/httpd2/extra/httpd-vhosts.conf <VirtualHost *:80> DocumentRoot "/usr/local/apache2/htdocs" ServerName www.maoqiu.com ErrorLog "logs/discuz-error_log" CustomLog "logs/discuz-access_log" common </Directory "/usr/local/apache/htdocs"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.41.4:9000/usr/local/apache2/htdocs/$1 <IfModule dir_module> DirectoryIndex index.php index.html </IfModule> </VirtualHost>
说明:
ProxyRequests Off:关闭正向代理
ProxyPassMatch:把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少须要知道运行的目录和URI,因此这里直接在fcgi://172.16.41.4:9000后指明了这两个参数,其它的参数的传递已经被mod_proxy_fcgi.so进行了封装,不须要手动指定。
三、编辑apache配置文件httpd.conf,让apache能识别php格式的页面,并支持php格式的主页
[root@www ~]# vim /etc/httpd2/httpd.conf #添加以下二行 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps #定位至DirectoryIndex index.html 修改成: DirectoryIndex index.php index.html
==========================测试NFS、php、httpd==========================
1.在fastcgi服务器(NFS服务器)上添加php测试页面文件
[root@fast ~]# vim /usr/local/apache2/htdocs/index.php <?php phpinfo(); ?>
2.客户端测试
OK!能够看出NFS服务已经生效了,下面我在测试一下数据库是否能连上,仍是将下面的内容写到测试文件里
[root@fast ~]# vim /usr/local/apache2/htdocs/index.php <?php $link = mysql_connect('172.16.41.5','guomaoqiu','guo.150019'); if ($link) echo "Connect to Mysql server success!"; else echo "Connect to Mysql server failure!"; mysql_close(); phpinfo(); ?>
注意,此时在数据库要建立远程用户,例如:"guomaoqiu"
[root@mysql ~]# mysql -uroot -pguo.150019 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.33-log MySQL Community Server (GPL) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> GRANT ALL PRIVILEGES ON *.* TO 'guomaoqiu'@'%' IDENTIFIED BY 'guo.150019'; Query OK, 0 rows affected (0.03 sec) mysql> select host,user,password from user; +------------------+-----------+-------------------------------------------+ | host | user | password | +------------------+-----------+-------------------------------------------+ | localhost | root | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 | | mysql.maoqiu.com | root | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 | | 127.0.0.1 | root | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 | | % | guomaoqiu | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 | | % | worduser | *736C3B5499F163A84CCB2C0F176F3ABC93410FB5 | +------------------+-----------+-------------------------------------------+ 5 rows in set (0.00 sec) mysql> FLUSH PRIVILEGES ; Query OK, 0 rows affected (0.07 sec) mysql> quit
在客户端输入http://www.maoqiu.com
ok,连接数据库成功,最后一步就是搭建一个论坛看一下是否能同步数据:
==================================安装phpwind==================================
1.解压下载到的phpwind_v9.0_utf8.zip论坛软件包
[root@fast ~]# unzip phpwind_v9.0_utf8.zip [root@fast ~]# cd phpwind_v9.0_utf8 [root@fast phpwind_v9.0_utf8]# cd upload/ #将这个包里面的文件所有移动到nfs服务器的/usr/local/apache2/htdocs目录中 [root@fast upload]# mv * /usr/local/apache2/htdocs/ mv: overwrite `/usr/local/apache2/htdocs/index.php'? y #由于这个软件包里面有index.php这个文件,因此咱们直接覆盖以前的那个测试文件 [root@fast upload]#
2.在任意一台web服务器上面进行安装(我这里使用http://172.16.41.1去装)
告诉我刚刚解压的那些文件权限须要修改一下
[root@fast htdocs]# chmod -R a+rw p_w_upload conf data html src themes windid
#客户端再次测试
权限已经改过来了,如今继续...
如今须要须要在服务器端建立一个论坛的数据库,其中还须要建立这个论坛数据库的管理员
[root@mysql ~]# mysql -uroot -pguo.150019 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.5.33-log MySQL Community Server (GPL) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> CREATE DATABASE winddb; Query OK, 1 row affected (0.05 sec) mysql> GRANT ALL PRIVILEGES ON winddb.* TO 'winduser'@'%' IDENTIFIED by 'guo.150019'; Query OK, 0 rows affected (0.03 sec) mysql> FLUSH PRIVILEGES ; Query OK, 0 rows affected (0.07 sec) mysql>
回到安装界面,将这些信息填入后完成安装
======================测试两台服务器是否能同步数据======================
1.在172.16.41.1这台web服务器上发帖
ok,看来个人两台服务器如今已经在用NFS网络共享文件系统了,那我再用域名登陆一下呢
ok,看来个人两台服务器如今已经在用NFS网络共享文件系统了,那我再用域名登陆一下呢
好的,域名也没有问题!
至此,该试验结束...