当前位置:首页 > 操作系统 > Linux

Linux网络服务-LAMP之基于NFS+Fastcgi的LAMP搭建

一、概述:  

   上篇博客《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 上的那个目录的。 它的配置我将在下面的实验中展开。先看一下图吧:

650) this.width=650;" src="/upload/getfiles/default/2022/11/16/20221116044956056.jpg" title="544545444444444444444444440.png" />

1. 我通过 DNS 一个域名对应两台服务器做轮询,将两台 Web Server 发布出去,客户端发起请求后,其中的一台 Web 服务器对其响应,此时客户端无法察觉是哪台,它也不用去关心哪台;
2. 两台 Web Server 通过 在Fastcgi上面的NFS服务 将其共享出来的文件系统挂载至本地存放网页数据文件;
3. 如果客户端请求的是 Php 脚本文件, httpd 将基于 Fastcgi 协议与后端的 Fastcgi Server 进行通信,并将 Php 脚本文件在 Fastcgi 内部执行后返回到其中的一台 Web Server ,最后在通过 http/https 协议将结果响应给客户端;

4. 若客户提交的请求包括了 Php 脚本文件并且还需要用到数据库,此时 Fastcgi则 会基于 mysql 协议与 Mysql Server 进行通信,工作;

二、实践操作

1.实验准备:
   关于httpd以及mysql的编译安装在此处不再演示,如果需要请看上章博文;下面是我的实验环境:
   操作系统Centos6.5_x86-64
   IP、主机名等规划已在上图表明
2.实验步骤:

==================================安装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 ~]#

650) this.width=650;" src="/upload/getfiles/default/2022/11/16/20221116044956413.jpg" title="DNS解析.png" />
650) this.width=650;" src="/upload/getfiles/default/2022/11/16/20221116044956562.jpg" title="DNS解析1.png" />

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
2、编译安装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服务器提供的服务一样,它的配置也一样,所以在此我就只把一台的配置贴出来,另外一台配置一样)
1、启用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  #→启用
2、关闭中心主机、配置虚拟主机支持使用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进行了封装,不需要手动指定。
3、编辑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();
?>
[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

650) this.width=650;" src="/upload/getfiles/default/2022/11/16/20221116044957545.jpg" title="链接数据库.png" />

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去装)

650) this.width=650;" src="/upload/getfiles/default/2022/11/16/20221116044957679.jpg" title="安装.png" />

点击"接受"

650) this.width=650;" src="/upload/getfiles/default/2022/11/16/20221116044958038.jpg" title="安装1.png" />

告诉我刚刚解压的那些文件权限需要修改一下
[root@fast htdocs]# chmod -R a+rw attachment conf data html src themes windid
#客户端再次测试

650) this.width=650;" src="/upload/getfiles/default/2022/11/16/20221116044958166.jpg" title="安装2.png" />

权限已经改过来了,现在继续...

650) this.width=650;" src="/upload/getfiles/default/2022/11/16/20221116044958321.jpg" title="phpwinddb.png" />

现在需要需要在服务器端创建一个论坛的数据库,其中还需要创建这个论坛数据库的管理员
[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服务器上发帖

650) this.width=650;" src="/upload/getfiles/default/2022/11/16/20221116044958807.jpg" title="fatie1.png" />

2.在172.16.41.2这台web服务器上登录

650) this.width=650;" src="/upload/getfiles/default/2022/11/16/20221116044959187.jpg" title="fatie2.png" />

ok,看来我的两台服务器现在已经在用NFS网络共享文件系统了,那我再用域名登录一下呢

650) this.width=650;" src="/upload/getfiles/default/2022/11/16/20221116044959306.jpg" title="dfdsa.png" />

ok,看来我的两台服务器现在已经在用NFS网络共享文件系统了,那我再用域名登录一下呢

好的,域名也没有问题!
至此,该试验结束...

本文出自 “一叶知秋” 博客,请务必保留此出处http://maoqiu.blog.51cto.com/8570467/1386643

原文:http://maoqiu.blog.51cto.com/8570467/1386643


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!