Linux網絡服務-LAMP之基於NFS+Fastcgi的LAMP搭建

一、概述:  

   上篇博客《Linux網絡服務-LAMP之Php基於Apache的模塊實現》介紹了一個由基於Centos6.5_x86-64+Httpd+Php(module)+Mysql構建的一個簡單的LAMP環境,其中中我使用Php基於httpd服務的一部分、然後再結合mysql一同工作;也歸納了httpdPhp結合的常見三種方式,以及和mysql它們三者之間是如何通信的,最後實現了一個博客系統的部署。
   現在假設就上篇博文中的拓撲圖來講,我的httpd服務器不足以滿足需求,需要多增加一臺,以達到平均分攤工作量的目的,於是我就加了一臺和之前一樣的httpd服務器,可是現在又遇到一個問題他們之間的網頁數據存放該如何解決,又如何能達到兩臺httpd服務器存的數據能一模一樣,於是引入了NFS這個概念,首先需要了解,什麼是NFS,它是如何工作的?
   NFS,是Network File System的簡寫,即網絡文件系統NFS會經常用到,用於在網絡上共享存儲。這樣講,你對NFS可能不太瞭解,我不妨舉一個例子來說明一下NFS是用來做什麼的。假如有三臺機器ABC,它們需要訪問同一個目錄,目錄中都是圖片,傳統的做法是把這些圖片分別放到ABC。但是使用NFS只需要放到A上,然後A共享給BC即可。訪問的時候,BC是通過網絡的方式去訪問A上的那個目錄的。它的配置我將在下面的實驗中展開。先看一下圖吧:

wKioL1M2i3aCQWVHAAGq8j6tV6M429.jpg

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 ~]#

wKioL1M2jNuyDoGiAALT0ZadMsw814.jpg
wKioL1M2jQWQHdIlAAD0ytQA3DQ547.jpg

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();
?>

2.客戶端測試

wKioL1M2j2bCxnnMAAEKLfah53w732.jpg

wKiom1M2j4_AoHfyAAEDja3BBU4995.jpg

wKiom1M2j42RIZOiAAD8JQ992cU133.jpg

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

wKiom1M2j-jAum2jAAFlCwjuW5U584.jpg

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

wKioL1M2kDOjACcRAARQFaU-HuM712.jpg

點擊"接受"

wKioL1M2kDSAj0OtAAHPX5u4ERs688.jpg

告訴我剛剛解壓的那些文件權限需要修改一下

[root@fast htdocs]# chmod -R a+rw attachment conf data html src themes windid

#客戶端再次測試

wKiom1M2kF6RED7fAAJtZ3zjcdw203.jpg

權限已經改過來了,現在繼續...

wKiom1M2kLngCBB4AAJdD7uq63A139.jpg

現在需要需要在服務器端創建一個論壇的數據庫,其中還需要創建這個論壇數據庫的管理員

[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>

回到安裝界面,將這些信息填入後完成安裝

wKiom1M2kO2iDFtSAAC-yD8G12s207.jpg



======================測試兩臺服務器是否能同步數據======================

1.在172.16.41.1這臺web服務器上發帖

wKiom1M2kUrzPGMrAAH0ypjXPCg085.jpg

2.在172.16.41.2這臺web服務器上登錄

wKioL1M2kSTT7ZaVAAIrp4KPknk631.jpg

ok,看來我的兩臺服務器現在已經在用NFS網絡共享文件系統了,那我再用域名登錄一下呢

wKiom1M2kUmyOc7fAAHINPqXuTA061.jpg

ok,看來我的兩臺服務器現在已經在用NFS網絡共享文件系統了,那我再用域名登錄一下呢

好的,域名也沒有問題!

至此,該試驗結束...


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章