一、網絡協議基礎
(一)tcp三次握手
第一次握手:發送請求連接包給服務器。客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到請求連接後,返回一個可以連接的應答包。服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到應答包後再向服務器端發送收到應答包的確認包。客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
(二)socket
程序通過socket進行通信。作爲進程通信機制,用於描述IP地址,端口,是一個通信鏈的句柄。sochet實際上是對tcp/ip協議的封裝,socket本身不是協議,而是一個調用接口(API)
通過Socket,我們才能使用TCP/IP協議。TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口。
socket函數接口:,比如create、listen、connect、accept、send、read和write等等。
套接字之間的連接過程分爲三個步驟:服務器監聽,客戶端請求,連接確認。
1、服務器監聽:服務器生成一個監聽socket,實時監聽來訪socket。服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。
2、客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。
爲此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然後就向服務器端套接字提出連接請求。
3、連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程(一個新的socket),把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。
而服務器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。
三、http協議
1、HTTP/0.9 的特性
只支持html標籤,只支持純文本內容。
只有GET一個方法,能請求簡單的頁面。
2、http/1.0 特性
除支持html標籤以外,引入了MIME,可以傳純文本以外的內容;
增加了七個方法,從而增強了訪問服務器的方式,使動態網頁訪問方式更多。
(1)MIME
MIME:multipurpose Internet Mail Extension ,多用途互聯網郵件擴展。
在傳輸前,把非文本數據重新編碼爲文本格式,接收方用相反的方式將其重新還原爲原來的格式,還能調用相應的程序打開此文件。
smtp(簡單郵件傳輸協議): 只能傳輸純文本郵件。
在smtp中引入了MIME後可以傳輸多種文件了。如圖像、視頻等。
將MIME引入到http當中,所以現在的網頁可以傳輸豐富的文件。
客戶端瀏覽器向web服務器請求數據--》服務器收到請求把響應的文件組織成一個Html文件傳給客戶端時,都在前面加了格式類型(如 image/jpg)--》客戶端覽器收到服務器傳回來的html頁面時,會利用瀏覽器中的相應的插件來打開此html頁面中包含的文件並展示出來(現在瀏覽器可以解析幾百種文件格式。如果沒有這種文件的插件就無法打開,如flash,就需要手工安裝插件)
(2) http/1.0的幾個方法:
GET:從服務器獲取資源到本地
POST:提交
head:
PUT:
DELETE:遠程從服務器端刪除某文件。
trace:
options
connection
(3)動態網頁的執行過程:
服務器端存儲的文檔非Html格式,而是編程語言開發的腳本。服務器端腳本接受參數之後(客戶端通過get方法或post方法把參數傳遞到服務器)在服務器運行一次,運行完成之後生成的html格式文檔,再把生成的Html文檔發給客戶端。
動態網頁包含動態網頁和靜態網頁。
3、http/1.1
在http/1.1的基礎上增加了以下兩項功能:
(1)增強了緩存的功能
(2)長連接機制
在http1.0中,一次連接只能作一次http請求,即請求一次,連接一次,請求完成立即斷開連接。
http1.1以後,可進行長連接,即可以一次連接多次請求,即請求連接後就不斷開,後續請求直接傳送。
如果用在請求不是很大的環境中可以很大的提升訪問性能,但在訪問量大的請況下不建議開啓此功能。
4、http報文
(1)請求報文:
<method><request-url><version> //資源獲取方法,請求的資源是什麼,協議版本號
<headers> //頭部
//空白行,一定要的
<entiy-body> //報文主體
(2)響應報文:
<version><status><reason-phrase> //響應協議版本,狀態代碼,狀態碼解釋。
<headers> //頭部
//空白行
<entiy-body> //響應報文體
狀態碼:
1xx:純信息。
2xx:“成功”類的信息。 200,請求資源正常。
3xx:重定向類的信息。 301,永久重定向; 302,臨時重定向; 304,沒有發生改變。
4xx:客戶端錯誤類信息。 404,請求了一個不存在的文件;
5xx:服務器端錯誤類的信息。
例:
請求報文:
GET /2.html HTTP/1.1 //GET方法/找服務器根文件夾下2.html的內容,爲空就是默認網頁/協議版本1.1
Host:www.loready.cn
connection:keep-alive //上兩行都是頭部,主機名是loready,連接類型是長連接。
響應報文:
HTTP/1.1 200 OK //版本號是1.1 /200狀態碼,即正常/ok即成功。
5、web服務器的主要操作:
建立連接:接受巨型拒絕客戶端連接請求。
接收請求:通過網絡讀取HTTP請求報文。
處理請求:解析請求報文並做出相應的動作。
訪問資源:訪問請求報文中相應的資源
構建響應:使用正確的首部生成http響應報文
發送響應:向客戶端發送 生成的報文。
記錄日誌:完成傳輸後記錄進日誌。
二、apache
(一)安裝
1、rpm安裝:略
2、編譯安裝
(1)先安裝mysql
(2)編譯安裝apr1.4以上版本,且不能卸載老的版本以防其他軟件對老版本的依賴,所以只能裝到不同的路徑下。編譯安裝完即可,其他不用設定。
apr :Apache Portable Run-time Librarie (apache的可移植運行庫),我們都知道apache有很多版本,比如說w32的版本,network的版本等多種操作系統平臺的版本,
那麼這麼多的版本apache官方是不是每個操作系統平臺都要新開發一個版本呢?,這個對apache官方來說不是什麼難事,而對於那些開發模塊的人來說,我開發一個新功能到底是跑在linux版本的apache還是跑在windows版本的apache呢?那麼對於開發模塊的那些人是不是也要開發不同操作系統的模塊,這樣豈不是很苦惱的一個事情,那麼有了apr以後,對於應用程序而言.它們根本就不需要考慮具體的平臺,不管是Unix .Linux還是Window的,apr類似java虛擬機,讓apache跑在apr上.這樣一來就方便多了.
#cd /usr/local/src
#tar zxvf apr-1.4.6.tar.gz
#cd apr-1.4.6
#./configure --prefix=/usr/local/apr
# make
#make install
(3)編譯安裝和apr-util(工具集)。在編譯時要指定apr的安裝位置,./configure時需加上 --with-apr="apr路徑"
#cd /usr/local/src
#tar zxvf apr-util-1.4.1.tar.gz
#cd apr-util-1.4.1
#./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr或--with-apr=/usr/local/apr/bin/apr-1-config
#make
#make install
(4)編譯安裝httpd2.4以上版本。
先安裝 openssl-devel和pcre-devel解決依賴關係。
.configure/選項:
./configure --prefix=/usr/local/apache(安裝目錄) --enable-so --enable-ssl --enable-cgi --enable-cgid --enable-rewrite --with-ssl --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util(指定apr和apr-uitl路徑)
(二)安裝文件詳解:
1、rpm包安裝後的文件
httpd: selinux事先要讓處理permssive或disabled)
httpd安裝後的目錄和進程:
/usr/sbin/httpd
httpd:root,root (主導進程)
httpd:apche,apache(工作進程 )
/etc/rc.d/init.d/httpd (服務腳本)
/etc/httpd :工作目錄,相當於程序安裝目錄
/etc/httpd/conf 配置文件目錄
主配置文件:http.conf
/etc/httpd/conf.d/目錄下的所有.conf文件,均爲主配置文件的組成部分。因爲主配置文件較大,採用分段配置。
/etc/httpd/modules:模塊鏈接,文件不存在此,只是做了軟鏈接
/etc/httpd/logs 也是軟鏈接,是日誌文件。分爲訪問日誌和錯誤日誌。
/var/www/html 網站靜態頁面存放目錄
/var/www/cgi-bin 網站動態頁面存放目錄
2、編譯安裝後的文件
/bin 下的 apachectl是啓動程序。
(三)環境配置
1、把二進制目錄導入PATH環境變量
export httpd_home=/usr/local/apache2/bin
export PATH=$PATH:httpd_home
2、增加自啓動
cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd //把apache加入到系統啓動
vi /etc/init.d/httpd //編輯httpd腳本,加入兩行
在#!/bin/sh下面添加以下兩行
#chkconfig:2345 10 90
#description:Activates/Deactivates Apache Web Server
3、chkconfig --add httpd //把httpd加入到啓動腳本中。一定要先在腳本中加入前面兩行纔可以。
(四)apache工作機制:
1、處理響應過程:
httpd不處理動態web內容,是通過某種協議調用額外的程序來運行,並把運行後的結果取回,再返回給客戶。
CGI:通用網關接口,就是讓web服務器與其他應用程序打交道的協議。可通過CGI通信的程序有,php,java(jsp),perl 等等,都是httpd通過CGI把請求發給相關動態頁面處理程序,並從動態頁面處理程序處拿到處理結果,再傳給hpttd,httpd將拿回的結果與自已的頁面統一整合後,發給客戶端。
用戶--->httpd(index.cgi)--->spawn process(處理index.cgi)並把結果傳給 -->httpd -->client
web服務器(如HTTPD)與動態處理程序服務器(如PHP服務器,perl服務器,jsp服務器 等)可以是分開的。web服務器只處理靜態頁面,動態頁面處理程序專處理動態頁面。
2、響應模式
MPM:
prefork 一個請求用一個進程響應,這個是默認。即來一個請求就開一個進程專門響應,併發響應多個請求,所以會同時開啓很多個進程。
worker 一個請求用一個線程響應。啓動多個進程,每個進程生成多個線程,多個線程共享一個進程。
event 一個進程處理多個請求(2.4以上才支持)
/etc/sysconfig/http更改響應模式。
(四)httpd配置文件:
分三段:
--------------------------------------------------------------------------------------------------------
1、全局配置
serverRoot "/etc/httpd" //服務器配置文件及日誌文件位置
pidfile run/httpd.pid //用來指定http.pid的位置。此文件記錄httpd進程的ID,即進程號。httpd能自動複製其自身。因此係統中有多個httpd進程。但只有一個是初始末進程。即父進程。此處指定的文件就是記錄http的父進程號。
timeout 120 //指定客戶端與服務器連接超時的時間間隔。超過這個時間服務器沒響應,就斷開連接。
#長連接配置
keep alive off //長連接機制。Off是不使用長連接機制。長連接的工作原理在http1.1中有詳解。
maxkeepalive requests 100 //如開啓長連接機制,每一次連接可提出的請求數,即一次長連接可以接受最多多少個請求數,達到這個數就會中斷連接,後續請求會重新連接。設爲0時,爲不限制
keepalive timeout 15 //一次連接多次請求之間的間隔時間。如果一次連接後,在完成一次請求後,在這個間隔時間之內,沒有收到下一個請求就中斷連接。以秒爲單位。即兩次請求的最大時間間隔。超過就中斷連接。
#prefork模塊,一個請求用一個進程響應,這個是默認。即來一個請求就開一個進程專門響應,併發響應多個請求,所以會同時開啓很多個進程。
<IFModule prefork.c>
min spareserver 5 //最小空閒進程數。即最少要有5個進程是空閒的。
max spareservers 20 //最大空閒進程數。在使用子進程處理http請求的web服務器上,要先生成子進程才能處理客戶端的請求,因此反應會有一點延遲。但是apache服務器預先生成多個空餘的子進程駐留在系統中,一旦出現請求就用這些空餘的進程進行處理,就可以擺脫這種生成子進程造成的延遲現象。
但隨着請求越來越多,子進程會越開越多,並且完成請求後,打開了的子進程就不會自動退出,等待下個請求。但是這樣子進程只增加不減少,佔用服務器資源。所以設置一個空閒子進程上限。當空閒子進程超過上限數時,會自動關掉一些空閒子進程, 降到最大空閒進程數之下。
min spareservers 是設定空閒子進程不得少於這個數。 max spareservers 是指最大子進程數,超過的就關掉。
startserver 8 //httpd啓動時開啓的進程數。這個參數應設爲上面的 min 和max 之間的一個數。不然就沒有意義了。
serverlimit 256 // 默認最大連接只有256,所以爲了加大客戶併發連接數,就需要此處定義。最大爲20000。要更改此數,要先關掉Http服務,然後更改,再啓動才行,不能先改再重啓,那樣不會生效。
maxclients 256 //設置最大併發連接此服務器的客戶數。限制同時連接此服務器的客戶數目。
maxrequstperchild 1000 //每個進程處理一定次數的請求後,就退出此進程,重新生成一個乾淨的進程。此處爲一個進程處理1000次請求後就關掉,重新生成一個乾淨的進程。設爲0的話,一個進程可以無限制處理請求的次數。
</IFModule>
# worker模塊,這個模塊支持全新的多線程和多進程混合模型的MPM,即一個請求用一個線程響應。啓動多個進程,每個進程生成多個線程,多個線程共享一個進程。。編譯安裝時,加上configure --with-mpm=worker即可。
<IfModule worker.c>
StartServers 2 //開啓Http時啓動的進程數。是進程,進程中生成多個線程來處理請求。默認最大的子進程總數是16,加大時也需要顯式聲明ServerLimit(最大值是20000)。
MaxClients 150 //最多用戶請求數。
MinSpareThreads 25 //最小空閒線程數,是指所有進程中的所有空閒的線程數的總和,不是指單個進程的空閒進程數。
MaxSpareThreads 75 //最大空閒線程
ThreadsPerChild 25 //每個進程最多可以生成的線程數。ThreadsPerChild是worker MPM中與性能相關最密切的指令。ThreadsPerChild的最大缺省值是64,如果負載較大,64也是不夠的。
這時要顯式使用ThreadLimit指令,它的最大缺省值是20000。Worker模式下所能同時處理的請求總數是由子進程總數乘以ThreadsPerChild值決定的,應該大於等於MaxClients。
MaxRequestsPerChild 0 //每一個進程響應多少個請求。0不做限定。
</IfModule>
#端口設定
listen 80 //設置服務器的監聽端口,和客戶端的請求的IP地址(服務器的IP地址)。 可以重啓一行,設置多個端口,但建議爲默認的。
#加載模塊
loadmodule //爲服務器啓動時的動態加載模塊。httpd是模塊是動態加載的,可以手工添加需要加載的模塊。
#Include conf.d/*.conf //設定子配置文件目錄。即此文件下的.conf文件都會包含進來。
user apache
group apache //設置httpd運行後,權限所屬爲此處定義的用戶和組。是Apache的安全保證。默認是apache帳號和組。此選項只在standalone模式中運行。intetd模式在inetd.conf中指定運行apache的用戶。一般爲web服務設定一個特定的用戶和組。並在這裏更改用戶的用戶和組設置。
---------------------------------------------------------------------------------------------------------
2、主服務器段
#管理員郵件
serveradmin root@localhost //指定管理員的郵件地址。當出錯時,會發送郵件給這個郵件地址。
servername localhost //缺省不需要指定。服務器將自動通過DNS解析獲得自已的名字。但有時候DNS服務器出錯,沒有正式的DNS名字,也可指定IP地址。此處設置即爲指定服務器對外的正式名字。特別是在一個服務器有多個別名的情況下,總是返回這個正式名給外部。
#網站存放目錄
documentroot "/var/web/www/html" //指定存放網頁的根目錄位置。可自行指定。如果要啓動虛擬機,此處就要註釋掉,主服務器和虛擬機不能共存。
#目錄和文件的訪問控制
apache對網頁文件所在目錄的訪問控制有有兩種方法:一種是設置httpd.conf對每個主頁目錄及文件進行訪問控制。但這種方法每次更改後都需重啓HTTPD。
二是在每個網頁所在目錄下設置訪問控制文件。通常訪問文件名字爲htaccess,所以一般用httpd.conf來配置服務器系統的整體安全控制策略。而使用每個目錄下的htaccess文件設置具體目錄的訪問控制更爲靈活。
目錄的訪問控制
<directory "/var/web/www/html"> //要設定權限的目錄名,此例是設定目錄/var/web/www/html的訪問權限。
option Indexes FollowSymLinks //用來設置區塊的功能,這裏默認是允許索引目錄和符號連接。
allow override none //可以設定目錄屬性是否可以覆蓋系統對權限的設定或設定認證方式才能訪問。一是上級目錄的權限會自動繼承下來,此處設置可另設置與上級目錄不一樣的權限。
//二是不使用目錄中htaccess文件中規定的權限,在此處另設權限。
order allow,deny //用於定義哪些主機(基於IP,網絡地址等)可以訪問此目錄,或不能訪問此目錄。這裏設置當allow 和deny相沖突時,這裏的意思是除了允許的,都拒絕。
Allow from all //此處設置哪些主機可以訪問或不能訪問,一般把IP地址加在後面,這裏是允許所有。
</directory> 注意,目錄的權限是可以繼承的。
option 的參數詳解:
All: 用戶可在此目錄中做任何事情。所有目錄特性都有效。最好不要設定此項。
None: 不允許訪問此目錄。所有目錄特性都無效。
FollowSymlinks: 可以使用符號連接到不在此目錄中的文件或目錄參數。只有符號連接的目的與符號連接本身爲同一用戶所擁有時才允許訪問。此項在location中無效。
execcgi: 允許在此目錄中執行CGI程序。
Indexes: 允許索引目錄,一般不要啓用。在沒有index.htm等索引文件時,能向瀏覽器發送這個目錄下的列表。
Includes: 提供ssi功能。
includes noexec: 提供ssi功能,但不允許執行CGI程序中的#exec #include命令。
multiviews: 使用權用內容商議功能。服務器和瀏覽器相互溝通後,決定返回哪個網頁給客戶,即決定網頁傳遞性質。如多語言版網頁時,可以定義網頁瀏覽器優先返給用戶英文版網頁內容。此功能需單獨加上。
symlinks if owner mactch:當符號鏈接指向的文件或目錄擁有者和當前用戶帳戶相符,則服務器會通過符號鏈接訪問不在該 目錄下的文件或目錄。
allow override 參數詳解:
all:缺省值。使訪問控制文件可以覆蓋系統配置。即以.htaccess文件的權限爲準。
none:服務器忽略訪問控制文件的設置。即htaccess和上級目錄權限無法影響到此目錄的權限,以此目錄自已的權限爲準。
fileinfo:允許訪問控制文件中使用 add type等參數設置。即htaccess文件中可以用addtype參數。
options:允許訪問控制文件中用option參數定義目錄的選項
authconfig:允許控制文件使用權用authname authtype等針對每個用戶的認證機制。使用權目錄主能用口令和用戶名來保護目錄。允許對訪問目錄的客戶機的IP地址和名字進行限制。
例:目錄採用認證方式訪問:
<Directory "/var/web">
Options none
AllowOverride AuthConfig //設定目錄採用用戶認證機制訪問。
AuthName "Reqstricted site" //認證的名字,只是起個名字,沒有物別意義
AuthuserFile "/etc/httpd/conf/htpasswd" //認證時用戶名和密碼存放的文件夾。 用htpasswd命令來創建htpasswd文件並添加、刪除用戶和密碼。第一次使用時:htpasswd -c /etc/httpd/conf/htpasswd khp 只能第一次使用時用-c選項,如已有此文件就不能用-c,否則會把原來的文件刪除了。
AuthGroupFile "/etc/httpd/conf/group" //定義組認證文件,在目錄下創建group文件,並且把下面的組名加進去,在組名後面加入用戶名即可。例:cat >group myuser:khp,tom //即myuser組中,有兩個用戶允許訪問
Require user marion //marion在這裏是用戶名
#Require valid-user //允許htpasswd中的所有用戶訪問。
Require myuser //允許myuser組訪問。
控制文件的設定
access filename .htaccess //定議第每個目錄下的訪問控制文件的文件名。默認是 htaccess。可以更改這個文件裏的內容來改變不同目錄的訪問控制。
文件的訪問控制:
以上是目錄的訪問控制,此處是單個文件的訪問控制。
<file ~ " ^\.ht">
order allow,deny
deny from all
<files>
//不允許訪問任何.ht的文件。
針對文件來設置訪問控制。不管文件位於哪個目錄下,只要名字匹配就要受到相應控制。
#索引文件優先順序
DirectoryIndex index.html indx.htm indx.php index.cgi //定義每個目錄中的默認的網頁文件名稱。排在前面的優先。當網頁目錄中同時擁有幾個索引網頁文件時,排在前面的作爲索引文件。當網頁目錄部沒有上述中的任何一個文件時,將返回主目錄的目錄列表給客戶。
#網頁關聯程序:
TypesConfig /etc/mine.types //設置各種文件類型關聯。讓網頁瀏覽器知道該使用哪種軟件來處理這些文件。把網頁中包含的各種文件類型通知網頁瀏覽器。
DefaultType text/plain //當無法識別文件類型時,則當成文本來處理。即當web服務器不能識別一個文件的類型時,就用此處定義的類型打開,此例子中定義的類型爲文本類型。
<ifmodule mod_mine_magic.c>
MIMEMagicFile /usr/share/magic.mime
MIMEMagicFile conf/magic
</ifmodule>
//除了根據後綴名判斷文件類型以外,還可以根據文件的內容判斷文件的類型。上面是一條件語句,如果載入了這個模塊,就必須指定相應的標誌文件magic的位置。此模塊並非默認加載。需用此功能,可以前面的全局設定中找到loadmodule模塊。去掉前面的#號。重新啓動服務器即會加載。
#日誌記錄及報錯處理:
HostnameLookups off //連接時服務器僅能記錄得到客戶機的IP地址。如果想同時得到記錄客戶的主機名,則把此項改爲參數"on"。但這樣逆向查詢dns,會增加系統開銷,反應慢。建議設爲"OFF"。
Errolog logs/error_log //記錄瀏覽器加載網頁發生錯誤、以及關閉啓動httpd信息。
logLevel warn //設置要存入erro.log文件中的消息等級。
log formet "%h
log format %....... //設置每條記錄的格式。有combined common referer 和agent 4種格式。不同的日誌以不同的格式記錄。
customlog logs/access_log combined //訪問記錄的位置,使用common格式。
customlog logs/referes_log referer //referer格式記錄通過本網絡連接出去的網址。
server signature on //出錯時,在返回的錯誤網頁中加上server 的版本和主機名。
#目錄別名設定
alias /icons/ "var/www/icons/" //爲某一目錄建成立別名。此處爲 /var/www/icon/ 目錄建立了較短的別名/icons/
script alias /cgi-bin/ "/var/www/cgi-bin/" //爲script程序的目錄設置別名。此目錄中的文件會被server視爲可執行。scriptAlias是爲URL路徑的映射。script alias 是用於映射CGI程序的路徑。這個路徑下的文件都被定義爲CGI程序。通過執行它們來得到結果,而不是服務器直接返回。
redirect oldurl newurl //當一個網頁文檔改變位置後,又希望老的鏈接可以訪問,就用這條指定。
--------------------------------------------------------------------------------------------------
3、虛擬主機段(主服務器段和虛擬主機段不能同時生效)
基於IP,端口,域名三種方式設置虛擬主機。
先取消主服務器段的目錄指定
可以在httpd.conf只加入以下文件,也可以在/etc/httpd/conf/文件夾下建一個.conf文件,把下面文件寫進去。
#1
<VirtlHost 192.168.1.10:80>
ServerName www.loready.cn
DocumentRoot /www/loready.cn
#2
<VirtlHost 192.168.1.11:80> //一臺主機上有多個IP地址。
ServerName www.loready.com
DocumentRoot /www/loready.com
#3
<VirtlHost 192.168.1.10:8080> //ip地址相同,不同端口,記得要在listen中添加偵聽端口。
ServerName www.loready.net
DocumentRoot /www/loready.net
#4
<VirtlHost 192.168.1.10:80> //端口,地址都相同,只是域名不同。此時要域名要能解析才行。
ServerName www.loready.org
DocumentRoot /www/loready.org
#1和#2是基於Ip地址的虛擬主機
#1和#3是基於端口的虛擬主機
#1和#4是基於域名的虛擬主機
#<VirtlHost *:80>
# ServerAdmin [email protected]
# DocumentRoot /www/docs/dummy-host.example.com
# ServerName dummy-host.example.com
# ErrorLog logs/dummy-host.example.com-error_log
# CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>
httpd -t 檢查配置文件語法
-------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
三、PHP
(一)運行機制
1、本身的執行過程
(1)php的早期運行機制:解析性語言,先進行詞法分析,再進行語法分析,生成執行路徑,然後執行。即直接編譯後馬上執行。每次執行都得進行以上步驟。
(2)zend engine的出現:把Php的處理分成了兩段式,
首先是分析PHP代碼並將其轉換爲zend opcode的二進制格式(類式於java的字節碼),並將其儲存於內存中;
第二階段是使用zend engine去執行這些轉換後的opcode。即:
php 源代碼 --》編譯成二進制格式--》執行二進制格式
這種方式是第一次執行時會慢,但以後執行時都會直接執行二進制格式,不需要先編譯,就會很快。
(3)xcache
以前是每個用戶執行Php源代碼時,都會首先編譯成二進制格式,存於自已的進程內存中,這樣其他用戶無法訪問此已經編好的二進制格式。所以他用戶如果訪問同樣的php程序時,還需要重新編譯成二進制,也存於自已的進程內存中。
XCACHE機制是對php的優化,即當某用戶訪問php程序時,Php源代碼編譯成二進制格式放於統一的緩存中,此緩存對所有用戶共享,這樣可以使不同的用戶訪問此php程序時,都可以很快使用此已編譯好的二進制代碼。
(二)apache與php的聯連機制
CGI
模塊:最簡單的模式
在AddType application/x-gzip .gz .tgz這一行下面添加
AddType application/x-httpd-php .php (注意:php .php這個點前面有一個空格)
AddType application/x-httpd-php-source .phps 新加此行
在這條後面增加.php
DirectoryIndex index.php index.html 找到次行添加index.php
fastCGI:配置麻煩,要編譯PHP的FPM模塊。
(三)Php安裝
1、源碼安裝
./configure 參數:
--prefix=/usr/local/php5
--with-config-file-path=/etc
--with-mysql=/usr/local/mysql
--with-mysqli=/usr/local/mysql/bin/mysql_config
--with-mysql-sock=/tmp/mysql.sock
--with-config-file-scan-dir=/etc/php.d //設定配置文件文件夾,即在此文件夾下的所有.ini文件都會當作配置文件加載。
--with-apxs2=/usr/local/apache2/bin/apxs //將php編譯成apache簡單模塊
//--enable-fpm //這項是把php編成fast模塊,與上面這條不能同時使用。
--enable-mbstring
--with-freetype-dir //特定字體加載,需要安裝freetype包
--with-mcrypt //加密功能,如要此項,需要先安裝libmcrypt軟件
--with-openssl //打開ssl功能
--with-jpeg-dir //需安裝libjpeg-devel包
--with-png-dir //需先安裝libpng-devel包
--with-gd
--with-iconv
-
--with-zlib //支持的壓縮文件
--with-bz2
--enable-zip
--with-libxm-dir //要先安裝libxml2和libxml2-devel包
--enable-xml //xml
./configure --prefix=/usr/local/php5 --with-config-file-path=//usr/local/php5/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-mysql-sock=/tmp/mysql.sock --with-apxs2=/usr/local/apache2/bin/apxs --with-freetype-dir --with-openssl --with-jpeg-dir --with-png-dir --with-gd --with-zlib --enable-zip --enable-xml
2、配置文件
(1)配置文件複製
cp /usr/local/src/php-5.5.14/php.ini-production //usr/local/php5/etc/php.ini //從源程序夾下把配置文件複製到etc下。
rm -rf /etc/php.ini
ln -s /usr/local/php5/etc/php.ini /etc/php.ini //創建配置文件軟鏈接到etc目錄下。
(2)配置文件修改
3、配置php與apache相關聯
vim /etc/httpd/httpd.conf
在AddType application/x-gzip .gz .tgz這一行下面添加
AddType application/x-httpd-php .php (注意:php .php這個點前面有一個空格)
AddType application/x-httpd-php-source .phps 新加此行
至此php安裝完成。
4、安裝xcache到php中
xcache是php的擴展模塊,可以獨立安裝的模塊。
(1)解壓縮xcache
(2)cd xcache-2.0.0
/usr/local/php/bin/phpize //在xcahe源碼文件夾下執行php安裝目錄下的bin文件夾中的phpize程序,這個程序專門用來擴展php的擴展模塊,所有擴展模塊都需要用此命令執行一次然後再編譯安裝。
(3)./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
make&&make install
(4)把xcache源碼中的xcache.ini文件加入到php.ini文件中。如果安裝php
如果在php安裝時加有此項:--with-config-file-scan-dir=/etc/php.d ,那麼在etc目錄下建立一個php.d文件夾,把xcache.ini複製到php.d文件夾下就行。
(5)配置xcache.ini
5、工作文件詳解:
/etc/httpd/conf.d/php.conf //配置文件
/usr/lib/httpd/modules/libphp5.so //模塊位置
/var/lib/php/session
/etc/php.ini
(四)與數據庫的連接方式
1、安裝php53-mysql //專門用於php與Mysql的軟件。53是指版本。
2、寫一個php腳本,以連接mysql
3、用PHPmyadmin管理mysql
PhpMyAdmin 是一個php web頁面,可以直接下載下來,放到可執行php環境中,從瀏覽器中打開這個頁面即可以管理mysql數據庫。
php53mCrypt :安裝這個軟件增強PhpMyAdmin 的安全性。
(五)有名的Php程序及安裝方法:
論壇:
discuz 免費的。 www.discuz.net上下載。
phpwind
phpbb
把下載下來的文件解壓後,把updata下的所有文件複製到Php運行目錄下即可。