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網絡共享文件系統了,那我再用域名登陸一下呢
好的,域名也沒有問題!
至此,該試驗結束...