梁 劍,石巖嶺
(1.太原工業(yè)學院計算機工程系,山西太原030008;2.山西大同大學網(wǎng)絡信息中心,山西大同037009)
隨著互聯(lián)網(wǎng)的普及,越來越多的個人、機構(gòu)、企業(yè)接入互聯(lián)網(wǎng)。對于一些機構(gòu)和企業(yè)來說,建設網(wǎng)站可以展示自身,開展相關(guān)業(yè)務,這幾乎是當前這個時代必不可少的部分。
對于這些網(wǎng)站來說,首先,應該要有較高的可靠性,在成本允許的范圍內(nèi)減少一年中的故障時間。除了選擇可靠性高的服務器、磁盤陣列外,提高可靠性最有效的方法是使用雙機或多機熱備份。
其次,要有較高的安全性,安全性包括保密性、完整性、和可用性。保密性就是要確保重要信息不被非授權(quán)地竊取,這主要依賴于軟件系統(tǒng)的設計與實現(xiàn);完整性要確保信息不被偽造、篡改、刪除以及意外丟失,這除了軟件系統(tǒng)的設計外,在服務器上可以通過雙機備份,異地數(shù)據(jù)備份實現(xiàn);服務器上的可用性主要體現(xiàn)在能抵抗各種類型的拒絕服務攻擊(Denial of Service)。
第三,服務器架構(gòu)應具備可伸縮性,對于企業(yè)或機構(gòu)來說,初期可能業(yè)務量少,用戶訪問量少,需要的服務器性能也低,隨著時間的推移,更多的用戶訪問,需要更強的服務器能力。這時需要增加服務器來分擔用戶訪問負荷,這一過程中架構(gòu)不應有大的調(diào)整,特別是軟件部分不應有大調(diào)整,因為軟件的重新開發(fā)需要消耗大量的人力。
架構(gòu)如圖1所示,服務器類型分為反向代理服務器、Web 服務器、數(shù)據(jù)庫服務器。對于初期小型網(wǎng)站來說,可以根據(jù)情況將這三種類型的服務器部署到一臺物理服務器上,以節(jié)約成本。當需要擴展時,將其分布到多臺物理服務器上。
圖1 網(wǎng)站架構(gòu)圖
目前在網(wǎng)站建設中最常見的操作系統(tǒng)是Linux和Windows Server系統(tǒng),Linux的優(yōu)點體現(xiàn)在它是開源免費的軟件,不需要額外支付軟件許可費用。同時多數(shù)服務器軟件如Redis、Nginx、MyCat 等在Linux 平臺上有更好的表現(xiàn)。Windows 的優(yōu)勢主要體現(xiàn)在其操作日常人們的操作習慣類似,沒有特殊情況應選擇Linux操作系統(tǒng)。
多數(shù)支持HTTP協(xié)議的Web服務器都能支持反向 代 理(Reverse proxy),如 Nginx、Apache、Squid、Lighttpd 等,其中Nginx 擁有更好的性能、內(nèi)存占用少,特別是Nginx 社區(qū)比較活躍,軟件功能模塊也多,特別是在高并發(fā)情況下比Apache 有更好的性能[1-2],所以推薦使用Nginx。
Web 服務器的選擇更加依賴于軟件架構(gòu)的設計,目前常見的后端開發(fā)技術(shù)有PHP、Java 等,如果使用PHP開發(fā)可以選擇php-fpm或者Apache,如果使用Java技術(shù),多使用Tomcat。
對于中小型網(wǎng)站來說,多使用免費的MySQL作為數(shù)據(jù)庫,當然也可以根據(jù)實際情況使用Oracle、PostgreSQL等。
配置如下所示,在根的位置(/)將所有的請求轉(zhuǎn)發(fā)到反向代理abc(upstream abc)上,可根據(jù)實際情況調(diào)整,比如將靜態(tài)的HTML 和JPEG 調(diào)整到特定的服務器上。要注意根據(jù)軟件的情況將HTTP報頭傳到后端,主要配置如下所示:
反向代理可以HTTP請求分配后多個后端服務器上,達到負荷分擔的效果。同時,如果某個服務器發(fā)生故障,會被剔除出去,實現(xiàn)多機熱備份的功能[3]。Nginx有多種負荷均衡方式,默認情況下采用輪詢的方式,另外還可以使用ip_hash 和權(quán)重等方式。特別要注意的是除了采用ip_hash 方式,其他的方式會導致同一用戶的請求分配到不同的服務器上,這時應考慮使用Session共享技術(shù),保證數(shù)據(jù)的正確性[4]。
當有多臺web 服務器時,需要保證文件內(nèi)容的同步。Unison 是一個多平臺上的文件同步工具,能夠自動完成兩臺服務器目錄文件的同步,它支持SSH、RSH 和Socket 等多種網(wǎng)絡協(xié)議的同步。Unison 安裝后會在用戶目錄下生成一個名為.unison 的隱藏目錄,在其中存放配置文件、日志文件等。
default.prf是其配置文件,關(guān)鍵配置如下:
root=/home/data/www/ #本地目錄
root=ssh://user@10.1.1.3//home/data/www/ #遠程目錄
fastcheck=true #是否快速檢查
如果是快速檢查,unison 會根據(jù)文件生成的時間來確定版本的先后,是否需要同步。否則會對比兩個文件的異同,多數(shù)情況下使用快速檢查即可。
配置好后利用,利用cron 計劃任務定期調(diào)用unison 即可,要注意非快速檢察花費時間非常長,不適合頻繁調(diào)用。
對于一般的中小型網(wǎng)站推薦使用免費的MySQL 數(shù)據(jù)庫,主從復制就是一臺MySQL 數(shù)據(jù)庫服務器擔任主服務器(Master),多臺服務器擔任從服務器(Slave),可以向主服務器中讀或者寫數(shù)據(jù),但只能對從服務器執(zhí)行讀操作。從服務器根據(jù)主服務器發(fā)來的日志信息,和主服務器保持同步[2]。但這種同步是非實時的,比如向主服務器寫入一條數(shù)據(jù),立刻讀從服務器,不會得到更新后的數(shù)據(jù),這是開發(fā)軟件的人員要注意的地方。
因為從服務器是依賴主服務器的日志才能更新數(shù)據(jù)庫,因此要打開日志
log-bin=mysql-bin//二進制日志名
binlog_format=mixed//日志格式為混合
server-id=1 //設置server-id
接著創(chuàng)建一個用于復制的賬號,同時分配權(quán)限。
GRANT replication slave ON *.* TO 'slave'@'%'IDENTIFIED BY'password';
查看主服務器的日志狀態(tài),并記錄日志位置,然后在從服務器上將日志調(diào)整到與主服務器相同的位置即可。
數(shù)據(jù)庫實現(xiàn)主從復制后,這對軟件開發(fā)者不是透明的,因為寫數(shù)據(jù)是一個服務器,讀數(shù)據(jù)又是另一個服務器,那么可以使用數(shù)據(jù)庫中間件技術(shù)屏蔽這些差別。MyCat 就是其中的佼佼者,它能夠?qū)崿F(xiàn)分庫分表,讀寫分離,故障服務器剔除等。軟件開發(fā)者將不再需要考慮讀寫分離的軟件實現(xiàn)。MyCat 配置的主文件是server.xml
在其中添加一個讀服務器一個寫服務器,主要配置如下:
如果要進行分表操作,可以在schema.xml配置。
使用Nginx 反向代理,可能會出現(xiàn)同一用戶的請求分發(fā)到不同的服務器上,這樣必須保證用戶數(shù)據(jù)的一致性。儲存在數(shù)據(jù)庫的數(shù)據(jù)是多臺服務器共享的,不會出現(xiàn)不一致的情況,而用戶的session數(shù)據(jù)是在服務器上存儲,不能多機共享,因此反這種情況必須實現(xiàn)session 共享?,F(xiàn)在常見的是使用緩存數(shù)據(jù)庫如Redis、Memcache。相對來說Redis功能比較豐富,除了支持Key/Value類型的數(shù)據(jù)外,還支持list、set、hash等數(shù)據(jù)類型,另外redis還能把數(shù)據(jù)持久化到硬盤中。Memcache 的只能將K/V 類型的數(shù)據(jù)存在內(nèi)存中,程序異常結(jié)束將失去所有數(shù)據(jù)。
這里我們以Memcache+PHP 為例,實現(xiàn)安裝好Memcache,以及PHP 中的 Memcache 模塊,在 PHP的配置文件PHP.ini中完成如下配置
session.save_handler=memcache
session.save_path="tcp://10.1.1.12:11211"
傳統(tǒng)的網(wǎng)站中,為了提高性能使用更多CPU、更大內(nèi)存、更強的磁盤陣列的小型機,這無疑會使網(wǎng)站初期就要投入大量成本。使用多臺普通服務器搭建網(wǎng)站能夠?qū)崿F(xiàn)高可靠性、高性能以及易拓展性,這種方案更加適合于中小型網(wǎng)站的建設。