PHP:腳本編程語言,php解釋器php
Webapp:面向對象的特性前端
Zend:mysql
第一段:詞法分析、句法分析、編譯爲Opcode;web
opcode放置於內存中sql
第二段:執行opcode;數據庫
opcode的轉換是動態完成的,當有用戶訪問第一次一個頁面的時候,由Zend Engine將其轉換爲opcode,然後再去執行這個opcode,當第二次執行同一個腳本的時候,就是直接執行已經編譯好的opcode,因此這樣速度會快一些,可是在不一樣的php進程之間,它們沒法共享opcode,並且opcode是放在內存當中的,因此一關機或把php進程一關閉,這個內容極可能從內存中清除了;apache
爲了不它自身去清除opcode而且實如今多個不一樣的php進程之間共享的功能,就引入了緩存加速器(緩存功能);編程
PHP的緩存器:後端
PHP解釋器如何與mysql交互?瀏覽器
咱們首先須要明確的一點是,須要到數據庫中查詢數據的不是php解釋器,而是使用php開發的web應用程序,php解釋器除了解釋php腳本以外沒有別的能力。程序須要跟mysql交互才交互,不須要就不交互。
php連向mysql時有一個高級的專門的庫,叫驅動,RedHat系列上稱爲php-myssql。
httpd與php結合的三種方式:
做爲web服務器而言,有一個進程叫作httpd進程,web服務器僅能解釋靜態內容,如:圖片、網頁文件、CSS樣式表…,只要不須要執行程序,都是由httpd自身處理的。可是一旦用戶請求的是php腳本的話,httpd自己完成不了這種功能,它必需要藉助於php解釋器來執行它。可是須要事先告訴httpd一旦有客戶端請求php內容,就要調用php的功能來完成解釋這個功能,這種讓httpd跟php完成結合(交互)的方式有三種:
這種方式已經用的不多了。工做在CGI機制時,就意味着在主機上,httpd一旦有用戶請求php頁面內容了,須要有一個進程響應,httpd使用CGI協議啓動另一個獨立進程的,這個進程是CGI進程或php進程,這個進程自己須要建立起來而後運行腳本,運行結束後以進程間通訊的方式返回給這個httpd進程,此時cgi進程工做就結束了;
將php直接編譯成httpd的模塊,他本身不能獨立執行,當httpd用到php功能的時候纔會被裝載執行,由於Apache是模塊化設計的。工做在模塊化時,httpd進程一旦要用到php功能,只須要將這個模塊從磁盤上加載進來在它自身內部運行便可,不須要啓動一個新進程,只須要一個進程完成全部功能,而不須要兩個進程了;
安裝一個服務器軟件,這個服務器軟件自身就能夠提供可以執行php腳本的cgi進程,而且事先建立了多個空閒進程。當httpd有請求動態頁面時,httpd發現用戶請求的是動態內容,使用php解釋器(httpd服務器裏有)向對方請求獲取一個進程便可,此時進程由後端php服務器建立,再也不由httpd建立,這就是fastcgi。對於這種方式,還需安裝php服務器,這裏的服務器有守護進程(Daemon)的概念,意味着可使用service xxx start啓動,能夠監聽在某個套接字(Socket)上。而像之前所裝的php,是以模塊化的方式工做的,他不會啓動一個服務器,也不會監聽端口,可是若是要以fastcgi方式工做,就必須監聽在一個端口上,默認監聽在9000這樣的端口上;
在平時,用戶請求的靜態內容(靜態即在服務器端不須要執行腳本的,不須要執行程序的內容),像圖片、視頻、CSS等不須要執行程序,只須要原封不動的給客戶端,讓客戶端直接打開另一個程序便可,但在服務器上不須要執行程序。
httpd自己就是模塊化的,它的衆多功能都是經過模塊實現的,好比用戶的認證,基於IP地址或基於用戶的認證裏邊都是模塊,因此把PHP作成它的模塊也是能夠工做的,可是php自己要比其餘模塊要複雜的多,因此通常而言,把php作成模塊當然能實現很簡便的管理,可是性能並非特別好。
Apache、php、mysql位於同一主機與位於不一樣主機各有利弊,位於不一樣主機上時,它們之間的通訊都要封裝成TCP/IP報文,經過網線發送才能夠。這中間涉及到大量的IO操做,若是網絡足夠慢的話,那它們之間結合的性能可能比較差,而放在本機內部是比較快的。因此究竟是分開部署仍是放在一塊兒,得看請求規模有多大,若是自己併發的用戶不會超過20個,放在同一臺主機上沒有問題,若是很是多,只能分層次實現了,有2層設計,也有3層設計。分爲WEB服務器、應用程序服務器(之因此稱爲應用程序服務器是由於之後所實現的動態網站可能不只僅有動態服務器的,如JSP。而應用程序服務器可以接受用戶來自於前端的請求,而且應用程序服務器須要的時候再跟數據庫打交道)、數據庫服務器
須要明確的是,若前端併發有300個請求進來,並不意味着在應用程序服務器上能看到300個請求,由於不必定都是動態請求。因此若是300個請求中只有50個動態請求,同時50個請求中不必定都是要請求數據庫的,要請求數據庫的可能只有三兩個。
另外,一個頁面文件中間可能包含多個WEB對象,這多個web對象有的是靜態的,有的是php動態腳本。通常來說,靜態內容都由前端WEB服務器直接處理,只有動態內容才交給應用程序服務器。
靜態內容的響應速度比動態內容快的要多得多的多。通常來說一個httpd服務器假若有512M內存,讓用戶請求phpmyadmin的主頁面,壓力測試通常來說能響應500個請求就足夠快了。可是一樣的內容若作成靜態內容,不讓執行php,即將php的結果緩存下來,讓httpd直接處理,通常來說1s內響應1W個請求是很輕鬆的。因此動態內容雖然和靈活好用,可是代價是很是大的。那麼如何讓它快一些呢?能夠將php的執行結果(注意:不是編譯結果,執行並查詢數據庫生成的靜態內容返回給客戶端的內容才叫執行結果)緩存下來,下一次由WEB服務器直接獲取緩存的內容便可。這種機制就叫動態內容的靜態化,而這對於優化站點來說很重要,經過這種機制將大量動態內容緩存爲靜態內容就能夠顯著提升服務器性能。
咱們在開始搭建LAMP平臺以前須要注意的是:
LAMP:Linux、Apache、MySQL、PHP(Python、Perl)
使用的軟件及其版本:
在此以前確保未安裝rpm包版本的LAMP平臺
安裝次序:
httpd --> MySQL --> php --> XCache
由於php要想鏈接到MySQL上,必需要在編譯php時告訴它MySQL在哪,使用哪一個MySQL。因此必需要先配置安裝MySQL,而後才能安裝php;
解決依賴關係:
在開始以前,咱們須要知道httpd是經過虛擬機來實現跨平臺的。固然,這個虛擬機也不叫虛擬機,而是叫apr(Apache Protable Runtime,Apache可移植運行環境);
httpd-2.4.4須要較新版本的apr和apr-util,所以須要事先對其進行升級。升級方式有兩種,一種是經過源代碼編譯安裝,一種是直接升級rpm包。這裏選擇使用編譯源代碼的方式進行。
apr程序在系統上是裝好了的。
注意:
httpd 2.4依賴於apr1.4,可是系統上自動安裝的apr已過期,所以須要從新安裝apr和apr-util。可是老版本又不能卸載,由於它可能被別的軟件所依賴,也不能直接升級。因此只能使用多版本並存的機制,把新版本安裝在與老版本不在同一個位置便可。
軟件包安裝後文件放置的位置:
咱們再來回憶一下,通常來說,rpm包格式的軟件安裝的時候:
所以咱們此處約定,編譯安裝時:(安裝在不一樣路徑下,就不會覆蓋老版本了)
可是若是編譯安裝了不少軟件,每個軟件都放在此目錄下,要想卸載的話,只能一個一個刪除,方便的作法是安裝在一個同名的目錄下,如:/usr/local/apr/{bin,sbin,etc,lib,includes,share/doc,share/man};
可是這樣還有一個問題,二進制程序路徑時/usr/local/apr/bin,再也不PATH中,不能直接執行命令,所以須要修改PATH。庫文件、man一樣如此。
確保開發環境已安裝好;
下載安裝環境:
先安裝apr,再安裝apr-util,由於util依賴於apr,以後才裝httpd;(須要注意的是,RedHat已經安裝好了apr1.4,不須要在編譯安裝了)
將軟件時間同步爲硬件時間:
編譯安裝apr:
注意:對於新版apr來說,只是對於httpd有用,只要在安裝httpd的時候告訴它apr在哪便可。因此此處不須要輸入其bin路徑,也不須要數據頭文件與庫文件。httpd本身會找的。
到此爲止不須要額外配置。
編譯安裝apr-util:
--with-apr用於指定apr的安裝路徑;
附:apache官方對APR的介紹:
The mission of the Apache Portable Runtime (APR) project is to create and maintain software libraries that provide a predictable and consistent interface to underlying platform-specific implementations. The primary goal is to provide an API to which software developers may code and be assured of predictable if not identical behaviour regardless of the platform on which their software is built, relieving them of the need to code special-case conditions to work around or take advantage of platform-specific deficiencies or features.
httpd-2.4.4編譯過程也要依賴於pcre-devel軟件包,須要事先安裝。此軟件包系統光盤自帶,所以,找到並安裝便可。
configure選項:
configure選項: --sysconfdir=DIR:指定配置文件路徑(不改的話只能到默認安裝路徑下的/etc/找,而對於Apache來說不是/etc/目錄,而是默認安裝路徑下的/conf目錄) --enable-mods-share=MODULE-LIST:是否啓用共享模塊,all表示全部共享模塊,most爲大多數,few爲僅有幾個,realyall --enable-mods-static=MODULE-LIST:靜態編譯進去的 --enable-authn-…:啓用哪一種認證功能。默認基於文件的認證 必定要加上去的功能: --enable-so:默認的,支持動態共享模塊,若不支持這個功能,php將沒法以模塊方式跟Apache結合工做 --enable-ssl:啓用ssl功能,也是必須的,否則沒法使用https --enable-defalte:客戶端訪問服務器靜態內容時,這個靜態內容要經過網絡傳遞給客戶端,這些內容若是都是文本內容,文本內容一壓縮體積很是小,若是帶寬有限,
每次傳輸前都壓縮一下會節約不少帶寬。defalate是一種壓縮機制,它能將頁面自動讓httpd服務器壓縮一下再傳遞給瀏覽器,
而瀏覽器也能夠再解壓縮查看,這是經常使用的壓縮機制。 --enable-expires:過時首部控制 --enable-fcgi:若是未來打算讓Apache跟php結合時是以fastcgi的方式工做的,這個須要啓用。 --enable-mpms-shared=MPM-LIST:打算以共享方式啓用哪些MPM,在2.2中沒有,但在2.4中有了,Apache支持MPM的 MPM(多道處理模塊):prefork、worker、event, 事實上到底支持哪種MPM在編譯的時候就肯定了,在2.4的時候有一個特性,便可以以模塊化方式使用MPM,意味着能夠將這三個同時編譯進來,
想用哪一個切換便可。可是有一個缺陷,php以模塊化方式跟Apache結合的時候,若是使用prefork,php很簡單,但若是使用worker或event,php必需要編譯成zts格式,
所以若是須要靈活使用不一樣格式的話,須要編譯兩次php。假設只要機器支持,默認推薦使用event(假設性能最好),因此在2.4默認是event,而2.2默認是prefork。 --with-mpm=MPM:定義哪個爲默認的MPM,若不指定默認通常爲event。 --enable-rewrite:支持URL重寫 --enable-cgi:支持cgi --enable-cgid:被線程方式的MPM使用,因此使用的如果event或worker的MPM,啓用cgid
[root@localhost httpd-2.4.4]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-rewirte --enable-ssl --enable-cgi --enable-cgid -enable-mble-cgi --enable-cgid -enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
注意:Apache是受SELinux控制的,因此若是啓動了SELinux,httpd會沒法啓動,須要確保SELinux關閉。
啓動Web服務器:
注意:只有使用rpm包安裝時纔有安裝腳本,本身手動安裝的沒有此腳本;
在安裝路徑的bin下有一個apachectl腳本,使用這個腳本啓動便可:
apachectl是沒法直接加入chkconfig的,要想加入chkconfig須要加入兩行,此處再也不演示;
安裝後的目錄:
bin:二進制程序(不在PATH環境變量當中,執行時須要加入路徑) build:編譯時的目錄 cgi-bin:執行cgi程序的存放位置 error:錯誤信息 htdocs:網頁文件的位置
icons:圖標
include:頭文件,如有人要對Apache作二次開發,須要用到這個目錄
logs:日誌文件
man:幫助文件
manual:官方手冊
modules:模塊目錄
補充:
(1)構建MPM爲靜態模塊
在所有平臺中,MPM均可以構建爲靜態模塊。在構建時選擇一種MPM,連接到服務器中。若是要改變MPM,必須從新構建。爲了使用指定的MPM,請在執行configure腳本 時,使用參數 --with-mpm=NAME。NAME是指定的MPM名稱。編譯完成後,可使用 ./httpd -l 來肯定選擇的MPM。 此命令會列出編譯到服務器程序中的全部模塊,包括 MPM。
(2)構建 MPM 爲動態模塊
在Unix或相似平臺中,MPM能夠構建爲動態模塊,與其它動態模塊同樣在運行時加載。 構建 MPM 爲動態模塊容許經過修改LoadModule指令內容來改變MPM,而不用從新構建服務器程序。在執行configure腳本時,使用--enable-mpms-shared選項便可啓用此特性。當給出的參數爲all時,全部此平臺支持的MPM模塊都會被安裝。還能夠在參數中給出模塊列表。默認MPM,能夠自動選擇或者在執行configure腳本時經過--with-mpm選項來指定,而後出如今生成的服務器配置文件中。編輯LoadModule指令內容能夠選擇不一樣的MPM。
修改httpd的主配置文件,設置其Pid文件的路徑
注意: pid文件通常來說應該放在/var/run下,放在logs中彷佛不太穩當,要想放在/var/run下須要編輯配置文件:
先關閉Apache:
進程一關,pid文件就自動刪除了
提供SysV服務腳本/etc/rc.d/init.d/httpd,內容以下:
要想此文件順利執行確保pid文件在/var/run下;
#!/bin/bash # # httpd Startup script for the Apache HTTP Server # # chkconfig: - 85 15 # description: Apache is a World Wide Web server. It is used to serve \ # HTML files and CGI. # processname: httpd # config: /etc/httpd/conf/httpd.conf # config: /etc/sysconfig/httpd # pidfile: /var/run/httpd.pid # Source function library. . /etc/rc.d/init.d/functions if [ -f /etc/sysconfig/httpd ]; then . /etc/sysconfig/httpd fi # Start httpd in the C locale by default. HTTPD_LANG=${HTTPD_LANG-"C"} # This will prevent initlog from swallowing up a pass-phrase prompt if # mod_ssl needs a pass-phrase from the user. INITLOG_ARGS="" # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server # with the thread-based "worker" MPM; BE WARNED that some modules may not # work correctly with a thread-based MPM; notably PHP will refuse to start. # Path to the apachectl script, server binary, and short-form for messages. apachectl=/usr/local/apache/bin/apachectl httpd=${HTTPD-/usr/local/apache/bin/httpd} prog=httpd pidfile=${PIDFILE-/var/run/httpd.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd} RETVAL=0 start() { echo -n $"Starting $prog: " LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} -d 10 $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } reload() { echo -n $"Reloading $prog: " if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then RETVAL=$? echo $"not reloading due to configuration syntax error" failure $"not reloading $httpd due to configuration syntax error" else killproc -p ${pidfile} $httpd -HUP RETVAL=$? fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;; condrestart) if [ -f ${pidfile} ] ; then stop start fi ;; reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}" exit 1 esac exit $RETVAL
然後爲此腳本賦予執行權限並重啓:
加入服務列表,設定開機自啓:
將Apache安裝目錄的bin目錄命令加入PATH路徑中:
從新登陸便可生效:
默認使用的是event模塊;
換一種MPM模塊:
httpd2.4新特性:
--enable-mpms-shared=all --with-mpm=event
異步讀寫能夠大大提高httpd的工做性能。
對於基於IP的訪問控制:
在httpd2.2及以前使用
Order allow deny
allow from all
而在2.4中,上述功能已廢棄,再也不支持此方法,在2.4中使用Require user:
Require user USERNAME
Require group GROUPNAME
Require ip IPADDR
Require host HOSTNAME
IP地址格式:
IP NETWORK/NETMASK NERWORK/LENGTH NET(如:172.16.0.0/255.255.0.0,也可使用172.16.0.0/16,還可使用172.16)
主機名格式:
HOSTNAME
DOMAIN
如:www.magedu.com
.magedu.com
容許全部主機訪問:
Require all granted
拒絕全部主機訪問:
Require all deny
若指定不容許訪問,在Require 後加not便可,如:
Require not ip IPADDR
注意:Require使用的匹配機制是最佳匹配機制,誰的匹配範圍最小、精確,誰生效。固然還要注意自上而下的匹配次序,須要摸索一下才能獲得最精確的使用方式,通常來說,它是使用結合次序以及最佳匹配完成的。
httpd2.4新增長的模塊:
上述模塊是2.2中不具有的;
mod_proxy_fcgi:在2.2中要想使用fastcgi的功能,還得像httpd額外安裝第三方fastcgi模塊。而2.4中不須要,使用—enable-modules=most,這個模塊就會被默認裝載(編譯)的。mod_proxy_fcgi是做爲mod_proxy的一部分(子模塊),但mod_proxy不是新增的,早期就有,這是核心模塊,而mod_proxy_fastcgi是其功能的補充。