上篇文章介紹了如何安裝、啟動apache的web伺服器,本文說明如何對其進行配置以達到特殊的功效。
Apache的配置指令分為兩類:一類由核心模組如core,http等使用,必須位置httpd.conf檔案中,另一類由標準或三方模組使用
1 基本配置指令
httpd.conf中的配置可以三為分部分:主伺服器部分、容器配置部分、擴充部分
主伺服器部分:用來佈建服務的核心參數,作為全域指令,如定義主機名稱、監聽連接埠等
容器配置部分:以<容器名>...</容器名>樣式包圍的配置部分,如虛擬機器主機、目錄、檔案許可權
擴充部分:以include方式載入的外部設定檔
1.1 主伺服器配置
ServerName 定義主機名稱,若無,則以IP地址代替
ServerRoot 定義httpd伺服器處理序所安裝在的根目錄,在選擇不同的layout時,其值是不同的
DocumentRoot 定義提供頁面文檔的根目錄,此目錄是收到URL請求的根目錄,必須用絕對路徑,若路徑中包含空格則需要加引號
ServerAdmin 指定網站管理員的郵件地址
Alias/ScriptAlias 定義別名
User/Group 指定伺服器處理序啟動並執行使用者名稱及組
Listen 指定伺服器監聽的連接埠
LoadModule/LoadFile 載入模組或目標檔案
ErrorDocument code content 指定錯誤碼的處理頁面或內容,頁面可以是指令碼或字串
Options 用於指定在目錄的處理特性,其有以下值,這些值可以通過+ -來組合
ExecCGI 允許目前的目錄下執行CGI指令碼
Includes 允許使用SSI功能
Indexes 開戶索引功能,即目錄若沒有由DirecotryIndex指令指定索引檔案,則返回請求目錄的檔案清單
FollowSymLinks 允許目錄使用符號連結
ALL 除MultiViews之外 的所有特性
MultiViews 啟用mod_negotiations模組提供的多視圖功能
1.2 容器配置部分
值得注意的是容器配置可以根據需求嵌套。
<ifModule !模組名> 判斷module是否載入,並根據真假決定是否執行容器內配置,模組名可以加!表示未載入
<ifDefine Def> 判斷Def是否定義,並根據真假決定是否執行容器內配置,Def前加!表示未定義
<Directory dir> 地區中的配置僅對dir生效,用來限定配置範圍或覆蓋全域配置。目錄可以是完整路徑,也可以是萬用字元匹配目錄,需要注意的是* ? []不能跨/
如果需要使用正則匹配,則在運算式前加 ~
<DirectoryMatch> 同上,只是其接受Regex時,不需要加~
<File> 只針對檔案定義
<FileMatch> 同上
<Location> 對網路URL進行存取控制
<LocationMatch> 同上,可接受正則匹配
需要注意的地方是,容器規則在應用時是有優先順序的,apache處理是從優先順序高到低如下處理:direcotry .htacess direcotryMatch file fileMatch Location 高優先順序規則會使得低優先順序規則失效。同時Directory容器處理順序按目錄名稱的字典排序進行。這些規則混用或使用不當會造成安全性問題,因此不建議使用複雜的規則。 對於檔案和目錄在使用時要注意限制符號連結。
1.3 擴充部分
在Apache預設設定檔夾中有一個extra目錄,其中定義了其他模組的常用配置,可以通過Include指令載入進來
常見的配置功能如下
httpd-autoindex.conf 自動索引配置
httpd-info.conf mod_status info模組的配置
httpd-mpm.conf mpm的配置
httpd-ssl.conf ssl配置
httpd-userdir.conf 使用者目錄配置,用於在一台伺服器上為多個使用者提供Web網站,將使用者映射到其自己的目錄下
httpd-vhosts.conf 虛擬機器主機配置
1.3.1 mod-dir
此模組支援使用者指定index檔案的功能,配置如下:
DirectoryIndex index.html index.php
這樣,當使用者訪問根目錄時,若下面存在對應的檔案,則伺服器會重給使用者重新導向到索引檔案頁面
1.3.2 mod-autoindex
1.3.3 mod-userdir
1.4 組態工具
本地化工具webmin需要安裝到本地,並通過網頁開啟,可以進行GUI方式的設定
windows下zecos Apacheconf可以SSH方式讀取遠程HTTPD.CONF來顯示配置
2 虛擬機器主機配置
虛擬機器主機可以讓我們在一個機器上開放多個網站,實現通過不同的網域名稱或IP訪問時定向到不同的網站頁面上。
2.1 命名虛擬機器主機
基於網域名稱的虛擬機器主機功能開啟後,伺服器可以根據請求中的HOST頭部來定向到不同的網站,需要DNS配置協作方可應用。
其配置比較簡單,下面的樣本為一個簡單的例子
## Use name-based virtual hosting.#NameVirtualHost *:80## VirtualHost example:# Almost any Apache directive may go into a VirtualHost container.# The first VirtualHost section is used for requests without a known# server name.#<VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot /www/docs/dummy-host.example.com ServerName dummy-host.example.com ServerAlias dummy1.example.com ErrorLog logs/dummy-host.example.com-error_log CustomLog logs/dummy-host.example.com-access_log common</VirtualHost>
這裡建立了一個網站,其監聽本地所有80的請求,但此虛擬機器主機只提供關於dummy.example.com的網站服務,由於採用了別名,也可以採用別名來訪問,但前提是配置了DNS的相關記錄。需要注意的是,如果採用IPV6地址,則地址應該放在中括弧中。
基於命名的虛擬機器主機不支援HTTP1.0以及之前的協議,並且不支援SSL協議 (SSL協議需要獨立的主機名稱與IP匹配)。若需要支援SSL,則需要監聽443連接埠,並在此連接埠上建立網站服務。具體可以參考httpd_ssl.conf檔案的樣本。
2.2 IP虛擬機器主機
IP虛擬機器主機需要我們的伺服器主機配置多個IP地址,我們將不同的網站配置到不同的IP地址上,IP地址可以是同一個物理網卡的多個虛擬介面地址。
其配置方式如下:
<VirtualHost 192.168.0.2:80> ServerAdmin postmaster@dummy-host2.localhost DocumentRoot "D:/xampp/htdocs/dummy-host2.localhost" ServerName dummy-host2.localhost ServerAlias www.dummy-host2.localhost ErrorLog "logs/dummy-host2.localhost-error.log" CustomLog "logs/dummy-host2.localhost-access.log" combined</VirtualHost>
2.3 動態虛擬機器主機的方法
其他的方法如通過vhost_alias_module模組或者rewrite_module建立大量虛擬機器主機,一般網站供應商才會用到這種功能,不在此詳細描述,可以參考apache的相關文檔。
3 效能相關配置
4 日誌控制