Apache HTTP Server搭建虛擬主機

目錄:
Apache簡介
安裝Apache HTTP Server軟件
配置文件解析
應用案例

Apache簡介
Apache HTTP Server項目是在Windows與Unix等平臺上都可以運行的跨平臺開源HTTP服務器軟件,該項目的目標是提供安全、高效、可擴展的HTTP服務。Apache httpd自從1996年發佈以來,如今已經成爲世界排名第一的Web服務器軟件。Apache httpd最新的穩定版本爲2.4.4。安裝Apache httpd軟件可以選擇源碼安裝或二進制包安裝,但由於源碼安裝是可以定製的一種安裝方式,這種安裝方式靈活性比較大,可以滿足企業對這種環境的不同需求。二進制包安裝在CentOS 6.3系統中可以選擇RPM包安裝,這種安裝的最大好處就是簡單快捷。本書採用的是源碼安裝軟件包,由於源碼安裝需要大量的依賴包,需要先安裝這些依賴軟件包。
Apache HTTP Sever非常重要的特性是她採用了模塊化設計模型,Apache模塊分爲靜態模塊與動態模塊,靜態模塊是Apache最基本的模塊,是無法隨時添加與卸載的模塊,靜態模塊在編譯軟件時設定。動態模塊是可以隨時添加刪除的模塊,這樣的設計使得企業部署Apache時可以獲得最大的靈活性,每個企業都可以根據自己的平臺以及實際需求,安裝使用不同的模塊功能。Apache模塊將被編譯爲動態共享對象(DSOs),這些動態共享對象獨立於httpd程序,DSO模塊可以在編譯Apache是添加,也可以後期隨時通過Apache Extension Tool(apxs)工具編譯添加模塊。Apache HTTP Server軟件安裝完成後可以使用httpd –M查看模塊加載清單。
安裝Apache軟件
1.    下載軟件包

  1. [root@centos6 ~]# wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.4.4.tar.gz 
  2. [root@centos6 ~]# wget http://mirror.bjtu.edu.cn/apache/apr/apr-1.4.6.tar.gz 
  3. [root@centos6 ~]# wget http://mirror.bjtu.edu.cn/apache/apr/apr-util-1.5.2.tar.gz 

2.    安裝軟件

  1. [root@centos6 ~]# yum –y install gcc autoconf automake make \ 
  2. > pcre pcre-devel openssl openssl-devel 
  3. [root@centos6 ~]# tar –xzf httpd-2.4.4.tar.gz –C /usr/src/ 
  4. [root@centos6 ~]# tar –xzf apr-1.4.6.tar.gz –C /usr/src/ 
  5. [root@centos6 ~]# tar –xzf apr-util-1.5.2.tar.gz –C /usr/src/ 
  6. [root@centos6 ~]# cd /usr/src/apr-1.4.6/ 
  7. [root@centos6 apr-1.4.6]# ./configure  --with-apr=/usr/local/apr/ 
  8. [root@centos6 apr-1.4.6]# make && make install 
  9. [root@centos6 apr-1.4.6]# cd /usr/src/apr-util-1.5.2/ 
  10. [root@centos6 apr-util-1.5.2]# ./configure  --with-apr=/usr/local/apr/ 
  11. [root@centos6 apr-util-1.5.2]# make && make install 
  12. [root@centos6 apr-util-1.5.2]# cd /usr/src/httpd-2.4.4/ 
  13. [root@centos6 httpd-2.4.4]# ./configure –prefix=/usr/local/apache2 –enable-so \ 
  14. > --enable-ssl  --enable-rewrite –with-mpm=worker –with-suexec-bin \ 
  15. > --with-apr=/usr/local/apr/ 
  16. [root@centos6 httpd-2.4.4]# make && make install 

configure腳本用來檢查系統環境、查找依賴文件、設置安裝路徑等操作,configure擁有很多參數,讀者可以通過./configure --help查看該腳本支持的所有參數。
下面是configure常用參數說明:
參數            描述
--prefix            指定Apache httpd程序的安裝主目錄
--enable-so         開啓模塊化功能,支持DSO(動態共享對象)
--enable-ssl        支持SSL加密
--enable-rewrite    支持地址重寫
--with-mpm          設置Apache httpd工作模式
--with-suexec-bin   支持SUID、SGID
--with-apr          指定apr程序絕對路徑
3.    啓動服務

  1. [root@centos6 ~]# /usr/local/apache2/bin/apachectl start 
  2. [root@centos6 ~]# netstat -ntulp |grep http 
  3. [root@centos6 ~]# iptables -I INPUT -p tcp -dport 80 -j ACCEPT 

安裝完成後Apache會提供名爲apachectl啓動腳本,該腳本提供了Apache httpd的啓動、關閉以及測試功能,沒有修改配置文件的情況下使用start啓動httpd程序,可能會返回錯誤提示:”Could not reliably determine the server’s fully qualified domain name”,提示說明httpd無法確定服務器域名稱,可以修改主配置文件的ServerName項來解決。該提示也可以忽略,通過netstat命令查看httpd已經啓動成功。
在客戶端使用瀏覽器訪問該Web服務器,看到”IT works!”說明服務器可以被正常訪問了。
apachectl具體參數如下:
參數            描述
start           啓動httpd程序,如果已經啓動過該程序則報錯
stop            關閉httpd程序
restart         重啓httpd程序
graceful        啓動httpd,不中斷現有的連接
graceful-stop   關閉httpd,不中斷現有的連接
status          查看httpd程序當前狀態
configtest      檢查httpd主配置文件語法
配置文件解析
Apache配置文件默認位於/usr/local/apache2/conf目錄下,在該目錄下最主要的配置文件是httpd.conf文件,還有一些位於extra目錄下的附加配置文件。此外original目錄中存有所有這些配置文件的副本。Apache HTTP Sever主配置文件主要由指令以及容器組成,容器使用<容器名稱>開始,</容器名稱>結尾,容器的指令一般僅在局部有效。下面是對主配置文件重點指定的具體描述。
SeverRoot指令
ServerRoot指令設置Apache軟件的安裝主目錄,如果採用源碼安裝則默認路徑爲/usr/local/apache2。
Listen指令
Listen指令設置服務器監聽的IP以及端口號,默認監聽服務器本機所有的IP地址的80端口。語法格式爲Listen [IP地址:]端口 [協議],其中IP地址與協議爲可選項,默認監聽所有IP,使用TCP協議。一個配置文件中可以多次使用Listen指令來開啓多個端口。
LoadModule指令
Apache HTTP Server的特色之一就是她的功能多數是以模塊方式加載的,但如果希望Apache動態加載模塊,需要在編譯Apache時通過--enable-so將mod_so以靜態方式編譯到Apache核心模塊中,LoadModule指令的作用就是加載模塊。語法格式爲LoadModule 模塊 模塊文件名稱,模塊文件一般位於ServerRoot指定目錄下的modules目錄中。
LoadFile指令
LoadFile指令功能類似於LoadModule,區別在於LoadFile可以通過絕對路徑加載modules目錄以爲的模塊文件。
ServerAdmin指令
當網站出現故障時,需要爲客戶提供一個可以幫助解決問題的郵件地址,ServerAdmin指令的作用就是提供這樣的郵件地址。
ServerName指令
ServerName指令設置服務器本機的主機名稱以及端口,對於URL地址的重定向很重要。
DocumentRoot指令
該指令設置Web服務對客戶端開放可見的文檔根目錄,也就是客戶端訪問網站的根路徑,默認爲/usr/local/apache2/htdocs。
ErrorLog指令
ErrorLog定位服務器錯誤日誌的位置,默認使用相對路徑,爲ServerRoot指定目錄下的”logs/error_log”文件。
ErrorLogFormat指令
設置錯誤日誌的格式,Apache HTTP Server事先定義了很多格式字串 可以直接引用。
CustomLog指令
該指令設置客戶端的訪問日誌文件名以及日誌格式,默認爲”logs/access_log”,語法格式爲CustomLog 文件名 格式。
LogFormat指令
描述用戶日誌文件格式,可以直接使用Apache預先設置的格式字串,一般我們會爲LogFormat指令設置的日誌格式創建別名,然後可以再通過CustomLog指令調用該日誌格式別名。
Include指令
Include指令允許Apache在主配置文件中加載其他的配置文件,該指令語法比較簡單,Inclde指令後直接跟上其他附加配置文件路徑即可。
Options指令
爲特定目錄設置選項,語法格式爲Options [+|-]選項 [[+|-]選項]。選項可以設置爲None,代表不啓用任何額外功能,也可以使用如下常用選項。
All:開啓出來MultiViews之外的所有選項。
ExecCGI:允許執行CGI腳本。
FollowSymlinks:允許目錄下通過鏈接文件鏈接到目錄外的文件或目錄。
Indexes:如果與URL對應的目錄下,沒有DirectoryIndex指定的首頁文檔,則Apache
將會把當前目錄的所有文件索引出來。
Order指令
控制默認訪問狀態以及Allow與Deny次序,如果使用Order deny,allow,則先檢查拒絕,沒有拒絕則默認允許。如何使用Order allow,deny,則先檢查允許,沒有允許則默認拒絕。
以下爲具體案例:
Order deny,allow
Deny from all
先檢查拒絕規則,再檢查允許規則,默認爲允許。這裏Deny From all代表拒絕所有,所以最終結果爲拒絕所有。
Order Allow,Deny
allow from All
先檢查允許規則,再檢查拒絕規則,allow from all代表允許所有,所以最終結果爲允許所有。
Order Allow,Deny
allow from 192.168.0.1
先檢查允許規則時允許192.168.0.1,其餘爲默認值,默認爲拒絕所有,最終除192.168.0.1外拒絕所有。
Order Allow,Deny
allow from 192.168.0.1
Deny from All
先檢查允許規則時允許192.168.0.1訪問,但檢查拒絕規則時爲拒絕所有,而192.168.0.1也包含在all之中,當Allow與Deny有衝突時,以Order最後的規則覆蓋其他的規則,本案例將使用Deny規則覆蓋Allow規則,最終效果爲拒絕所有人訪問。
Order Deny,Allow
Deny from all
allow from 192.168.0.1
先檢查拒絕規則,再檢查允許規則,拒絕規則爲拒絕所有,允許規則爲允許192.168.0.1,拒絕與允許規則有衝突的部分本案例將採用Allow的規則,最終本案例可以實現僅允許192.168.0.1訪問,其他任何主機均無法訪問Apache服務。
IfDefine容器
IfDefine容器封裝的指令僅在啓動Apache時測試條件爲真纔會被處理,測試條件需要在啓動Apache時通過httpd -D定義。語法格式爲<IfDefine>指令</IfDefine>。具體案例如下:
<IfDefine MemCache>
LoadModule mem_cache_module modules/mod_mem_cache.so
</IfDefine>
<IfDefine UseCache>
LoadModule cache_module modules/mod_ cache.so
</IfDefine>
這樣的配置可以讓管理員採用多種配置方式啓動Apache,啓動Apache時如果使用了httpd -DuseCache -DMemCache,則Apache將加載mod_mem_cache與mod_cache模塊,如果沒有使用-D指定任何參數,則Apache將不加載這些模塊。
IfModule容器
使用IfModule容器可以封裝僅在條件滿足時纔會處理的指令,根據指定的模塊是否加載決定條件是否滿足,語法格式<IfModule [!] 模塊>指令</IfModule>。具體案例如下:
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>
以上配置說明,僅在Apache加載了unixd_module模塊後User daemon與Group daemon纔會被Apache處理。
Directory容器
該容器內的指令僅應用於特定的文件系統目錄、子目錄以及目錄下的內容,語法格式爲<Directory directory-path>指令</Directory>。路徑可以使用~匹配正則表達式。具體案例如下:
<Directory “/usr/local/apche2/htdocs”>
Options Indexs FollowSymLinks
</Directory>
<Directory ~ “^/www/[0-9]{3}”>
AllowOverride None
</Directory>
以上案例中Opions Index FollowSymLins僅對/usr/local/apache2/htdocs目錄有效,AllowOverride None僅對所有/www目錄下包含三個數字的子目錄有效。
<DirectoryMatch>
DirectoryMatch類似於Directory,但可以直接使用正則表達式匹配,而無需像Directory一樣使用~符號纔可以匹配。
Files容器
該容器類似於Directory容器,但Files容器內的指令僅應用於特定的文件,語法格式如下:<Files 文件名>指令</File>,與Directory類似可以使用~匹配正則表達式。
FilesMatch容器
僅使用正則表達式匹配需要的文件,容器內的指令僅應用於匹配成功的特定文件。FilesMatch等同於使用了~符號的Files。
Location容器
Location容器內定義的指令僅對特定的URL有效,語法格式爲<Location URL-path|URL>指令</Location>,如果需要使用正則表達式匹配URL可以使用~符號。
LocationMathch容器
LocationMatch僅使用正則表達式匹配URL,等同於使用了~符號匹配的Location。
VirtualHost容器
虛擬主機應用案例
虛擬主機是在一臺服務器上同時運行多個網站業務,Apache HTTP Server支持基於域名以及基於IP虛擬主機類型。在Apache配置文件中虛擬主機指令需要使用VirtualHost容器封裝。基於IP的虛擬主機可以根據不同的IP地址以及端口號定位不同的網站請求,但基於IP的虛擬主機需要獨立的IP地址定位連接的網站,而目前IP地址是互聯網的稀缺資源,所以很多時候我們更喜歡基於域名的虛擬主機,服務器可以根據客戶端訪問HTTP的頭部信息來實現網站的分離解析,客戶端可以使用不同的域名訪問位於同一IP地址的服務器資源。
當客戶端請求到達後,服務器會根據<VirtualHost IP地址:[端口號]>參數匹配IP地址與端口號,IP地址可以使用*匹配服務器本地所有IP地址。接下來我們通過一個案例說明基於域名虛擬主機的實現方式,首先我們需要將主配置文件中Include conf/extra/httpd-vhosts.conf這樣功能開啓,默認該行爲註釋行,去除#符號即可。Include指令會將httpd-vhosts.conf文件視作爲配置文件的一部分。下面我們僅列出該配置文件中需要修改的部分。

  1. [root@centos6 ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf 
  2. <VirtualHost *:80> 
  3.     ServerAdmin [email protected] 
  4.     DocumentRoot "/usr/local/apache2/htdocs/example" 
  5.     ServerName www.example.com 
  6.     ServerAlias web.example.com 
  7. ErrorLog "logs/www.example.com-error_log" 
  8. CustomLog "logs/www.example.com-access_log" common 
  9. </VirtualHost> 
  10. <VirtualHost *:80> 
  11.     ServerAdmin [email protected] 
  12.     DocumentRoot "/usr/local/apache2/htdocs/test" 
  13.     ServerName www.test.com 
  14.     ErrorLog "logs/test. com-error_log" 
  15.     CustomLog "logs/test.com-access_log" common 
  16. </VirtualHost> 
  1. [root@centos6 ~]# mkdir -p /usr/local/apache2/htdocs/{example,test} 
  2. [root@centos6 ~]# echo “example.com” > /usr/local/apache2/htdocs/example/index.html
  3. [root@centos6 ~]# echo “test.com” > /usr/local/apache2/htdocs/test/index.html
  4. [root@centos6 ~]# iptables -I INPUT -p tcp -dport 80 -j ACCEPT 
  5. [root@centos6 ~]# /usr/local/apache2/bin/apachectl restart 

Apache HTTP Sever完成以上配置後即可實現基於相同IP地址的www.example.com與www.test.com網站。可以使用客戶端訪問這兩個域名測試效果,如果沒有合法的DNS服務器可以通過修改hosts文件的方式進行域名解析。如果讀者需要實現基於IP地址的虛擬主機,只需要將VirtualHost後面的*修改爲固定的IP地址即可,多個虛擬主機需要使用多個VirtualHost封裝。
http://manual.blog.51cto.com/3300438/1186157  丁丁歷險

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章