需求分析:php
前端需支持更大的訪問量,單臺Web服務器已沒法知足需求了,則需擴容Web服務器;html
雖然動態內容可交由後端的PHP服務器執行,但靜態頁面還須要Web服務器本身解析,那是否意味着多臺Web服務器都須要在各自的系統中都存有一份靜態頁面數據呢?前端
其實這樣也不是不能夠,畢竟文件本地訪問,速度仍是有優點的,但這卻涉及到多臺Web服務器間內容的一致性問題,尤爲是在上線新代碼或修改Web配置文件時,即便是使用一些管理工具(如puppet),這種問題也不可避免;數據庫
那麼若是能將靜態頁面集中存放,全部Web服務器都來集中地取文件,對於文件的一致性就有了保障,這個集中地就叫作「文件共享服務器」;後端
文件共享有多種方式,FTP,NFS,Samba等,而其中NFS做爲網絡文件系統,容許一個系統經過網絡共享目錄和文件,經過使用NFS,用戶和程序能夠像訪問本地文件同樣訪問遠端系統上的文件,這種近似訪問本地文件系統的架構貌似很符合咱們的需求,那咱們就來試試吧!瀏覽器
架構優化bash
說明1:NFS服務安裝在PHP服務器上,並將網站根目錄共享出去,這樣,雖然網站內容都在同一個目錄,但靜態內容會經過NFS由Web服務器讀取,而動態內容則經過fcgi交由PHP服務器解析;服務器
說明2:前端Web服務器在掛載NFS共享目錄時,需先經過RPC調用機制得到NFS相關服務(如mountd)的端口號,而後再鏈接通訊網絡
RPC調用和NFS的基本原理圖架構
NFS簡介
NFS實現文件共享主要由如下3個組件配合完成:
nfsd:接受NFS客戶端的請求服務
mountd:掛載守護進程,等待客戶端的掛載請求,並完成來源認證
rpcbind:此服務容許NFS客戶端查詢被NFS服務使用的端口
監聽端口:
NFS服務nfsd自己監聽的端口是2049/tcp和2049/udp,但還會啓動其它進程(如mountd,statd,rquotad等)以完成文件共享,這些進程的端口是不固定的;是每次NFS服務啓動時向RPC服務註冊的,RPC服務會隨機分配未使用的端口
需安裝程序:
rpcbind(通常系統自帶,可不安裝),nfs-utils
主要文件:
/etc/exports 主配置文件
/usr/sbin/exportfs 維護NFS共享資源的指令,通常用於NFS服務器端
/usr/sbin/showmount 查看NFS共享出來的目錄資源,通常用於NFS客戶端
/var/lib/nfs/xtab NFS的日誌文件,主要記錄曾經連入NFS服務器端的客戶端信息
配置部署
NFS服務器配置
在PHP服務器上,安裝好nfs-utils組件,並安裝phpwind
mkdir /www/phpwind.com unzip phpwind_v9.0_utf8.zip cd phpwind_v9.0_utf8/upload mv * /www/phpwind.com cd /www/phpwind.com chmod -R a+rw attachment conf data html src themes windid # 需配置這些目錄具備寫權限,不然安裝會出現失敗的
編輯NFS主配置文件
vi /etc/exports /www/phpwind.com 172.16.251.0/24(rw,no_root_squash) # 配置共享目錄爲可讀寫,客戶端root用戶權限不壓縮
啓動服務
service nfs start
查看啓動進程
ps -ef | grep "nfs\|rpc"
NFS客戶端配置
這裏的客戶端就是前端的2臺Web服務器,先掛載共享目錄,而後測試其讀寫功能
在客戶機上執行mount命令,它向服務器上的端口映射器發出一個RPC調用來得到服
務器上安裝守護程序的端口號。客戶和端口映射器交互既能夠使用TCP也能夠使用UDP,但
通常使用UDP。
showmount -e 172.16.251.163 # 查看NFS服務器共享出來的目錄 mkdir /www/phpwind.com # 建立本地掛載目錄,由於在httpd的虛擬主機配置中根目錄就是配置的/www/phpwind.com mount -t nfs 172.16.251.163:/www/phpwind.com /www/phpwind.com # 掛載在本地 mount # 查看是否以掛載成功
測試(以Web Server1爲例)
# 覈對Web服務器的虛擬主機配置 # vi /etc/httpd/extra/httpd-vhosts.conf <VirtualHost *:80> DocumentRoot "/www/phpwind.com" ServerName phpwind.com ServerAlias www.phpwind.com ErrorLog "logs/phpwind.com-error_log" CustomLog "logs/phpwind.com-access_log" common ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.251.163:9000/www/phpwind.com/$1
<Directory "/www/phpwind.com"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
</VirtualHost>
安裝測試
訪問Web Server1以安裝,瀏覽器訪問http://172.16.251.182,會直接跳轉至http://172.16.251.182/install.php開始安裝
在安裝過程當中,需填寫MySQL數據庫的信息,故還需在已有的MySQL中對於phpwind創建相應的數據庫和用戶,
create database phpwind; # 數據庫名爲phpwind grant all privileges on phpwind.* to phpwind@'172.16.%.%' identified by 'phpwind123'; # 可訪問的用戶名和密碼分別是phpwind和phpwind123
安裝並登陸成功
訪問測試
首先在Web Server1上發帖
而後在Web Server2上看帖
一切正常,說明前端Web服務器能正常訪問NFS服務器,這樣就實現了靜態文件的集中存放了。
總結
雖然NFS能夠實現文件共享的強大功能,節省前端Web服務器的磁盤空間,但NFS不適合大規模的訪問場景下,在訪問量不太大的狀況下,做爲圖片服務器或者其餘靜態資源服務器仍是挺不錯的,總之,任何技術都要在適合的場景下才能發揮其最大的功用!