轉載源自 http://debian.linuxsir.org/
Apache 版本介紹
現在Apache HTTP 存在三種版本, 1.3 2.0 和2.2
Apache 1.3新的功能:
http://httpd.apache.org/docs/1.3/new_features_1_3.html.
Apache 2.0新的功能:
http://httpd.apache.org/docs/2.0/new_features_2_0.html.
Apache 2.2新的功能:
http://httpd.apache.org/docs/2.2/new_features_2_2.html.
在它的1.X版本年代,雖然Apache已經足夠穩定和強大並取得了舉足輕重的地位,但仍然存在着它無法覆蓋的區域而讓一些非全功能型的WEB服務器取得了市場。在2.X中這一情況得到了很大的改善,編譯和安裝也變得簡單了些,Apache使用了標準GNU自動設置工具,對於Windows平臺,它也提供了圖形化的安裝界面。在設置方面,新版本去掉了一些易讓人糊塗的指示符號,不過大部分工作仍然基於一個文件的設置文件。對那些習慣圖形界面設置工具的用戶可能有點麻煩。設置工具與核心的發佈包是分離的,一些類似ApacheConf可以免費或以很低的價格的獲取,利用這些工具可以很方便的對Apache進行各種設置。
從運行的角度看,Apache2.X版本比老版本更加強大,更具可擴展性。一個多線程/多進程的混合模塊使它可以充分利用各種規模的主機性能(從一臺只運行小型站點的典型X86服務器到同時運行多個虛擬實例的大型主機),這正是Apache1.3所缺乏的。新版本以插件的形式提供了對一些特定平臺和幾個通用模塊的支持。對IPV6的官方支持已經爲互聯網的升級做好了準備,對HTTP1.1的支持提高了代理服務器的性能。
另外新版本的核心發佈包中增加了幾個加強安全和可管理性的模塊:mod_auth_ldap引入了基於LDAP(Lightweight Directory Access Protocol)認證,mod_autoindex模塊可以很方便的生成目錄列表供訪問者使用,而mod_deflate模塊允許內容在發送前先進行壓縮以節約帶寬。
考慮到穩定性和擴展性, 本文中使用的是 Apache 2.0
Apache 的安裝無外乎兩種方式: 源代碼安裝和DEB包安裝。這兩種安裝類型各有特色,DEB包安裝不需要編譯,而源代碼安裝則需要先配置編譯再安裝,DEB包安裝在一個固定的位置下,選擇固定的模塊,而源代碼安裝則可以讓你選擇安裝路徑,選擇你想要的模塊。本文主要介紹DEB安裝方式。
系統:GNU/Linux Debian/etch
Apache當前版本: 2.0.55-4
1.1 1. 安裝:
使用以下命令安裝:
tony@tonybox:~$sudo aptitude update
tony@tonybox:~$sudo aptitude install apache2 apache2-utils
其中apache2-utils提供了我們在配置維護過程中非常有用的一些工具
安裝完成後,可以使用下面的命令啓動Apache 服務:
tony@tonybox:~$ sudo /etc/init.d/apache2 start
停止Apache服務則是:
tony@tonybox:~$ sudo /etc/init.d/apache2 stop
也可以只接用 kill 命令強制殺死apache2進程
tony@tonybox:~$ sudo killall apache2
如有需要, 可以通過rcconf來控制是否在系統啓動是加載Apache 服務
啓動完成後打開瀏覽器, 使用URL http://localhost/ 來訪問已經啓動的Apache服務器, 服務器將會將會跳轉到 http://localhost/apache2-default/, 向瀏覽器返回一個Apache安裝成功的頁面.
注: 這取決於/etc/apache2/sites-available/default 配置文件中, 是否取消了
RedirectMatch ^/$ /apache2-default/
行的註釋
1.2 2. 配置文件說明
在Debian下, 安裝完成後, 軟件包爲我們提供的配置文件位於/etc/apache2目錄下:
tony@tonybox:/etc/apache2$ ls -l
total 72
-rw-r--r-- 1 root root 12482 2006-01-16 18:15 apache2.conf
drwxr-xr-x 2 root root 4096 2006-06-30 13:56 conf.d
-rw-r--r-- 1 root root 748 2006-01-16 18:05 envvars
-rw-r--r-- 1 root root 268 2006-06-30 13:56 httpd.conf
-rw-r--r-- 1 root root 12441 2006-01-16 18:15 magic
drwxr-xr-x 2 root root 4096 2006-06-30 13:56 mods-available
drwxr-xr-x 2 root root 4096 2006-06-30 13:56 mods-enabled
-rw-r--r-- 1 root root 10 2006-06-30 13:56 ports.conf
-rw-r--r-- 1 root root 2266 2006-01-16 18:15 README
drwxr-xr-x 2 root root 4096 2006-06-30 13:56 sites-available
drwxr-xr-x 2 root root 4096 2006-06-30 13:56 sites-enabled
drwxr-xr-x 2 root root 4096 2006-01-16 18:15 ssl
其中
apache2.conf
爲apache2服務器的主配置文件, 查看此配置文件, 你會發現以下內容
# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
# Include all the user configurations:
Include /etc/apache2/httpd.conf
# Include ports listing
Include /etc/apache2/ports.conf
# Include generic snippets of statements
Include /etc/apache2/conf.d/[^.#]*
有此可見, apache2 根據配置功能的不同, 對配置文件進行了分割, 這樣更利於管理
conf.d
下爲配置文件的附加片斷,默認情況下, 僅提供了 charset 片斷,
tony@tonybox:/etc/apache2/conf.d$ cat charset
AddDefaultCharset UTF-8
如有需要我們可以將默認編碼修改爲 GB2312, 即文件的內容爲: AddDefaultCharset GB2312
httpd.conf
是個空文件
magic
文件中包含的是有關mod_mime_magic模塊的數據, 一般不需要修改它.
ports.conf
則爲服務器監聽IP和端口設置的配置文件,
tony@tonybox:/etc/apache2$ cat ports.conf
Listen 80
mods-available
目錄下是一些.conf和.load 文件, 爲系統中可以使用的加載各種模塊的配置文件, 而mods-enabled目錄下則是指向這些配置文件的符號連接, 從配置文件apache2.conf 中可以看出, 系統通過mods-enabled目錄來加載模塊, 也就是說, 系統僅通過在此目錄下創建了符號連接的mods-available 目錄下的配置文件來加載模塊。同時系統還提供了兩個命令 a2enmod 和 a2dismod用於維護這些符號連接。這兩個命令由 apache2-common 包提供。命令各式也非常簡單: a2enmod [module] 或 a2dismod [module]
sites-available
目錄下爲配置好的站點的配置文件, sites-enabled 目錄下則是指向這些配置文件的符號連接, 系統通過這些符號連接來起用站點 sites-enabled目錄下的符號連接附有一個數字前綴, 如000-default, 這個數字用於決定啓動順序, 數字越小, 啓動優先級越高. 系統提供了兩個命令 a2ensite 和 a2dissite 用於維護這些符號連接。這兩個命令由 apache2-common
包提供.
/var/www
默認情況下將要發佈的網頁文件應該置於/var/www目錄下,這一默認值可以同過主配置文件中的DocumnetRoot 選項修改.
2. 配置指令:
2.1 apache2.conf中:
- 1. ServerRoot directory-path
-
ServerRoot指令設置了服務器所在的目錄。一般來說它將包含conf/和logs/子目錄。使用DEB包安裝的系統, 此項的默認值爲 "/etc/apache2" 也就是說僅僅包括apache2的配置文件.必須注意, 該目錄是受保護的, 不允許非root用戶對其進行修改.
- 2. LockFile filename
-
指定httpd配置文件守護進程的加鎖文件。由於httpd會經常進行併發的文件操作,就需要使用加鎖的方式來保證文件操作不衝突,由於NFS(網絡文件系統)在文件加鎖方面能力有限,因此這個目錄應該是本地磁盤文件系統,而不應該使用網絡上的文件系統。 一般不需要設置這個參數,Apache服務器將自動在ServerRoot下面的路徑中進行操作。但如果ServerRoot爲NFS文件系統,便需要使用這個參數指定本地文件系統中的路徑。
- 3. PidFile filename
-
指定記錄httpd配置文件守護進程的進程號的文件。由於httpd配置文件能自動複製其自身,因此係統中有多個httpd進程,但只有一個進程爲最初啓動的進程,它爲其他進程的父進程。對這個進程發送信號將影響所有的httpd進程。PidFile定義的文件中就記錄httpd父進程的進程號。 示例: PidFile /var/run/apache.pid
- 4. Timeout seconds
-
設置連接請求的最大延時,超過這個設置,即自動斷開。
- 5. KeepAlive on|off
-
提供了長效的HTTP會話,用以在同一個TCP連接中進行多次請求。在某些情況下,這樣的方式會對包含大量圖片的HTML文檔造成的延時起到50%的加速作用。在Apache1.2版本以後,您可以設置 KeepAlive On 以啓用持久鏈接。
- 6. MaxKeepAliveRequests number
-
指令限制了當啓用KeepAlive時,每個連接允許的請求數量。如果將此值設爲"0",將不限制請求的數目。我們建議最好將此值設爲一個比較大的值,以確保最優的服務器性能。默認爲 100
- 7. KeepAliveTimeout number
-
設置第一連接後,下次發送請求的最大時間間隔,超過這個設定的時間,而沒有下次傳輸請求,則斷開連接。這個時間間隔不能設置太長,否則很很可能給服務器的整個連接性能造成影響,當然也不宜太短,否則用戶端會經常出現連接中斷現象。
- 8. < IfModule [ ! ] module-file | module-identifier > ... < / IfModule>
-
封裝指令並根據指定的模塊是否啓用爲條件而決定是否進行處理 < IfModule test > ... < / IfModule > 配置段用於封裝根據指定的模塊是否啓用而決定是否生效的指令。 在 < IfModule > 配置段中的指令僅當test爲真的時候才進行處理。如果test爲假,所有其間的指令都將被忽略。
- 9. StartServers number
-
設置服務器啓動時所建立的子進程數。
- 10. MaxClients number
-
設置服務器所允許運行的最多子進程數,當服務器所連接的進程數超過所設定的值時,任何客戶都不能與服務器連接,只有等待。當有子進程斷開連接後服務器才提供相應服務。
- 11. MaxRequestsPerChild number
-
設置單個子進程可以允許的最多請求數,當超過這個設定的值,子進程將被取消。0意味着無限, 即子進程用不消毀
- 12. User / Group user-name / group-name
-
服務器以root身份啓動後, 改變爲設置的用戶/組身份進行運行, 以增強安全性.
- 13. LogFormat format|nickname [ nickname ]
-
本指令定義訪問日誌的記錄格式。 例如:
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
- 14. ErrorLog file-path|syslog[:facility]
-
指定了當服務器遇到錯誤時記錄錯誤日誌的文件。如果file-path不是一個以斜槓(/)開頭的絕對路徑,那麼將被認爲是一個相對於ServerRoot的相對路徑。
- 15. Include file-path | directory-path
-
這個指令允許在服務器配置文件中加入其它配置文件。
- 16. Alias URL-path file-path|directory-path
-
Alias指令使文檔可以被存儲在DocumentRoot以外的本地文件系統中。以(%已解碼的)url-path路徑開頭的URL可以被映射到以directory-path開頭的本地文件。
- 17. < Directory directory-path > ... < / Directory >
-
< Directory > 和< / Directory > 用於封裝一組指令,使之僅對某個目錄及其子目錄生效。Directory-path可以是一個目錄的完整路徑,或是包含了Unix shell匹配語法的通配符字符串。
- 18. Options [+|-]option [[+|-]option] ...
-
Options指令控制了在特定目錄中將使用哪些服務器特性。默認爲 All.
- 19. AllowOverride All|None|directive-type [directive-type] ...
-
當服務器發現一個.htaccess文件(由AccessFileName指定)時,它需要知道在這個文件中聲明的哪些指令能覆蓋在此之前指定的配置指令。僅允許存在於< Directory > 配置段
- 20. Order ordering
-
Order指令控制默認的訪問狀態與Allow和Deny指令生效的順序。Ordering取值範圍是以下幾種範例之一:
Deny,Allow Deny指令在Allow指令之前被評估。默認允許所有訪問。 Allow,Deny Allow指令在Deny指令之前被評估。默認拒絕所有訪問。 Mutual-failure
只有出現在Allow列表並且不出現在Deny列表中的主機才被允許訪問。這種順序與"Order Allow,Deny"具有同樣效果,不贊成使用。
關鍵字只能用逗號分隔;它們之間不能有空格
- 21. Allow from all|host|env=env-variable [host|env=env-variable] ...
-
Allow指令控制哪些主機可以訪問服務器的該區域。可以根據主機名、IP地址、 IP地址範圍或其他環境變量中捕獲的客戶端請求特性進行控制。這個指令的第一個參數總是"from".
- 22. Deny from all|host|env=env-variable [host|env=env-variable] ...
-
條指令允許基於主機名、IP地址或者環境變量限制對服務器的訪問。Deny指令的參數設置和Allow指令完全相同。
- 23. ErrorDocument error-code document
-
使用ErrorDocument指令後面跟隨一個HTTP應答代碼和一個URL或信息來進行配置。Apache有時會額外提供一些信息來描述所發生的問題/錯誤。
- 24. DirectoryIndex local-url [local-url] ...
-
設置了當客戶端在請求的目錄名的末尾刻意添加一個"/"以表示請求該目錄的索引時,服務器需要尋找的資源列表。也就是設置目錄的默認頁
- 25. AccessFileName filename [filename] ...
-
指定所發佈目錄中的配置文件名,在向客戶端返回其中的文檔時,服務器將在這個文檔所在的各級目錄中查找此配置文件。 可以使用AllowOverride none來禁用
- 26. UseCanonicalName On|Off|DNS
-
配置服務器如何確定它自己的域名和端口.
- 27. HostnameLookups On|Off|Double
-
此指令啓用了DNS查詢,使得主機名能被記入日誌. 參數Double指定進行一次雙向DNS查詢。也就是說在一次反向查詢之後,再對返回的結果進行一次正向查詢。
- 28. IndexIgnore file [file] ...
-
在列出目錄內容時, 設置那些文件將被隱藏.
- 29. AddEncoding MIME-enc extension [extension] ...
-
在文件擴展名與特定的編碼方式之間建立映射關係。
示例
AddEncoding x-gzip .gz AddEncoding x-compress .Z
- 30. AddLanguage MIME-lang extension [extension] ...
-
在文件擴展名與特定的語言之間建立映射。
- 31. AddCharset charset extension [extension] ...
-
在特定的文件擴展名與特定的字符集之間建立映射。
- 32. AddType MIME-type extension [extension] ...
-
在給定的文件擴展名與特定的內容類型之間建立映射關係。
- 33. BrowserMatch
-
BrowserMatch只是SetEnvIf的一種特殊情況,基於User-Agent頭有條件地設置環境變量。下面的兩行具有相同的效果:
BrowserMatchNoCase Robot is_a_robot SetEnvIfNoCase User-Agent Robot is_a_robot
- 34. SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
-
據客戶端的請求屬性設置環境變量。
2.2 ports.conf
- 35. Listen [IP-address:]portnumber [protocol]
-
指示Apache只在指定的IP地址和端口上監聽;默認情況下Apache會在所有IP地址上監聽。Listen是一個必須設置的指令。如果在配置文件中找不到這個指令,服務器將無法啓動。這和先前的版本不一樣。
2.3 conf.d/charset
- 36. AddDefaultCharset On|Off|charset
-
當且僅當應答內容是text/ plain或text/ html時,此指令將會在HTTP應答頭中加入的默認字符集。理論上這將覆蓋在文檔體中通過< meta > 標籤指定的字符集,但是實際的行爲通常取決於用戶瀏覽器的設置。AddDefaultCharset Off 將會禁用此功能。AddDefaultCharset On 將啓用Apache內部的默認字符集iso-8859-1 。
2.4 mods-available/.load
- 37. LoadModule module filename
-
該指令加載目標文件或庫filename並將模塊結構名module添加到活動模塊列表。
2.5 mods-available/.conf
- 38. UserDir directory-filename
-
定了用戶目錄下的一個實實在在的目錄,存放了該用戶提供訪問的文檔。
2.6 sites-available/
- 39. NameVirtualHost
-
爲一個基於域名的虛擬主機指定一個IP地址(和端口)如果您要配置基於域名的虛擬主機,NameVirtualHost指令就是您必須的指令之一。儘管addr參數可以使用主機名,但建議您還是使用IP地址。
- 40. < VirtualHost addr[:port] [addr[:port]] ...> ... < / VirtualHost>
-
< VirtualHost>和< / VirtualHost> 用於封裝一組僅作用於特定虛擬主機的指令。任何在虛擬主機配置中可以使用的指令也同樣可以在這裏使用。當服務器接受了一個特定虛擬主機的文檔請求時,它會使用封裝在< VirtualHost>配置段中的指令。
- 41. ServerAdmin email-address|URL
-
設置了在所有返回給客戶端的錯誤信息中包含的管理員郵件地址。
- 42. DocumentRoot
-
設置站點的主目錄。這個主目錄不包括網站中的一些鏈接及虛擬目錄。比如說:
DocumentRoot /usr/web
於是對http://www.my.host.com/index.html的訪問就會指向/usr/web/index.html 。如果directory-path不是絕對路徑,則被假定爲是相對於ServerRoot的路徑。指定DocumentRoot時不應包括最後的"/"。
- 43. LogLevel
-
LogLevel用於調整記錄在錯誤日誌中的信息的詳細程度。
- 44. ServerSignature On|Off|EMail
-
允許您配置服務器端生成文檔的頁腳(錯誤信息、mod_proxy的ftp目錄列表、mod_info的輸出)。您啓用這個頁腳的原因主要在於處於一個代理服務器鏈中的時候,用戶基本無法辨識出究竟是鏈中的哪個服務器真正產生了返回的錯誤信息。
3. 站點配置
3.1 默認站點配置
將網頁文件置於/var/www/apache2-default目錄下(現將已有的網頁文件刪除), 或者使用如下方法進行配置:
配置
修改默認站點配置文件/etc/apache2/sites-available/default, 內容如下:
NameVirtualHost *
<VirtualHost *>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/mysite
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/mysite/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/mysite_error.log
LogLevel warn
CustomLog /var/log/apache2/mysite_access.log combined
ServerSignature On
</VirtualHost>
設置站點網頁文件
創建/var/www/mysite/目錄:
:/var/www# mkdir mysite
tonybox:/var/www# ls -l
total 12
drwxr-xr-x 2 root root 4096 2006-06-30 13:56 apache2-default
drwxr-xr-x 2 root root 4096 2006-07-15 14:53 mysite
在/var/www/mysite/目錄下創建測試文件index.html, 內容如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN">
<html>
<head>
<meta content="text/html; charset=utf-8"
http-equiv="content-type">
<title>測試</title>
</head>
<body>
這是一個測試頁面<br>
</body>
</html>
注意index.html文件的權限設置:
-rw-r--r-- 1 root root 287 2006-07-15 15:06 index.html
重啓Apache2服務器
tony@tonybox:~$ sudo /etc/init.d/apache2 restart
<SECT2> 測試
<P>
訪問URL: http://localhost/
將會出現測試頁面
<SECT1> 用戶站點配置
<P>
爲本地用戶配置站點
<P>
<SECT2> 啓用用戶目錄模塊(默認情況下是未啓用的)
<P>
<tscreen><verb>
# a2enmod userdir
Module userdir installed; run /etc/init.d/apache2 force-reload to enable.
# /etc/init.d/apache2 force-reload
強制重新加載配置文件
創建網站目錄
在用戶家目錄下創建 public_html 目錄, 並在其下放置網頁文件, 比如, 爲tony 用戶創建主頁目錄:
tony@tonybox:~$ mkdir public_html
並創建測試頁面index.html, 內容如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN">
<html>
<head>
<meta content="text/html; charset=utf-8"
http-equiv="content-type">
<title>測試</title>
</head>
<body>
這是tony的個人網站<br>
</body>
</html>
測試
訪問URL: http://localhost/ tony/ 將會出現測試頁面 注: 也可對默認目錄進行調整, 具體參閱配置文件 /etc/apache2/mods-available/userdir.conf
3.2 虛擬站點配置
爲測試主機分配域名: www.mydebian.com
創建配置文件
在 /etc/apache2/sites-available/ 目錄下創建站點配置文件 wwwmydebian, 內容如下:
<VirtualHost *>
ServerAdmin [email protected]
ServerName www.mydebian.com
DocumentRoot /var/www/www.mydebian.com
<Directory /var/www/www.mydebian.com/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/www_mydebian_com_error.log
LogLevel warn
CustomLog /var/log/apache2/www_mydebian_com_access.log combined
ServerSignature On
</VirtualHost>
啓用配置
運行如下命令, 啓用配置
tonybox:/etc/apache2/sites-available# a2ensite wwwmydebian
Site www.mydebian.com installed; run /etc/init.d/apache2 reload to enable.
這時你會在/etc/apache2/sites-enabled目錄下創建了一個對應符號連接
$ ls -l
total 0
lrwxrwxrwx 1 root root 35 2006-07-15 14:49 mysite -> /etc/apache2/sites-available/mysite
lrwxrwxrwx 1 root root 42 2006-07-15 16:36 wwwmydebian -> /etc/apache2/sites-available/wwwmydebian
設置站點網頁文件
創建/var/www/www.mydebian.com/目錄:
/var/www# mkdir www.mydebian.com
tonybox:/var/www# ls -l
total 12
drwxr-xr-x 2 root root 4096 2006-06-30 13:56 apache2-default
drwxr-xr-x 2 root root 4096 2006-07-15 14:53 mysite
drwxr-xr-x 2 root root 4096 2006-07-15 14:53 www.mydebian.com
應用配置生效
tony@tonybox:~$ sudo /etc/init.d/apache2 reload
測試
訪問URL: http://www.mydebian.com/您會發現訪問的爲目錄 /var/www/www.mydebian.com/ 訪問URL: http://localhost/訪問的目錄仍爲default配置文件設置的目錄, 比如此例中爲/var/www/mysite/目錄
4. 啓用SSL
http://mario.espaciolinux.com/apache2_ssl.html http://ilovett.com/blog/projects/installing-ssl-on-debian-apache2 http://blog.23corner.com/2005/09/14/1108/
4.1 首先需要啓用SSL模塊, 默認未啓用
tonybox:/etc/apache2# a2enmod ssl
tonybox:/etc/apache2# apache2-ssl-certificate
creating selfsigned certificate
replace it with one signed by a certification authority (CA)
enter your ServerName at the Common Name prompt
If you want your certificate to expire after x days call this programm
with -days x
Generating a 1024 bit RSA private key
..............................++++++
..++++++
writing new private key to '/etc/apache2/ssl/apache.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:
State or Province Name (full name) [Some-State]:GZ
Locality Name (eg, city) []:GY
Organization Name (eg, company; recommended) []:linuxsir
Organizational Unit Name (eg, section) []:debian
server name (eg. ssl.domain.tld; required!!!) []:www.mydebian.com
Email Address []:[email protected]
4.2 創建ssl站點配置文件 :
#/etc/apache2/sites-available/ cp wwwmydebian ssl_site
在/etc/apache2/ports.conf 中添加
Listen 443
修改/etc/apache2/sites-available/ssl_site, 將監聽端口 改爲 443
在配置文件中加入
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem
監聽端口設置爲443
例如:
<VirtualHost 192.168.1.254:443>
ServerAdmin [email protected]
ServerName www.mydebian.com:443
DocumentRoot /var/www/mysite
4.3 重啓apache 服務
# /etc/init.d/apache2 restart
4.4 測試
訪問URL http://www.mydebian.com:443/
5. 防止盜鏈
5.1 啓用 Rewrite 模塊
此模塊默認沒有啓用
#a2enmod rewrite
5.2 配置
修改/etc/apache2/sites-available下對應站點的配置文件, 將
AllowOverride None
修改爲
<P>
<tscreen><verb>
AllowOverride All
5.3 控制文件
在站點的根目錄下創建 .htaccess 文件 內容如下:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydebian.com/.*$ [NC]
RewriteRule?.*\.(jpg|jpeg|gif|png|bmp|rar|zip|exe)$
?http://www.mydebian.com/err.png?[R,NC]
在站點的根目錄下,創建err.png圖片,當發生盜鏈時,對應顯示將替換爲err.png圖片。
6. 訪問日誌
要有效地管理Web服務器,就有必要反饋服務器的活動、性能以及出現的問題。Apache HTTP服務器提供了非常全面而靈活的日誌記錄功能。
6.1 日誌的配置
ErrorLog file-path|syslog[:facility] 指定了當服務器遇到錯誤時記錄錯誤日誌的文件。如果file-path不是一個以斜槓(/)開頭的絕對路徑,那麼將被認爲是一個相對於ServerRoot的相對路徑。 示例
ErrorLog /var/log/apache2/error_log
LogFormat format|nickname [nickname] 本指令定義訪問日誌的記錄格式。例如: LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
LogLevel LogLevel用於調整記錄在錯誤日誌中的信息的詳細程度。可以選擇下列level,依照重要性降序排列
Level 描述 例子
emerg 緊急(系統無法使用) "Child cannot open lock file. Exiting"
alert 必須立即採取措施 "getpwuid: couldn't determine user name from uid"
crit 致命情況 "socket: Failed to get a socket, exiting child"
error 錯誤情況 "Premature end of script headers"
warn 警告情況 "child process 1234 did not exit, sending another SIGHUP"
notice 一般重要情況 "httpd: caught SIGBUS, attempting to dump core in ..."
info 普通信息 "Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..."
debug 調試信息 "Opening config file ..."
CustomLog file|pipe format|nickname [env=[!]environment-variable] CustomLog指令用來對服務器的請求進行日誌記錄。可以指定日誌的格式,也可以使用環境變量根據請求的特徵來自由地組織日誌。
6.2 錯誤日誌
錯誤日誌是最重要的日誌文件,其文件名和位置取決於ErrorLog指令。Apache httpd將在這個文件中存放診斷信息和處理請求中出現的錯誤,由於這裏經常包含了出錯細節以及如何解決,如果服務器啓動或運行中有問題,首先就應該查看這個錯誤日誌。
錯誤日誌通常被寫入一個文件(debian下是error.log)。
錯誤日誌的格式相對靈活,並可以附加文字描述。某些信息會出現在絕大多數記錄中,一個典型的例子是:
[Sat Jul 15 09:58:28 2006] [error] [client 192.168.1.254] File does not exist: /var/www/apache2-default/index.html.zh
其中
第一項是錯誤發生的日期和時間;
第二項是錯誤的嚴重性,LogLevel指令使只有高於指定嚴重性級別的錯誤纔會被記錄;
第三項是導致錯誤的IP地址;此後是信息本身,在此例中,提示客戶端訪問的文件在服務器上不存在。
錯誤日誌中會包含類似上述例子的多種類型的信息。此外,CGI腳本中任何輸出到stderr的信息會作爲調試信息原封不動地記錄到錯誤日誌中。
用戶可以增加或刪除錯誤日誌的項。但是對某些特殊請求,在訪問日誌(access log)中也會有相應的記錄,比如上述例子在訪問日誌中也會有相應的記錄,其狀態碼是404,因爲訪問日誌也可以定製,所以可以從訪問日誌中得到錯誤事件的更多信息。
6.3 訪問日誌
正如其名字所示,訪問日誌access_log記錄了所有對Web服務器的訪問活動。
下面是訪問日誌中一個典型的記錄:
192.168.1.254 - tony [22/Jul/2006:09:41:58 +0800] "GET /index.html HTTP/1.1" 200 438 "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060406 Firefox/1.5.0.4 (Debian-1.5.dfsg+1.5.0.4-1)"
這行內容由9項構成,上面的例子中有兩項空白,但整行內容仍舊分成了9項。
第一項信息是遠程主機的地址。如果你想知道這個IP地址的域名,可通過nslookup或者host命令來查看。如果你想讓Apache自己找出這個IP的主機名,可以打開這個開關:HostnameLookups。(建議最好不要打開,會影響Apache記錄服務器日誌的速度)
第二項是空白,用一個"-"佔位符替代。實際上絕大多數時候這一項都是如此。這個位置用於記錄瀏覽者的標識,這不只是瀏覽者的登錄名字,而是瀏覽者的email地址或者其他唯一標識符。這個信息由identd返回,或者直接由瀏覽器返回。很早的時候,那時Netscape 0.9還佔據着統治地位,這個位置往往記錄着瀏覽者的email地址。然而,由於有人用它來收集郵件地址和發送垃圾郵件,所以它未能保留多久,很久之前市場上幾乎所有的瀏覽器就取消了這項功能。因此,到了今天,我們在日誌記錄的第二項看到email地址的機會已經微乎其微了。
第三項是tony。這個位置用於記錄瀏覽者進行身份驗證時提供的名字。當然,如果網站的某些內容要求用戶進行身份驗證,那麼這項信息是不會空白的。但是,對於大多數網站來說,日誌文件的大多數記錄中這一項仍舊是空白的。
日誌記錄的第四項是請求的時間。這個信息用方括號包圍,而且採用所謂的"公共日誌格式"或"標準英文格式"。因此,上例日誌記錄表示請求的時間是2006年7月22日09:41:58。時間信息最後的"+0800"表示服務器所處時區位於UTC之後的8小時。
日誌記錄的第五項信息或許是整個日誌記錄中最有用的信息,它告訴我們服務器收到的是一個什麼樣的請求。該項信息的典型格式是"METHOD RESOURCE PROTOCOL",即"方法 資源 協議"。
RESOURCE是指瀏覽者向服務器請求的文檔,或URL。在這個例子中,瀏覽者請求的是"/index.html "。
在上例中,METHOD是GET,其他經常可能出現的METHOD還有POST和HEAD。此外還有不少可能出現的合法METHOD,但主要就是這三種。
PROTOCOL通常是HTTP,後面再加上版本號。
日誌記錄的第六項信息是狀態代碼。它告訴我們請求是否成功,或者遇到了什麼樣的錯誤。大多數時候,這項值是200,它表示服務器已經成功地響應瀏覽器的請求,一切正常。一般地說,以2開頭的狀態代碼表示成功,以3開頭的狀態代碼表示由於各種不同的原因用戶請求被重定向到了其他位置,以4開頭的狀態代碼表示客戶端存在某種錯誤,以5開頭的狀態代碼表示服務器遇到了某個錯誤。
日誌記錄的第七項表示發送給客戶端的總字節數。它告訴我們傳輸是否被打斷(即,該數值是否和文件的大小相同)。把日誌記錄中的這些值加起來就可以得知服務器在一天、一週或者一月內發送了多少數據。
日誌記錄的第八項記錄的是客戶在提出請求時所在的目錄或URL。 這個例子裏爲空.
日誌記錄的第九項表示客戶端的詳細信息,這樣你就不難理解爲什麼有些網站能夠在頁面中顯示你的IP、OS、Browser了。
7. 訪問控制
7.1 簡介
如果網站上有些敏感信息或只希望爲一個小羣體所訪問,您需要將服務器配置爲用戶只能訪問被允許的資源。
7.2 使用 .htaccess 控制
這裏涉及的配置方式主要是使用 .htaccess 文件 , 要使用.htaccess文件,則必須設置服務器以允許在這些文件中使用認證指令,即用AllowOverride指令指定哪些指令在針對單個目錄的配置文件中有效。 首先將對應的AllowOverride這樣設置:
AllowOverride All
首先,應該創建一個用於認證的密碼文件,並且這個文件不應該置於DocumentRoot目錄下,以避免被下載。例如可以創建/etc/apache2/passwd/目錄,並將密碼文件置於其下。
Apache2 爲我們提供了/usr/bin/htpasswd命令用於創建密碼文件,命令的具體操作方法請參閱htpasswd的手冊頁:http://httpd.apache.org/docs/1.3/programs/htpasswd.html 這裏僅做簡單的應用。
首次添加用戶需要使用 –c 參數,以創建密碼文件,再次添加用戶則不要 -c參數了:
# mkdir /etc/apache2/passwd
# htpasswd -c /etc/apache2/passwd/passwords tony
New password: [mypassword]
Re-type new password: [mypassword]
Adding password for user tony
# htpasswd /etc/apache2/passwd/passwords etony
New password: [mypassword]
Re-type new password: [mypassword]
Adding password for user etony
必要時,使用htpasswd 命令需要加入完整路徑/usr/bin/htpasswd
修改對應.htaccess文件,加入如下內容:
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/apache2/passwd/passwords
Require user tony
讓我們逐個解釋這些指令。
AuthType指令選擇對用戶實施認證的方法,最常用的是由mod_auth_basic提供的Basic 。AuthName指令設置了使用認證的域(Realm),它起兩個作用,首先,此域會出現在顯示給用戶的密碼提問對話框中,其次,也幫助客戶端程序確定應該發送哪個密碼。
AuthUserFile指令設置了密碼文件的位置,也就是剛纔我們用htpasswd建立的文件。
最後,Require指令設置了允許訪問受保護區域的用戶。
上述指令只允許一個人(一個叫tony的用戶)訪問這個目錄,但是多數情況下。都需要允許多人訪問,這時可以調整Require選項爲:
Require valid-user
可以允許密碼文件中的所有用戶使用正確的密碼進行訪問。
可能存在的問題
由於採用了Basic認證的方法,每次向服務器請求甚至刷新一個受保護的頁面或圖片時都必須校驗用戶名和密碼,爲此,必須打開密碼文件並逐行搜索用戶名,因此,服務器響應速度會受一些影響,受影響的程度與密碼文件的大小成正比。
所以,對密碼文件中的用戶總數存在一個實際上的上限,此上限取決於特定的服務器機器的性能,但是一般有幾百個用戶就會對響應速度有非常明顯的影響,在這種情況下,可以考慮用其他認證方法。
7.3 其他認證方法
基於用戶名和密碼的認證只是方法之一,時常會有不需要知道來訪者是誰,只需要知道來自哪裏的情況。
Allow和Deny指令可以允許或拒絕來自特定主機名或主機地址的訪問,同時,Order指令告訴Apache處理這兩個指令的順序,以改變過濾器。
這些指令的用法:
Allow from address
address可以是一個IP地址(或者IP地址的一部分),也可以是一個完整的域名(或者域名的一部分),還可以同時指定多個IP地址和域名。
比如,要拒絕不受歡迎的兜售垃圾的站點:
Deny from 205.252.46.165
這樣,這個指令所管轄的區域將拒絕所有來自該地址的訪問。除了指定IP地址,也可以指定域名,如:
Deny from host.example.com
另外,還可以指定地址或域名的一部分來阻止一個羣體:
Deny from 192.168.2 //這是我們隔壁部門使用的網段 :)
Deny from msn.com microsoft.com //不喜歡它們
Deny from du //對面的那個傢伙
Order可以組合Deny和Allow指令,以保證在允許一個羣體訪問的同時,對其中的一些又加以限制:
Order deny,allow
Deny from all
Allow from dev.example.com
只列出Allow指令不會得到你想要的結果,因爲它在允許指定對象訪問的同時並不禁止其他未列出的對象的訪問。所以上例使用的方法是:首先拒絕任何人,然後允許來自特定主機的訪問。
7. 優化設置
如果服務器訪問量過大,將會導致頁面打開遲緩,下載速度也降低,如果由於經費和環境問題,集羣方案沒有得以應用。可以通過對Apache2增加模塊MPM來進行優化, 這裏我們選擇線程型MPM - worker 加以介紹
7.1 worker的工作原理
worker是2.0 版中全新的支持多線程和多進程混合模型的MPM。由於使用線程來處理,所以可以處理相對海量的請求,而系統資源的開銷要小於基於進程的服務器。但是, worker也使用了多進程,每個進程又生成多個線程,以獲得基於進程服務器的穩定性。這種MPM的工作方式將是Apache 2.0的發展趨勢。
worker的工作原理是,由主控制進程生成“StartServers”個子進程,每個子進程中包含固定的ThreadsPerChild 線程數,各個線程獨立地處理請求。同樣,爲了不在請求到來時再生成線程,MinSpareThreads和MaxSpareThreads設置了最少和最多的空閒線程數;而MaxClients設置了所有子進程中的線程總數。如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。。 系統默認已經啓用了 worker mpm 模塊這可以通過以下命令查看:
# apache2 -l
Compiled in modules:
core.c
mod_access.c
mod_auth.c
mod_log_config.c
mod_logio.c
mod_env.c
mod_setenvif.c
worker.c
http_core.c
mod_mime.c
mod_status.c
mod_autoindex.c
mod_negotiation.c
mod_dir.c
mod_alias.c
mod_so.c
一個典型的針對workerMPM的配置如下:
ServerLimit 16 //服務器允許配置的進程數上限, Apache在編譯時內部有一個硬限制"ServerLimit 20000"。你不能超越這個限制。
StartServers 2 //設置了服務器啓動時建立的子進程數量, 默認值是"3"。
MaxClients 150 //設置了允許同時伺服的最大接入請求數量。任何超過MaxClients限制的請求都將進入等候隊列
MinSpareThreads 25 //設置最小空閒線程數,用於處理可能到來的突發請求。默認值是"75"。
MaxSpareThreads 75 //設置最大空閒線程數。不同的MPM對這個指令的處理是不一樣的:默認值是"250"。這個MPM將基於整個服務器監視空閒線程數。如果服務器中總的空閒線程數太多,子進程將殺死多餘的空閒線程。
ThreadsPerChild 25 //設置了每個子進程建立的線程數。子進程在啓動時建立這些線程後就不再建立新的線程了。默認值是25
7.2 使用第三方模塊增強安全性
mod-security apache的一個模塊,有請求過濾,日誌審計等功能,可以防止SQL Injection,跨站腳本***.
詳細信息請參閱 http://www.modsecurity.org/projects/modsecurity/apache/index.html
首先安裝libapache2-mod-security包
$ sudo apt-get install libapache2-mod-security
將會安裝libapache2-mod-security, mod-security-common
啓用該模塊
$ sudo cp /usr/share/doc/libapache2-mod-security/examples/httpd2.conf.example-full /etc/apache2/mods-available/mod-security.conf
$ sudo a2enmod mod-security
修改配置文件, 相關內容如下
==== mod-security.conf 文件內容開始====
# 檢測內容長度以避免堆溢出***
SecFilterForceByteRange 32 254 =>SecFilterForceByteRange 32 126
# debug設置
SecFilterDebugLevel 9 =>SecFilterDebugLevel 0
# 設置缺省的動作
SecFilterDefaultAction "deny,log,status:499" =>SecFilterDefaultAction "deny,log,status:404"
# 把設置傳遞給子目錄
SecFilterInheritance Off
# Redirect user on filter match
# 當匹配sh的時候,重新定向到一個特殊的警告頁面,該頁面是自行編寫的,寫些警告的話讓***者知難而退,該段先不要生效,等到相關配置配好之後再失效不遲。記住在配好之後要使之生效。
#SecFilter sh redirect:http://localhost/hack/warning.htm
# Prevent OS specific keywords
#過濾一些敏感的東西,我們使用*是爲了***者使用/etc/./passwd來繞開檢測
SecFilter /etc/passwd =>SecFilter /etc/*passwd
SecFilter /bin/*sh
# Very crude filters to prevent SQL injection attacks
# 防止SQL插入(SQL Injection)***
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"
SecFilter "select[[:space:]]+from"
SecFilter "union[[:space:]]+from"
==== mod-security.conf 文件內容結束====
重啓apache2 服務即可.
$ sudo /etc/init.d/apache2 start
備註:第三步可能會引起部分網站不能正常運行,可以參照着去掉某些限制,由於是安全模塊,所以參照的是防火牆的做法,關掉一切不安全的,再根據需要打開必要的。
摘自: http://wiki.ubuntu.org.cn http://wiki.ubuntu.org.cn/Apache安裝設置
8. FAQ
- Apache2 有哪些新特性?
請查閱Apache網站提供的相關文檔 http://httpd.apache.org/docs-2.0/, 有關Apache 2的新特性查閱http://httpd.apache.org/docs-2.0/new_features_2_0.html
- 哪裏可以找到Apache2的最新版本?
當然是Apache的官方網站: http://httpd.apache.org/download.cgi deb包則可以從: http://packages.debian.org/testing/web/apache2 處獲取.
- 我的 apache2 啓動不起來,why?
請查看apache2的日誌文件: /var/log/apache2/error.log
- 如何我的 Apache2 啓用SSL?
你肯定沒有自習查看本文檔的前面部分 :)
- 我的 .htaccess 文件好像沒有生效.
查看對應站點的 AllowOverride 指令是否設置爲All, 如果設置爲 None, 將會忽略配置.htaccess文件.
- 爲什麼會出現 "Forbidden/You don't have permission to access / on this server" 錯誤信息?
檢查站點目錄的權限設置
- 當我訪問一個站點目錄是出現 "Forbidden" 信息?
同上
- 我的站點在 IE 下瀏覽正常, 在 Firefox 下瀏覽則出現網頁的源代碼, 或提示下載保存?
這是由於 MSIE 和mozilla 處理mime類型數據的方式不同引起的, 檢查相關 mime.types 配置.
- 爲什麼我的站點可以從本機或局域網內訪問, 從互聯網的其他地方卻不能訪問?
有很多原因會引起這一問題, 但是大部分與你的網絡配置有關, 請教一下你的網絡管理員吧! :)
- 如何修改apache 返回的頭信息?
參閱指令 ServerTokens .
- 可以把 Apache作爲代理服務器嗎?
參閱 mod_proxy模塊的使用方法.
- Apache提供Java支持嗎?
看看Apache.org的另一個項目: http://jakarta.apache.org/
- Apache提供ASP支持嗎?
基本的apache服務器包並不提供ASP支持, 但是別灰心, 瀏覽一下這個站點: http://www.apache-asp.org/ 一定會有意想不到的驚喜!
13. 參考文獻
http://httpd.apache.org/docs/2.0/.
http://httpd.apache.org/docs/1.3/misc/FAQ.html.
http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/index.html.
http://www.cngnu.org/technology/1407/30.html.
http://www.chinaunix.net/jh/4/558771.html.