apache完整版教程
APACH系統介紹
根據著名的WWW伺服器調查公司所作的調查,世界上百分之五十以上的WWW伺服器都在使用Apache,是世界排名第一的WEB伺服器。Apache的誕生極富有戲劇性。當NCSA WWW伺服器項目停頓后,那些使用NCSA WWW伺服器的人們開始交換他們用於該伺服器的補丁程序,他們也很快認識到成立管理這些補丁程序的論壇是必要的。就這樣,誕生了Apache Group,後來這個團體在NCSA的基礎上創建了Apache。
Apache的主要特徵是:
. 可以運行上所有計算機平台;
. 支持最新的HTTP 1.1協議;
. 簡單而強有力的基於文件的配置;
. 支持通用網關介面CGI;
. 支持虛擬主機;
. 支持HTTP認證;
. 集成Perl腳本編程語言;
. 集成的代理伺服器;
. 具有可定製的伺服器日誌;
. 支持伺服器端包含命令(SSI)
. 支持安全Socket層(SSL)
. 用戶會話過程的跟蹤能力;
. 支持FastCGI;
. 支持Java Servlets。
安裝Apache
下面我們就開始漫漫征服Apache之旅,通過循序漸進的需求實例,一步步地學習使用Apache,從入門到精通。
系統需求
運行Apache不需要太多的計算資源。它在有6-10MB硬碟空間和8MB RAM的Linux系統上運行得很好。然而,只運行Apache可能不是你想做的事情。更可能的是,你想運行Apache來提供WWW服務、啟動CGI進程以及充分利用所有WWW能夠提供的令人驚奇的功能。在這種情況下,你需要提供反映負載要求的額外的磁碟空間和內存空間。也就是說,如果僅僅是啟動WWW服務並不需要太多的系統資源,但是想要能為大量的客戶提供服務就需要更多的系統資源。
獲取軟體
你可以在http://www.apache.org中獲得Apache的最新版。而幾乎所有的Linux發行版中均包含有Apache軟體包,你也可以直接使用它。
需要注意的是,Apache軟體包有兩種:一種是源代碼,下載后需要自己重新編譯;另一種是可執行文件,下載后只需解壓就可以使用。
安裝軟體
你可以通過以下三種方法安裝Apache伺服器。
1.如果你安裝的Linux版本中帶用Apache的話,就在選擇所要安裝的伺服器的時候,將httpd這個服務選上,Linux安裝程序將自動完成Apache的安裝工作,並做好基本的配置。
2.使用可執行文件軟體包,這比較適合那些對編譯工作不是太熟悉的初級用戶,因為它相對比較簡單。
下載軟體包apache_1.2.4.e.tar.gz
tar xvzf apache_1.2.4.e.tar.gz
這就完成了安裝工作,簡單吧!
如果你使用的是RedHat Linux的話,你也可以下載apache_1.2.4.rpm軟體安裝包,然後使用rpm -ivh apache_1.2.4.rpm命令安裝。
3.如果你想把Apache伺服器充分利用起來的話,就一定要自己編譯Apache定製其功能。
下載包含Apache源代碼的軟體包apache_1.2.4.tar.gz; 然後用tar命令將它解開; 將當前目錄改變為Apache源代碼發行版的src目錄; 將配置樣本文件(Configuration.tmpl)複製為Configuration文件;
編輯Configuration文件中的配置選項:
Makefile配置選項:一些編譯選項:
. "CC="一行指定用什麼編譯軟體編譯,一般為"CC=gcc";
. 如果需要將額外的標誌(參數)指定給C編譯軟體,可以使用:
EXTRA_CFLAGS=
EXTRA_LFLAGS=
. 如果系統需要特殊的庫和包含文件,可以在這裡指定它們:
EXTRA_LIBS=
EXTRA_INCLUDES=
. 如果你要改變代碼優化設置的話,你須將下面一句去掉註釋,然
后改成你所需要的值:
#OPTIM=-O2
Rule配置選項:用來決定需要什麼功能,一般情況下無需改變。
模塊配置:模塊是Apache的組成部分,它為Apache內核增加新功能。通過使用模塊配置,可以自定義在Apache伺服器中需要什麼功能,這個部分也是Apache靈活性的表現。模塊配置行如下所示:
AddModule modules/standard/mod_env.o
如果你需要Apache伺服器具備什麼功能,就將那個模塊用AddModule語句加到配置文件Configuration中去。
下表列出了Apache的模塊功能:
模塊名 功能 預設
mod_access 提供基於主機的訪問控制命令 y
mod_actions 能夠運行基於MIME類型的CGI腳本或HTTP請求方法 y
mod_alias 能執行URL重定向服務 y
mod_asis 使文檔能在沒有HTTP頭標的情況下被發送到客戶端 y
mod_auth 支持使用存儲在文本文件中的用戶名、口令實現認證 y
mod_auth_dbm 支持使用DBM文件存儲基本HTTP認證 n
mod_auth_mysql 支持使用MySQL資料庫實現基本HTTP認證 n
mod_auth_anon 允許以匿名方式訪問需要認證的區域 y
mod_auth_external支持使用第三方認證 n
mod_autoindex 當缺少索引文件時,自動生成動態目錄列表 y
mod_cern_meta 提供對元信息的支持 n
mod_cgi 支持CGI y
mod_dir 能夠重定向任何對不包括尾部斜杠字元命令的請求 y
mod_env 使你能夠將環境變數傳遞給CGI或SSI腳本 n
mod_expires 讓你確定Apache在伺服器響應請求時如何處理Expires y
mod_headers 能夠操作HTTP應答頭標 y
mod_imap 提供圖形映射支持 n
mod_include 使支持SSI n
mod_info 對伺服器配置提供了全面的描述 y
mod_log_agent 允許在單獨的日誌文件中存儲用戶代理的信息 n
mod_log_config 支持記錄日誌 y
mod_log_referer 提供了將請求中的Referer頭標寫入日誌的功能 n
mod_mime 用來向客戶端提供有關文檔的元信息 y
mod_negotiation 提供了對內容協商的支持 y
mod_setenvif 使你能夠創建定製環境變數 y
mod_speling 使你能夠處理含有拼寫錯誤或大小寫錯誤的URL請求 n
mod_status 允許管理員通過WEB管理Apache y
mod_unique_id 為每個請求提供在非常特殊的條件下保證是唯一的標識 n
在src目錄下執行:". /configure";
編譯Apache:執行命令"make";
根據機器性能的不同,經歷一段5-30分鐘的編譯,就大功告成了。
將編譯好的可執行文件httpd複製到/etc/httpd/bin目錄下;
將Apache發行版的配置文件:access.conf、httpd.conf、mime.types、srm.conf文件複製到/etc/httpd/conf目錄下。到此為止,安裝完成。
一些說明
在Red Hat Linux 6.0中,Apache將自己的所有配置文件和日誌文件放在了"/etc/httpd"目錄下,其中"/etc/httpd/conf"下為配置文件,"/etc/httpd/log"下為日誌文件。
同時,它將建立"/home/httpd"目錄,並在其下建立三個子目錄:"html/":在這個目錄下存放HTML(主頁)文件;"cgi-bin/":在這個目錄下可以存放一些CGI程序;"icons/":在這個目錄下是伺服器自帶的一些圖標。
配置Apache基礎篇,讓WWW伺服器跑起來
Apache伺服器軟體的配置文件主要有:"access.conf":用於設置系統中的存取方式和環境;"httpd.conf":用於設置伺服器啟動的基本環境;"srm.conf":主要用於做文件資源上的設定;"mime.type":記錄Apache伺服器所能識別的MIME格式。
在具體講解之前,我們必須告訴大家,Apache已經在安裝時就採用了一系列的預設值,已經讓WWW伺服器跑起來了。你只需要將裝上Linux+Apache的主機聯入Internet,然後將主頁存放到"/home/httpd"目錄下即可。
下面介紹一些最主要的配置選項的含義,以便大家用最小的精力、最小的配置準備好伺服器。
httpd.conf
tpd.conf是主配置文件。它告訴伺服器將如何運行。
一、最重要的配置選項ServerType standalone | inetd
這個配置選項指定如何運行WEB伺服器。Apache可以使用兩種方法來運行伺服器:standalone(獨立的)和inetd(由inetd運行的)。standalone參數表示WEB服務進程以一個單獨的守候進程的方式在後台偵聽是否有客戶端的請求,如果有就生成一個子進程來為其服務。inetd參數表示WEB服務不是以一個單獨的守候進程的形式支持。而是由Inetd這個超級伺服器守候進程進行代勞,當它收到一個客戶端的WEB服務請求的時候,再啟動一個WEB服務進程為其服務。從功能的角度看,這兩種方法幾乎是相同的。但它們之間實際有很大區別,區別在於伺服器的性能。一個由inted運行的伺服器進程在它結束對請求服務的同時立刻退出。而在standalone模式下,子WWW伺服器進程在退出之前要掛起一段時間,這就給它們提供了機會,可以重新用來服務新的請求。
在standalone模式下,不存在對每個請求啟動新進程的開銷,所以它的效率更高;而inetd模式被認為比standalone模式更具安全性。
standalone模式:
此種模式下,WWW伺服器偵聽特定埠的連接請求。當客戶機發出到特定埠地址的連接請求時,主伺服器進程啟動子WWW服務進程來服務該請求。另外還需要告訴主伺服器進程偵聽的特定埠地址,使用命令:
Port (預設值為80)
inetd模式
inetd是偵聽有小於1024的埠連接請求的Internet守護進程(一個伺服器進程)。與前面的方法不同,當客戶系統發出到WWW伺服器的連接請求時,inetd啟動一個WWW伺服器進程,由此進程服務此請求,完成服務后即退出。如果選擇通過inetd伺服器來運行Apache,需要編輯/etc/inetd.conf文件為Apache添加一條新的記錄:
httpd stream tcp nowait httpd /etc/httpd/bin/httpd -f /etc/httpd/conf/httpd.conf
修改了/etc/inetd.conf文件后,就需要修改/etc/services中添加一行
httpd 80/tcp httpd
做完以上修改後,需要重新啟動inetd進程。首先,使用以下命令取得inetd的進程ID:
ps auxw |grep inetd
然後執行命令:kill -HUP <inetd的進程ID>
在RedHat Linux中,默認是採用inetd伺服器來運行Apache,所以只要你在安裝時選擇了httpd,以上工作在安裝時就已經代你完成了。
二、其它配置選項
Server Admin命令,用來設置WEB管理員的E-Mail地址。這個地址會出現在系統連接出錯的時候,以便訪問者能夠將情況及時地告知WEB管理員。
命令格式: Server Admin
例:Server Admin
[email protected] ErrorLog命令,用來指定錯誤記錄文件名稱和路徑。
命令格式: ErrorLog
例:ErrorLog /var/httpd/error.log
Timeout命令,只要客戶端超過這裡設定的秒數還沒有完成一個請求的話,服務端將終止這次請求服務。如果網路速度較慢的話,建議在此設置較大的數值。以給客戶端更多機會。
命令格式: Timeout
例:Timeout 120
ServerRoot命令,它指定在何處保存伺服器的配置、錯誤及日誌文件。
命令格式: ServerRoot
例:ServerRoot /etc/httpd
ServerName命令,它配置伺服器的Internet主機名
命令格式: ServerName
例:ServerName www.xxx.com
srm.conf
srm.conf是資源配置文件,用它來告訴伺服器你想在WWW站點上提供什麼資源以及在哪裡和如何提供們。
DocumentRoot命令,用來指定主文檔的地址。
命令格式: DocumentRoot
例:DocumentRoot /home/httpd/html
UserDir命令,用來指定個人主頁的位置。如果你有一個用戶test,那麼它主目錄是"/home/test",當客戶端輸入"http://yourdomain/~test",系統就會到對應的目錄"/home/test/UserDir/"中去尋找。其中"UserDir"就是在UserDir命令中設置的指定目錄。
命令格式: UserDir
例: UserDir Public_html
DirectoryIndex命令,用來聲明首頁文件名稱。一般地,我們使用"index.html"或"index.htm"作為首頁的文件名。如果這樣設置后,那麼客戶端發出WEB服務請求時,將首先調入的主頁是在指定目錄下文?quot;index.html"或"index.htm"。
命令格式: DirecotryIndex
例:DirecotryIndex index.html index.htm
ScriptAlias命令,為腳本程序目錄起個別名,具體可見4.7小節。
命令格式: ScriptAlias
例: ScriptAlias /cgi-bin/ /home/httpd/cgi-bin
access.conf的配置
access.conf文件用來設置WWW站點上諸如文件、目錄和腳本項目的訪問許可權。該文件的第一段非註釋部分如下:
<Directory /home/httpd/html>
Option Indexes Includes ExecCGI FollowSymLink
AllowOverride None
Order allow , deny
allow from all
</Directory>
大家應該注意到,這一個部分是以<Directory /home/httpd/html>開始,以</Directory>結束的。這表示在其中間的部分都是針對指定目錄��"/home/httpd/html"而言的。
1.Option命令有很多的參數,各個參數的意義如下所示:
All 准許以下所有功能(MultiViews除外);
MultiViews 准許內容協商的Multiviews;
Indexes 若該目錄下無index文件,則准許顯示該目錄下的文件以供選擇;
IncludesNOEXEC 准許SSI(Server-side Includes),但不可使用#exec和#include功能;
Includes 准許SSI;
FollowSymLinks 准許符號鏈接到其他目錄;
ExecCGI 准許該目錄下可以使用CGI。
2.而AllowOverride命令則是用來決定是否准許在"access.conf"文件中設定的許可權是否可以被在文件".htaccess"中設定的許可權覆蓋。它有兩個參數:
All 准許覆蓋;
None 不准許覆蓋。
3.Order命令:用來設定誰能從這個伺服器取得控制。它也有兩個參數:
allow 可以取得控制;
deny 禁止取得控制。
現在我們一起來看看關於目錄"/home/httpd/html"的設置的含義:它使得這個目錄,如果不存在index.htm文件時,列出目錄信息以供選擇,准許SSI,允許執行CGI程序,開啟了動態連接。它不允許再使用在文件".htaccess"中設定來覆蓋這裡所設置的許可權。使所有的人都可以取得控制。
該文件的第二段非註釋部分如下:
<Directory /home/httpd/cgi-bin>
Option ExecCGI
AllowOverride None
</Directory>
這個表示目錄"/home/httpd/cgi"的設置為,當前目錄下可以執行CGI程序。不允許再使用在文件".htaccess"中設定來覆蓋這裡所設置的許可權。
需要說明的是,不同的LINUX系統中,可以在這個文件中看到的信息不完全相同,但是根據這裡給出的信息,大家可以參照命令的解釋自行理解文件中的設置,以及根據自己的需要進行相應的修改。
4.4 使新的配置生效
在上面,我們可能已經根據新的需求更改了相應的配置選項,如果我們要使得這個新的配置立即生效。我們就必須重新啟動WEB服務進程。在LINUX中,我們可以十分方便地使用命令行來使得WEB服務進程重啟。
/etc/rc.d/init.d/httpd restart
五、為用戶開闢個人主頁空間
如果我們利用了LINUX系統架設了一台WEB伺服器,我們不僅可以存放公司的主頁,而且還可以為公司的每一個員工提供一塊個人主頁的空間。
首先,為需要個人主頁空間的員工在LINUX上開設一個帳號。這樣,它就擁有了一個用戶主目錄"/home/用戶帳號名"。
addusr 用戶帳號名
passwd 用戶帳號名
在用戶主目錄下建立一個目錄"public_html",然後為其設置相應的許可權。
cd ~用戶帳號名
mkdir public_html
chmod 755 public_html
確認在srm.conf文件中的UserDir命令設置的是public_html目錄。讓員工將自己的個人主頁上傳到自己用戶主目錄下的public_html目錄中。
現在就可以使用"http://www.company.com/~用戶帳號名"來訪問員工的個人主頁了。
用Apache實現虛擬主機服務
什麼是虛擬主機服務
所謂的虛擬主機服務就是指將一台機器虛擬成多台WEB伺服器。舉個例子來說,一家公司想從事提供主機代管服務,它為其它企業提供WEB服務。那麼它肯定不是為每一家企業都各準備一台物理上的伺服器,而是用一台功能較強大的大型伺服器,然後用虛擬主機的形式,提供多個企業的WEB服務,雖然所有的WEB服務就是這台伺服器提供的,但是讓訪問者看起來卻是在不同的伺服器上獲得WEB服務一樣。
具體地說,就是,我們可以利用虛擬主機服務將兩個不同公司www.company1.com與www.company2.com的主頁內容都存放在同一台主機上。而訪問者只需輸入公司的域名就可以訪問到它想得到的主頁內容。 用Apache設置虛擬主機服務通常可以採用兩種方案:基於IP地址的虛擬主機和基於名字的虛擬主機,下面我們分別介紹一下它們的實現方法。以便大家在具體的應用中能夠選擇最合適的實現方法。
設置實現基於IP地址的虛擬主機服務實現前提
這種方式需要在機器上設置IP別名,也就是在一台機器的網卡上綁定多個IP地址去為多個虛擬主機服務。而且要使用這項功能還要確定在你的LINUX內核中必須支持IP別名的設置,否則你還必須重新編譯內核。
下面舉一個擁有兩個虛擬主機的服務設置,以供參考。
2.配置步驟
假設,我們用來實現虛擬主機服務的機器,首先已經為自己提供了WEB服務,現在將為新的一家公司www.company1.com提供虛擬主機服務。
規劃IP地址:為虛擬主機申請新的IP地址。(假設本機IP地址為202.101.2.1)
www.company1.com 202.101.2.2
2) 讓ISP作好相應的域名解析工作。
3) 為網卡設置IP別名:
/sbin/ifconfig eth0:0 202.101.2.2 netmask 255.255.255.0
4) 重新設置"/etc/httpd/conf/httpd.conf",在文件中加入:
<VirtualHost 202.101.2.2>
ServerAdmin
[email protected] DocumentRoot /home/httpd/www.company1.com
ServerName www.company1.com
ErrorLog /var/log/httpd/www.company1.com/error.log
</VirtualHost>
5)建立相應的目錄。
mkdir /home/httpd/www.company1.com
mkdir /var/log/httpd/www.company1.com/error.log
6)將相應的主頁內容存放在相應的目錄中即可。
3.不利因素
這種虛擬主機的實現方法有一個嚴重的不足,那就是,每增加一個虛擬主機,就必須增加一個IP地址。而由於IP地址空間已經十分緊張,所以通常情況下是無法取得這麼多的IP地址的。而且從某種意義上說,這也是一種IP地址浪費。設置實現基於名字的虛擬主機服務而基於名字的虛擬主機服務,是比較適合使用的一種方案。因為它不需要更多的IP地址,而且配置簡單,無須什麼特殊的軟硬體支持。現代的瀏覽器大都支持這種虛擬主機的實現方法。當然,這也就是指一些早期的客戶端瀏覽器也許不支持這種虛擬主機的實現方法。
正是以上原因,我們沒有理由不使用基於名字的虛擬主機服務而使用基於IP地址的虛擬主機服務。配置基於名字的虛擬主機服務需要修改配置文件?quot;/etc/httpd/conf/httpd.conf",在這個配置文件中增加以下內容。
NameVirtualHost 202.101.2.1
<VirtualHost 202.101.2.1>
ServerAdmin
[email protected] DocumentRoot /home/httpd/www.company1.com
ServerName www.company1.com
ErrorLog /var/log/httpd/www.company1.com/error.log
</VirtualHost>
<VirtualHost 202.101.2.1>
ServerAdmin
[email protected] DocumentRoot /home/httpd/www.company2.com
ServerName www.company2.com
ErrorLog /var/log/httpd/www.company2.com/error.log
</VirtualHost>
也就是在基於IP地址的配置基礎上增加一句:NameVirtualHost 202.101.2.1而已。在本例中,為了體現只需要增加一次,所以特別地設置了兩個虛擬主機服務。
最後也是建立相應的目錄,將主頁內容放到相應的目錄中去就可以了。
[ 本帖最後由 3645636 於 2008-3-18 12:14 編輯 ]
《解決方案》
配置CGI
1. 什麼是CGI
CGI是獨立於語言的網關介面規範,它實際上可以用任何廣泛流行的應用程序開發語言來實現,包括C、C++、Perl、Shell腳本甚至Java。
WEB伺服器從客戶端得到某個URL,它告訴WEB伺服器,必須運行一個CGI外部應用程序。那麼WEB伺服器啟動這一應用程序,等待它完成並返回輸出結果。最後,它將此應用程序的輸出結果傳輸給另一端的WEB客戶。
2. 為CGI配置Apache
那麼如何使Apache能處理CGI請求呢?我們必須通過相應的配置過程告知Apache在哪裡存儲CGI程序,指明CGI程序的擴展等,以下我們逐一介紹一下設置的內容與步驟。
創建存儲CGI程序的目錄
創建集中的CGI程序目錄只是建立CGI環境的開始。如果要考慮提高安全
性的話,應將集中的CGI程序目錄保存在DocumnetRoot目錄外,使得訪問者不能直接訪問CGI程序。 第一步:在DocumentRoot目錄外創建一個目錄,然後將所有的CGI程序都集中存放在這個目錄下。例如,你可創建一個/home/httpd/public/apps的目錄作為CGI程序的大本營。
第二步:為CGI程序目錄創建別名,也就是編輯配置文件httpd.conf,加入:
ScriptAlias /cgi-bin/ /home/httpd/public/apps
這樣做后,當客戶訪問www.xxx.com/cgi-bin/li.cgi時,WEB伺服器就會自動執行WEB伺服器上的/home/httpd/public/apps/li.cgi文件。
第三步:為CGI目錄設置合適的許可權,一般是只允許Apache有讀取和執行的許可權但沒有寫的許可權。
允許用戶訪問cgi-bin
我們已經在4.5小節中介紹了如何給用戶開闢個人主頁空間,但如果你的
用戶需要使他的主頁更具有活力,往往會向你申請cgi-bin訪問服務。下面我們就介紹一個Apache伺服器為用戶提供的兩種cgi-bin訪問方法。
1)使用Directory或DirectoryMatch容器
當在配置文件srm.conf中用UserDir命令被賦值為目錄名稱時,Apache就
把它作為用戶WWW站點的頂層目錄。例如:
UserDir Public_html
當Apache接到www.xxx.com/~user的請求,就到/home/user/Public_html取出主頁發送給客戶。
如果要為每個用戶添加CGI支持就在Apache的配置文件access.conf中添加下列配置:
<DirectoryMatch "/home/+/public_html/cgi-bin">
Options ExecCGI
AddHandler cgi-script .cgi .pl
</DirectoryMatch>
註:將DirectoryMatch換成Directory亦可
在這種方法中,Apache伺服器將www.xxx.com/~user/cgi-bin請求翻譯成為了/home/user/Public_html/cgi-bin/,並允許執行任何帶有正確擴展名(.cgi或.pl)的CGI程序。
使用ScriptAliasMatch命令
通過使用ScriptAliasMatch命令,也可以為每個用戶添加CGI支持。例如:
ScriptAliasMatch ~(+)/cgi-bin/(.*) /home/$1/public_html/cgi-bin/$2
這個命令將用戶名與$1相匹配,其中$1與~(+)相等。將/cgi-bin/後面的任何內容與$2相匹配,其中$2與(.*)相等。
這個設置也就實現了將www.xxx.com/~user/cgi-bin/xxx.cgi請求解釋為:
/home/user/Public_html/cgi-bin/xxx.cgi
那麼大家想一想,如果你想將這個請求解釋為:
/home/httpd/public/apps/xxx.cgi
該如何設置呢?對,應該是:
ScriptAliasMatch ~(+)/cgi-bin/(.*) /home/httpd/public /apps/$2
3. Apache為CGI提供的環境變數
Apache伺服器提供了許多環境變數可以用於CGI程序的編寫,了解它們也一定有助於寫出充分利用Apache的CGI程序,所以在此也對此作一簡單介紹。
伺服器變數
伺服器變數由Apache設置用來通知CGI程序有關Apache的情況。通過使
用這些變數,CGI程序能確定有關伺服器的不同信息:Apache的版本,管理員的E-Mail地址等。
SERVER_SOFTWARE
這個變數是WWW伺服器Apache的版本號,它的值形如:Apache/Version,如Apache/1.3;
GATEWAY_INTERFACE
這個變數的值是當前CGI規範的版本號,其值形如:CGI/1.1;
SERVER_ADMIN
如果在httpd.conf文件中有設置站點管理員的e-mail地址的話,這個變數就會存放著這個e-mail地址;
DOCUMENT_ROOT
這個變數存放在是被訪問的WWW站點的DocumentRoot命令指定的值。
客戶請求變數
Apache提供的有關客戶請求方的環境變數有許多,以下只是有選擇性地介紹一些最常見的。
SERVER_NAME
此變數可以告訴CGI程序它訪問的是哪一個主機。這個值可以是IP地址也可以是完整的主機名;
HTTP_ACCEPT
此變數被賦值為客戶所能接受的MIME類型的列表,如:HTTP_ACCEPT=image/gif;
HTTP_ACCEPT_CHARSET
此變數被賦值為客戶所能接受的字符集,如:
HTTP_ACCEPT_CHARASET=iso-8859-1.,*,utf-8;
HTTP_ACCEPT_LANGUAGE
此變數被賦值為客戶所能接受的語言,如:HTTP_ACCEPT_LANGUAGE=en;
HTTP_ACCEPT_AGENT
這個變數指定發出請求的系統正在運行的瀏覽器類型和操作系統;
HTTP_PORT:服務埠;
REMOTE_HOST:客戶端的IP地址或IP名稱信息;
REMOTE_PORT:客戶端的埠號;
4. 一點提示
若干年來,通過網關介面(CGI)已成為伺服器端應用程序開發的事實標準。但隨著時間的推移,發現在沉重的CGI負擔下許多WWW伺服器系統的表現不盡人意。這是因為CGI規範存在瓶頸問題:每當客戶系統請求CGI應用程序時,WWW伺服器就必須啟動新的CGI進程,直到完成任務后結束進程。這在負載不高時,會工作正常。但是,在高負載時,繁多的進程將成為性能的瓶頸問題。
所以現在開始出現新的標準來彌補這一不足,其中FastCGI是很有前途的一種新的開放式標準。
你可以在Apache中通過添加mod_fastcgi.c模塊來支持FastCGI。
解讀Apache日誌
當你一步步地看到這裡的時候,相信你的WWW站點已經建好,並且已經在Internet上展現出來了。這時你可能就會關心誰造訪過你的站點,或者想知道你的Apache伺服器現在的運行狀態與性能如何。下面我們一起通過解讀Apache的日誌來實現這個偉大的願望。
一、盯著Apache伺服器
Apache允許通過WWW監視伺服器的配置信息與運行狀態。
1.觀看配置信息
如果你的Apache象預設配置一樣加入了mod_info模塊的話,你就可以通過訪問http://localhost/server-info查看伺服器信息。
2.使用狀態頁
如果你的Apache象預設配置一樣加入了mod_status模塊的話,你就可以
通過訪問http://localhost/apache-status查看伺服器的運行狀態信息,其中包括:
¨ 伺服器系統的當前時間;
¨ 伺服器最近一次重啟時間;
¨ 伺服器啟動后的運行時間;
¨ 到目前為止服務的訪問總數;
¨ 到目前為止傳輸的位元組總數;
¨ 服務請求的子進程數;
¨ 空閑子進程數;
¨ 每個進程狀態、子進程服務的請求數以及該子進程傳輸的位元組總數;
¨ 每秒平均請求數、每秒傳輸的位元組數、每次請求平均傳輸位元組數;
¨ 目前每個子進程CPU佔用及Apache的總的CPU佔用率;
¨ 當前主機及處理的請求。
二、什麼是日誌文件
日誌文件是Apache工作的記錄,Apache包括了mod_log_config模塊,它用來記錄日誌。在預設情況下,它用通用日誌格式CLF規範來寫。CLF日誌文件內對每個請求均有一個單獨行,形如:host ident anthuser date request status bytes
其含義如下:
¨ host��客戶端主機的全稱域名或IP地址;
¨ ident��存放客戶端報告的識別信息;
¨ authuser��如果是基於用戶名認證的話,值為用戶名;
¨ date��請求的日期與時間;
¨ request��客戶端的請求行;
¨ status��返回到客戶端的三們數字的HTTP狀態碼;
¨ bytes��除去HTTP頭標外,返回給客戶端的位元組數。
三、分析日誌文件
有了日誌文件后,我們可以利用UNIX的一些工具和一此專門的日誌分析工具對日誌文件進行分析。
實例一:列出訪問過本網站的主機名或IP:
對於這個需求,我們可以通過一個Unix的一個腳本語句來完成:
cat /var/log/httpd/access_log | awk '{print $1}'
用上面的方法雖然可以得到訪問過本網站的主機名或IP,但是由於有些是多次訪問的,我們希望在上面得到的結果的基礎上做一些優化,使得列出的表中,每個主機只出現一次。我們可以使用:
cat /var/log/httpd/access_log | awk '{print $1}' | wc -l
3.當然,我們可以根據需要選擇第三方提供日誌分析工具甚至自己開發一些日誌分析工具來滿足我們的需求。常見的第三方日誌分析工具有:WebTrends、Wusage、wwwstat、http-analyze、pwebstats、WebStat Explorer、AccessWatch。
四、一些提示
日誌一方面是我們分析網站的第一手資料,一方面卻是吞噬大量磁碟空間的罪魁禍首。所以別忘了定期轉儲或刪除一些老的日誌文件。
Apache與代理伺服器
代理伺服器是位於客戶和客戶要訪問的伺服器之間的系統。當客戶機使用URL請求訪問遠程資源時,代理伺服器接受該請求並取得該資源以滿足客戶機的請求。在通常情況下,代理伺服器是客戶機的伺服器,同時也是遠程伺服器的客戶。
代理伺服器可以在自己的緩衝區中存儲被請求的內容,當這些信息再次被請求的時候,代理伺服器就無需再從遠程伺服器上取了,這樣代理伺服器就減輕了網路的瓶頸問題。
Apache可以配置成為代理伺服器。
一、前向代理伺服器和逆向代理伺服器
1.前向代理伺服器
前向代理伺服器通常位於用戶主機和要訪問的遠程網路之間。它從遠程伺服器取得所要求的資源,然後返回給用戶,同時存在磁碟上,以供下次使用。
在這種情況下,客戶端的主機知道它們正在使用代理伺服器,因為每個主機都必須配置為使用代理伺服器。
例如,必須告訴WWW瀏覽器使用代理伺服器,它才能使用代理伺服器。所有的遠程請求都通過代理伺服器傳輸。
這類代理伺服器也稱為緩衝代理伺服器。逆向伺服器也可以緩衝數據,但它的作用愉好與前向伺服器相反。
2.逆向代理伺服器
逆向代理伺服器位於互聯網資源前面,逆向伺服器從原始伺服器找到被請求的資源,並反它返回給用戶主機。
與前向代理伺服器不同的是,逆向代理伺服器的用戶並不知道它們連接的是代理伺服器而不是資源伺服器本身。其結構如下圖所示:
二、配置代理伺服器
為了允許Apache作為代理伺服器,需要將ProxyRequests設為On,然後根據你希望代理伺服器做什麼而增加什麼附加配置。無論你希望做什麼,你所選的代理配置都應該放入一個特殊?lt;Directory>容器中。
<Directory proxy:*>
…
</Directory>
實例一:將私有IP網連到互聯網
假設私有網上只有一台計算機被分配了互聯網上合法的IP地址,這台計算
機運行Apache代理伺服器,ProxyRequest設置為On,並且不需要附加其他配置,所有請求均可由這台代理伺服器代理服務。
實例二:讓Apache允當遠程WWW站點的緩衝
第一步:將ProxyRequest設置為On
第二步:創建配置如下:
<Directory proxy:*>
CacheRoot /www/cache
CacheSize 1024
CacheMaxExpire 24
</Directory>
這裡的意思是設置Cache目錄為/www/cache;大小為1024KB,即1MB;緩衝中的內容在24小時后失效。
實例三:建立鏡像站點(其實這也就是所謂的逆向代理伺服器)
第一步:將ProxyRequest設置為On
第二步:創建配置如下:
<Directory proxy:*>
ProxyPass / www.mot.com /
CacheRoot /www/cache
CacheDefaultExpire 24
</Directory>
10.3 一些提示
代理伺服器,我們將會在後面的章節中詳細介紹,這裡只是針對Apache的功能介紹的。用Apache作代理伺服器的性能並不高,效果並不好。不建議使用。
安裝 Apache+PHP+MySQL+imap+GD+Ldap+opens
注意事項:
1.如果妳是用 Redhat based 的 Linux 的話,請執行 ntsysv 將 httpd 和 Mysql 不要執行
2.將 DOWNLOAD 的檔案放到相同的目錄,再用 tar zxvf xxxxxxxx.tar.gz 來解壓縮,請依照要安裝的軟體進入適當的目錄。
3.可以到 http://linuxnews.idv.tw/download/ 來下載所需的程序。
MySQL:
---------------------------------------------------------------
./configure --prefix=/usr/local/mysql --with-charset=big5
make
make install
cd scripts
./mysql_install_db
cd /usr/local/mysql/share/mysql/
chmod 611 mysql.server
./mysql.server start
#編輯 /etc/rc.d/rc.local 加入底下這行以便開機時自動執行 mysql
/usr/local/mysql/share/mysql/mysql.server start
imap:
---------------------------------------------------------------
make slx
cp ipopd/ipop*.* /usr/sbin
cp imapd/imapd /usr/sbin
cp c-client/c-client.a /usr/local/lib
#請確定你有 /usr/local/include 這個目錄
cp c-client/rfc822.h /usr/local/include
cp c-client/mail.h /usr/local/include
cp c-client/linkage.h /usr/local/include
GD:
---------------------------------------------------------------
make
make install
Ldap:
---------------------------------------------------------------
./configure --prefix=/usr/local/ldap
make
make depend
cd tests
make
cd ..
make install
Apache:
---------------------------------------------------------------
./configure --prefix=/usr/local/apache
openssl:
---------------------------------------------------------------
./config
make
make test
make install
mod_ssl:
---------------------------------------------------------------
./configure --with-apache=../apache_1.3.19 --with-ssl=../openssl-0.9.6 --prefix=../apache_1.3.19
php:
---------------------------------------------------------------
./configure --with-mysql=/usr/local/mysql --with-apache=../apache_1.3.19 --enable-track-vars --with-gd=../gd-1.8.4 --with-imap=../imap-4.7c --enable-ftp --with-ldap=/usr/local/ldap
make
make install
Apache:
---------------------------------------------------------------
./configure --prefix=/usr/local/apache --activate-module=src/modules/php4/libphp4.a --enable-module=ssl
make
make certificate
#這時會問你一些問題,就是有關於加密的問題,最後要要求輸入啟動的密碼,如果輸入密碼的話以後啟動 httpd 的時候會詢問密碼,若不輸
#入密碼的話啟動就不會問了
#PS.啟動http
#要加密:apachectl startssl
#不加密:apachectl start
make install
修改 /etc/rc.d/rc.local 加入 /usr/local/apache/bin/apachectl start 來開機時自動啟動 Apache
再來就是修改 /usr/local/apache/conf/httpd.conf 的設定檔,將 php 的支持加入
建立Apache站點的基本安全機制
對於WWW服務來說,在WWW伺服器和WWW瀏覽器之間並不始終維持對話過程。辦要WWW伺服器完成對一個URL請求的服務,連接就斷開了。
在這種情況下,在WWW上保證可以使用的唯一認證機制是由HTTP本身提供 的。在標準的Apache伺服器實現了這樣的認證,它能控制哪些主機可能訪問特定的站點或特點的站點的一部分。
這種認證可以分為兩種,一種是基於主機的的認證,另一種是基於用戶名/口令的認證。由於互聯網上的決大多數用戶的IP地址是動態獲得的,所以基於主機的認證方式並不總適用。所以在大多數情況下,傳統的基於用戶名/口令的認證方式更為現實。下面我們就對這兩種認證的實現做一簡要的介紹。
1. 基於主機的認證方式
在種認證模式顧名思義,訪問是用主機名或主機IP地址來控制的。支持這種認證方式的是Apache的mod_access模塊,這個模塊預設狀態下是被安裝了的。該模塊用以下幾種Apache命令來提供訪問控制功能。
allow命令
語法:allow from host1 host2 host3 ...
這個命令定義了允許訪問站點或目錄的主機清單。主機清單可以用以下幾
種形式表示:
ALL:代表所有主機;
主機的全域名,如:www.mot.com;
主機的部分域名,如:.mot.com;
完整的IP地址,如:202.98.2.32;
部分IP地址,如:202.98
網路地址/網路掩碼對,如:202.98.0.0/255.255.0.0
網路地址/nn(CIDR定義),如:202.98.0.1/16
deny命令
語法:deny from host1 host2 host3 ...
這個命令定義了禁止訪問站點或目錄的主機清單,其他與allow命令相似。
order命令
語法:order deny,allow | allow,deny
這個命令定義評價allow和deny命令的先後順序。
例如:
<Directory /home/httpd/html>
order deny,allow
deny from www.mot.com
allow all
</Directory>
這組命令設置了禁止www.mot.com訪問/home/httpd/html目錄下的文件。
請大家注意,順序是先deny后allow,如果是:order allow,deny 那麼,先允許所有的主機訪問,然後再禁止,這樣是無效的,所有主機仍然能夠訪問。
2. 基於用戶名/口令的認證方式
這種認證方式其實相當簡單,當WWW瀏覽器請求經此認證模式保護的URL
時,將會出現一個對話框,要求用戶鍵入用戶名和口令。用戶輸入后,傳給WWW伺服器,WWW伺服器驗證它的正確性,如果正確,返回頁面,否則返回401錯誤。要說明的一點是,這種認證模式是基本的,並不能用於安全性要求極高的場合。
Apache中有許多模塊可以支持這種認證方式,下面我們就介紹一下最基本、最標準的mod_auth模塊。正如前面提到的一樣,mod_auth模塊使用存儲在文本文件中的用戶名、組名和口令來實現認證。這種方法非常適合處理少量用戶,它能工作得很好。如果你需要對大量的用戶,如數以千計的用戶做認證時,這種方法的性能將急劇下降到不可忍受,所以當這種情況下,就需要考慮使用mod_dbm模塊或mod_mysql模塊來獲得更好的性能。
實例一:需要用戶名和口令的訪問控制
下面我們就一起來看一下如何建立需要用戶名/口令才能進行訪問的目錄。
基本情況: www.xxx.com
的站點有設置為:
DocumentRoot /home/httpd/html
AccessFileName .htaccess
AllowOverride All
需求:限制/home/httpd/html/backup/目錄的訪問,只允許用戶"super"以口令"fill-06"訪問此目錄。
實現步驟:
使用htpasswd建立用戶文件
htpasswd -c /home/httpd/secr/.htpasswd super
此程序會詢問用戶"super"的口令,你輸入"fill-06",兩次生效。
建立.htaccess文件
用vi在/home/httpd/html/backup/目錄下建立一個文件.htaccess,寫入
以下幾行:
AuthName My Friend Only (註:這個名字是任取的)
AuthType Basic
AuthUserFile /home/httpd/secr/.htpasswd
require user super
設置文件許可權,確保Apache用戶有讀的許可權
這樣就完成了設置工作,你可以試一試效果了。
實例二:允許一組用戶訪問一個目錄
假設,現在www.xxx.com想讓myfriend組中的mf1與mf2兩個用戶分別能
使用口令"mf001-1""mf002-2"訪問/home/httpd/html/backup/目錄。
實現步驟:
使用htpasswd建立用戶文件
htpasswd -c /home/httpd/secr/.htpasswd mf1
htpasswd -c /home/httpd/secr/.htpasswd mf2
建立組文件
用vi/home/httpd/secr/目錄下建立一個文件.htgroup,寫入:
myfriend:mf1 mf2
建立.htaccess文件
用vi在/home/httpd/html/backup/目錄下建立一個文件.htaccess,寫入
以下幾行:
AuthName My Friend Only
AuthType Basic
AuthUserFile /home/httpd/secr/.htpasswd
AuthGroupFile /home/httpd/secr/.htgroup
require group myfriend
配置工作到此結束,試一試吧!
實例三:混合使用基於主機與基於用戶名/口令的認證方式
如果你除了只允許讓mf1與mf2兩個用戶訪問外,還想禁止除www.mot.com
外的主機訪問這個目錄的話,就將/home/httpd/html/backup/.htaccess修改成為:
AuthName My Friend Only
AuthType Basic
AuthUserFile /home/httpd/secr/.htpasswd
AuthGroupFile /home/httpd/secr/.htgroup
require group myfriend
order deny,allow
deny from all
allow from www.mot.com