建站服務(wù)器
18.1 lamp簡(jiǎn)介
有了前面學(xué)習(xí)的知識(shí)的鋪墊,今天可以來(lái)學(xué)習(xí)下第一個(gè)常用的web架構(gòu)了。
所謂lamp,其實(shí)就是由linux apache mysql/mariadb php/perl/python的一組動(dòng)態(tài)網(wǎng)站或者服務(wù)器的開(kāi)源軟件,除linux外其它各部件本身都是各自獨(dú)立的程序,但是因?yàn)榻?jīng)常被放在一起使用,擁有了越來(lái)越高的兼容度,共同組成了一個(gè)強(qiáng)大的web應(yīng)用程序平臺(tái)。
lamp指的是linux(操作系統(tǒng))、apache(http服務(wù)器)、mysql(也指mariadb,數(shù)據(jù)庫(kù)軟件)和php(有時(shí)也是指perl或python)的第一個(gè)字母,一般用來(lái)建立web應(yīng)用平臺(tái)
18.2 web服務(wù)器工作流程
在說(shuō)lamp架構(gòu)平臺(tái)的搭建前,我們先來(lái)了解下什么是cgi,什么是fastcgi,什么是……
web服務(wù)器的資源分為兩種,靜態(tài)資源和動(dòng)態(tài)資源。
所謂靜態(tài)資源就是指靜態(tài)內(nèi)容,客戶端從服務(wù)器獲得的資源的表現(xiàn)形式與原文件相同。可以簡(jiǎn)單的理解為就是直接存儲(chǔ)于文件系統(tǒng)中的資源
動(dòng)態(tài)資源則通常是程序文件,需要在服務(wù)器執(zhí)行之后,將執(zhí)行的結(jié)果返回給客戶端。
那么web服務(wù)器如何執(zhí)行程序并將結(jié)果返回給客戶端呢?下面通過(guò)一張圖來(lái)說(shuō)明一下web服務(wù)器如何處理客戶端的請(qǐng)求
如上圖所示
階段①顯示的是httpd服務(wù)器(即apache)和php服務(wù)器通過(guò)fastcgi協(xié)議進(jìn)行通信,且php作為獨(dú)立的服務(wù)進(jìn)程運(yùn)行
階段②顯示的是php程序和mysql數(shù)據(jù)庫(kù)間通過(guò)mysql協(xié)議進(jìn)行通信。php與mysql本沒(méi)有什么聯(lián)系,但是由php語(yǔ)言寫(xiě)成的程序可以與mysql進(jìn)行數(shù)據(jù)交互。同理perl和python寫(xiě)的程序也可以與mysql數(shù)據(jù)庫(kù)進(jìn)行交互
18.2.1 cgi與fastcgi
上圖階段①中提到了fastcgi,下面我們來(lái)了解下cgi與fastcgi。
cgi(common gateway interface,通用網(wǎng)關(guān)接口),cgi是外部應(yīng)用程序(cgi程序)與web服務(wù)器之間的接口標(biāo)準(zhǔn),是在cgi程序和web服務(wù)器之間傳遞信息的過(guò)程。cgi規(guī)范允許web服務(wù)器執(zhí)行外部程序,并將它們的輸出發(fā)送給web瀏覽器,cgi將web的一組簡(jiǎn)單的靜態(tài)超媒體文檔變成一個(gè)完整的新的交互式媒體。
fastcgi(fast common gateway interface)是cgi的改良版,cgi是通過(guò)啟用一個(gè)解釋器進(jìn)程來(lái)處理每個(gè)請(qǐng)求,耗時(shí)且耗資源,而fastcgi則是通過(guò)master-worker形式來(lái)處理每個(gè)請(qǐng)求,即啟動(dòng)一個(gè)master主進(jìn)程,然后根據(jù)配置啟動(dòng)幾個(gè)worker進(jìn)程,當(dāng)請(qǐng)求進(jìn)來(lái)時(shí),master會(huì)從worker進(jìn)程中選擇一個(gè)去處理請(qǐng)求,這樣就避免了重復(fù)的生成和殺死進(jìn)程帶來(lái)的頻繁cpu上下文切換而導(dǎo)致耗時(shí)
18.2.2 httpd與php結(jié)合的方式
httpd與php結(jié)合的方式有以下三種:
a) modules:php將以httpd的擴(kuò)展模塊形式存在,需要加載動(dòng)態(tài)資源時(shí),httpd可以直接通過(guò)php模塊來(lái)加工資源并返回給客戶端
httpd prefork:libphp5.so(多進(jìn)程模型的php)
httpd event or worker:libphp5-zts.so(線程模型的php)
b) cgi:httpd需要加載動(dòng)態(tài)資源時(shí),通過(guò)cgi與php解釋器聯(lián)系,獲得php執(zhí)行的結(jié)果,此時(shí)httpd負(fù)責(zé)與php連接的建立和斷開(kāi)等
c) fastcgi:利用php-fpm機(jī)制,啟動(dòng)為服務(wù)進(jìn)程,php自行運(yùn)行為一個(gè)服務(wù),https通過(guò)socket與php通信
較于cgi方式,fastcgi更為常用,很少有人使用cgi方式來(lái)加載動(dòng)態(tài)資源
18.2.3 web工作流程
下面來(lái)通過(guò)上面的圖說(shuō)明一下web的工作流程
客戶端通過(guò)http協(xié)議請(qǐng)求web服務(wù)器資源,web資源收到請(qǐng)求后判斷客戶端請(qǐng)求的資源是靜態(tài)資源或是動(dòng)態(tài)資源,若是靜態(tài)資源則直接從本地文件系統(tǒng)取之返回給客戶端。否則若為動(dòng)態(tài)資源則通過(guò)fastcgi協(xié)議與php服務(wù)器聯(lián)系,通過(guò)cgi程序的master進(jìn)程調(diào)度worker進(jìn)程來(lái)執(zhí)行程序以獲得客戶端請(qǐng)求的動(dòng)態(tài)資源,并將執(zhí)行的結(jié)果通過(guò)fastcgi協(xié)議返回給httpd服務(wù)器,httpd服務(wù)器收到php的執(zhí)行結(jié)果后將其封裝為http響應(yīng)報(bào)文響應(yīng)給客戶端。在執(zhí)行程序獲取動(dòng)態(tài)資源時(shí)若需要獲得數(shù)據(jù)庫(kù)中的資源時(shí),由php服務(wù)器通過(guò)mysql協(xié)議與mysql/mariadb服務(wù)器交互,取之而后返回給httpd,httpd將從php服務(wù)器收到的執(zhí)行結(jié)果封裝成http響應(yīng)報(bào)文響應(yīng)給客戶端。
18.3 lamp平臺(tái)構(gòu)建
18.3.1 通過(guò)yum安裝方式構(gòu)建lamp平臺(tái)
centos7下構(gòu)建lamp:
要安裝的程序包:httpd,php,php-mysql,mariadb-server
注意:php要求httpd使用prefork mpm
yum-yinstallhttpdphpphp-mysqlmariadb-serversystemctlstarthttpd.servicesystemctlstartmariadb.service
centos6下構(gòu)建lamp:
要安裝的程序包:httpd,php,php-mysql,mysql-server
yum-yinstallhttpdphpphp-mysqlmysql-serverservicehttpdstartservicemysqldstart
18.3.2 編譯安裝lamp
http對(duì)fastcgi協(xié)議的支持:
a) httpd-2.2:需要額外安裝fastcgi模塊
wgethttps://mirrors.tuna.tsinghua.edu.cn/apache//httpd/mod_fcgid/mod_fcgid-2.3.9.tar.bz2tarxfmod_fcgid-2.3.9.tar.bz2cdmod_fcgid-2.3.9./configure.apxsmakemakeinstallb) httpd-2.4:自帶fastcgi模塊
安裝次序:httpd,mariadb,php
安裝httpd-2.2:
cd/usr/srcwgethttp://mirror.bit.edu.cn/apache//httpd/httpd-2.2.32.tar.bz2tarxfhttpd-2.2.32.tar.bz2cdhttpd-2.2.32./configure--prefix=/usr/local/httpdmakemakeinstallecho\\\'path=/usr/local/httpd/bin:$path\\\'>/etc/profile.d/httpd.shsource/etc/profile.d/httpd.shln-s/usr/local/httpd/include//usr/include/httpdecho\\\'manpath/usr/local/httpd/man\\\'>>/etc/man.configapachectlstart
安裝mariadb:
cd/usr/srcwgethttp://ftpmirror.gnu.org/gcc/gcc-5.2.0/gcc-5.2.0.tar.bz2tarxfgcc-5.2.0.tar.bz2cdgcc-5.2.0./contrib/download_prerequisitesyum-yinstallgcc-c glibc-staticgcc./configure--prefix=/usr/local/gcc--enable-bootstrap--enable-checking=release--enable-languages=c,c --disable-multilibmake-j$(cat/proc/cpuinfo|grep\\\'processor\\\'|wc-l)makeinstallecho\\\'exportpath=/usr/local/gcc/bin:$path\\\'>/etc/profile.d/gcc.sh./etc/profile.d/gcc.shln-sv/usr/local/gcc/include//usr/include/gccecho\\\'/usr/local/gcc/lib64\\\'>/etc/ld.so.conf.d/gcc.confecho\\\'/usr/local/gcc/lib\\\'>>/etc/ld.so.conf.d/gcc.confldconfig-p|grepgcc#驗(yàn)證是否導(dǎo)出頭文件cd/usr/srcyuminstall-yncurses-developenssl-developensslcmakemysql-develwgetgroupadd-r-g306mysqluseradd-r-g306-u306mysqlmkdir-pv/data/mydatachown-rmysql.mysql/data/mydatatarxfmariadb-10.2.6.tar.gzcdmariadb-10.2.6cmake.-dcmake_install_p