Apache伺服器故障排除全攻略

來源:互聯網
上載者:User
隨著網路技術的普及、應用和Web技術的不斷完善,Web服務已經成為互連網上重要的服務形式之一。原有的用戶端/伺服器模式正在逐漸被瀏覽器/伺服器模式所取代。本文將重點Apache 伺服器的故障排除的技巧。

一、檢查設定檔的錯誤

Apache伺服器的設定檔案位於/etc/httpd/conf/目錄下,傳統上使用三個設定檔httpd.conf,access.conf和srm.conf,來配置Apache伺服器的行為。在新版本的Apache中,所有的設定都被放在了httpd.conf中,因此只需要調整這個檔案中的設定。其中99% Apache伺服器錯誤是設定檔有誤。

1 使用apachectl configtest命令

如果設定檔有錯誤,可以使用apachectl configtest命令,apachectl configtest命令可以檢查出所有語法錯誤和邏輯錯誤。

執行個體1

下面是一個設定檔範例片斷:

<Location /server-status>SetHandler server-statusOrder deny,allowDeny from allAllow from 192.168.149.</Location>

如果黑體部分的錯誤寫成了“<Location /server-status”少寫了一個 >。
apachectl configtest命令會檢查到這個問題,輸出如下:

apachectl configtestSyntax error on line 918 of /etc/httpd/conf/httpd.conf:<Location> directive missing closing '>'

2 使用服務管理工具

如果設定檔有錯誤,也可以使用GUI工具來查看。下面是執行個體1在GUI工具“服務配置“中的體現,1 。

圖1 使用GUI工具檢查錯誤

二、 學會使用錯誤記錄檔

錯誤記錄檔是最重要的記錄檔,其檔案名稱和位置取決於ErrorLog指令。Apache httpd將在這個檔案中存放診斷資訊和處理請求中出現的錯誤,由於這裡經常包含了出錯細節以及如何解決,如果伺服器啟動或運行中有問題,首先就應該查看這個錯誤記錄檔。錯誤記錄檔是你的朋友。任何錯誤都會在錯誤記錄檔中有所記載,所以你應該首先查看它。如果你的網站空間提供者不允許訪問錯誤記錄檔,那麼你應該考慮換一個空間提供者。學會閱讀錯誤記錄檔,可以快速找出問題並快速解決。

1 錯誤記錄檔格式

Apache 預設的錯誤記錄檔配置如下:
ErrorLog logs/error_log
LogLevel warn
配置錯誤記錄檔相對簡單,只要說明記錄檔的存放路徑和日誌記錄等級即可。格式為:
日期和時間 錯誤等級 錯誤訊息

2 日誌記錄等級

下面著重說說日誌記錄等級,包括八個層級。
1 級英文名稱emerg ,出現緊急情況使得該系統不可用,如系統宕機等
2 級alert 英文名稱,需要立即引起注意的情況
3 級 英文名稱crit ,危險情況的警告
4級 英文名稱error ,除了emerg 、alert、crit 的其他錯誤
5級英文名稱 warn。 警告資訊
6級英文名稱 notice ,需要引起注意的情況,但不如error、warn 重要
7級英文名稱 info ,值得報告的一般訊息
8級英文名稱 debug, 由運行於debug 模式的程式所產生的訊息

錯誤記錄檔檔案舉例

錯誤記錄檔的格式相對靈活,並可以附加文字描述。某些資訊會出現在絕大多數記錄中,一個典型的例子是:

[Wed Oct 11 14:32:52 2007] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test
其中,第一項是錯誤發生的日期和時間;第二項是錯誤的嚴重性,LogLevel指令使只有高於指定嚴重性層級的錯誤才會被記錄;第三項是導致錯誤的IP地址;此後是資訊本身,在此例中,伺服器拒絕了這個客戶的訪問。伺服器在記錄被訪問檔案時,用的是檔案系統路徑,而不是Web路徑。錯誤記錄檔中會包含類似上述例子的多種類型的資訊。此外,CGI指令碼中任何輸出到stderr的資訊會作為調試資訊原封不動地記錄到錯誤記錄檔中。使用者可以增加或刪除錯誤記錄檔的項。但是對某些特殊請求,在訪問日誌(access log)中也會有相應的記錄,比如上述例子在訪問日誌中也會有相應的記錄,其狀態代碼是403,因為訪問日誌也可以定製,所以可以從訪問日誌中得到錯誤事件的更多資訊。

瞭解錯誤碼和錯誤提示

常用的錯誤響應代碼如下:
301 :告知使用者請求的URL 已經永久的移動到新的URL,使用者可以記住新的URL,以便日後直接使用新的URL 進行訪問。
302 :告知使用者請求的URL 臨時的移動到新的URL,使用者無需記住新的URL,如果省略錯誤響應代碼,預設就是此值。
303 :告知使用者頁面已經被替換,使用者應該記住新的URL。
401 :授權失敗,即密碼錯誤。
403 :Access denied 存取錯誤,即不可以讀取該檔案。
404 :File not found 找不到檔案。
410 :告知使用者請求的頁面已經不再存在,使用此代碼時不應該使用重新導向的URL 參數。
500 :伺服器內部錯誤,可能是Web伺服器本身存在問題,也可能是編寫的程式出錯。

錯誤訊息提示說明

“Invalid argument: core_output_filter: writing data to the network” 訊息

Apache在可能的平台上使用系統調用sendfile來加速響應的發送。不幸的是,在某些系統上,Apache會在編譯時間檢測sendfile的存在,即使它不能正常工作。這經常發生在使用網路或其他非標準檔案系統時。這個問題的表現癥狀包括上述資訊出現在錯誤記錄檔裡及對於非零長度檔案請求發送零長度的響應。一般這個問題只發生在靜態檔案上,因為動態檔案通常用不到sendfile 。要修正這個問題,可用EnableSendfile指令關閉伺服器所有部分對sendfile的使用即可。同時參看EnableMMAP指令,對相似的問題有協助。

“Premature end of script headers” 訊息

大多數導致這個錯誤的CGI指令碼問題將會向瀏覽器發送一個"Internal Server Error"錯誤資訊。

“Permission denied” 訊息

error_log中的"Permission denied"錯誤伴隨一個發送到用戶端的"Forbidden"資訊通常表明違反了檔案系統的許可權,而不是Apache HTTP的設定檔出了錯誤。檢查並確認用於運行子進程的User和Group有訪問導致問題的檔案的足夠許可權。同時檢查一下導致問題的檔案所在的目錄及其所有父目錄是否具有執行(搜尋)許可權(也就是 chmod +x)。最近發行的 Fedora Core 和其它Linux發行版使用了SELinux進行額外的存取控制,違反這些限制也會導致"Permission denied"訊息。

"POST Method Not Allowed"訊息

這說明Apache沒有被正確配置以執行CGI程式,重新閱讀配置Apache看看遺漏了什麼。

"Internal Server Error"訊息

查閱Apache錯誤記錄檔,可以找到CGI程式產生的出錯訊息"Premature end of script headers"。對此,需要檢查下列各項,以找出不能產生正確HTTP頭的原因。


3 持續監視錯誤記錄檔

可以使用命令“tail -f error_log” 對任何問題持續監視。要瞭解伺服器上發生了什麼,就必須檢查記錄檔。雖然記錄檔只是記錄已經發生的事件,但是它會讓你知道伺服器遭受的攻擊,並協助你判斷是否提達到了必要的安全等級。一些例子:
grep -c "/jsp/source.jsp?/jsp/ /jsp/source.jsp??" access_loggrep "client denied" error_log | tail -n 10

上例會列出試圖使用Apache Tomcat Source.JSP Malformed Request Information Disclosure Vulnerability的攻擊次數。下例會列出最後十個被拒絕的用戶端:
[Thu Jul 11
17:18:39
2002] [error] [client foo.bar.com] client denied by server configuration: /usr/local/apache/htdocs/.htpasswd

可見,記錄檔只是記錄已經發生的事件,所以,如果用戶端可以訪問.htpasswd檔案,而且在訪問日誌中發現類似如下的記錄:
foo.bar.com -
- [12/Jul/2002:01:59:13
+0200] "GET /.htpasswd HTTP/1.1"

這可能表示伺服器設定檔中的下列指令已經被註解了:
<Files ~
"^/.ht">Order allow,denyDeny from all</Files>

4 檢查Apache伺服器模組問題

如果Apache伺服器可以啟動,但是某些功能無法實現,比如前面介紹的Webdav 功能,通常是提供這個功能的模組沒有載入,此時可以使用命令:“httpd -M”查看模組載入情況。

它會輸出一個已經啟用的模組列表,包括靜態編譯在伺服器中的模組和作為DSO動態載入的模組。也可以使用瀏覽器訪問http://192.168.1.12/server-info/?list 擷取2 。

圖2 模組載入情況


5查看Red Hat 發布的Apache 2.x 的相關資訊

執行如下的步驟可以查看Red Hat 發布的Apache 2.2.3 的一些相關資訊。

(1)查看編譯配置參數
使用httpd -V 命令,
httpd -VServer version: Apache/2.2.3Server built: Nov 29
2006
06:33:19Server's Module Magic Number: 20051115:3 Server loaded: APR 1.2.7, APR-Util 1.2.7Compiled using: APR 1.2.7, APR-Util 1.2.7Architecture: 32-bitServer MPM: Preforkthreaded: noforked: yes (variable process count)Server compiled with....-D APACHE_MPM_DIR="server/mpm/prefork"-D APR_HAS_SENDFILE-D APR_HAS_MMAP-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)-D APR_USE_SYSVSEM_SERIALIZE-D APR_USE_PTHREAD_SERIALIZE-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT-D APR_HAS_OTHER_CHILD-D AP_HAVE_RELIABLE_PIPED_LOGS-D DYNAMIC_MODULE_LIMIT=128-D HTTPD_ROOT="/etc/httpd"-D SUEXEC_BIN="/usr/sbin/suexec"-D DEFAULT_PIDLOG="logs/httpd.pid"-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"-D DEFAULT_LOCKFILE="logs/accept.lock"-D DEFAULT_ERRORLOG="logs/error_log"-D AP_TYPES_CONFIG_FILE="conf/mime.types"-D SERVER_CONFIG_FILE="conf/httpd.conf"

從以上的輸出可以瞭解Apache 伺服器版本和編譯的參數。

(2)查看已經被編譯的模組

使用httpd -l命令,
httpd -lCompiled in modules:core.cprefork.chttp_core.cmod_so.c

說明:被編譯的模組中包含mod_so.c,表示當前的Apache 支援Dynamic Shared Objects(DSO),即使用者可以在不重新編譯Apache 的情況下使用APache eXtenSion(apxs)編譯Apache 的第三方模組。被編譯的模組中包含prefork.c 表示Red Hat 發布的Apache 是使用預派生(Profork)MPM 模式啟動並執行。



三 解決Apache 伺服器故障的步驟

1 檢查錯誤記錄檔!

Apache伺服器在遇到問題時會儘力做到對你有所協助。在許多情況下,它會通過在錯誤記錄檔中寫入一條或多條訊息來提供一些細節。有時這已經足夠讓你自己診斷和解決問題了(比如檔案許可權或類似的問題)。錯誤記錄檔的預設位置在/usr/local/apache2/logs/error_log ,但是最後還是看看設定檔中的ErrorLog指令以確認錯誤記錄檔在你伺服器上的確切位置。

2 再一次檢查文法

Apache 設定檔是httpd.conf 長度通常在80-990行,幾乎99%Apache 故障是語法錯誤引起的。可以手工檢查/etc/httpd/conf/httpd.conf,也可以通過瀏覽器輸入:http://192.168.1.12/server-info?config 擷取當前設定檔,3 。

圖3 當前Apache伺服器設定檔

說明:此時系統會自動添加行號。

3 察看Apache的FAQ!

最新版本的Apache常見問題列表總是可以從Apache主要站台得到,http://httpd.apache.org/docs/2.2/faq/ 。

4 察看Apache bug資料庫

大多數報告給Apache項目組的問題都記錄在bug資料庫中。在你添加一個新bug之前,請務必檢查已有的報告(開啟的和關閉的)。如果你發現你的問題已經被報告了,請不要添加一個"我也是"那樣的報告。如果原始報告還沒有關閉,我們建議你經常周期性地來看看它。你也可以考慮與最初的提交者接觸,因為有可能會在郵件交流中發現沒有記錄在資料庫中的問題。

5 在某個使用者論壇中提問

Apache擁有一個活躍的、願意共用知識的使用者社區。參與這個社區通常是獲得解答的最快最好的辦法。

Apache使用者郵件清單:http://httpd.apache.org/userslist.html

6 提交問題報告到bug資料庫

如果做了以上幾個合適的步驟而沒有得到解答,那麼請務必讓httpd的開發人員瞭解這個問題,到這裡(http://httpd.apache.org/bug_report.html )提交bug報告。

7 擷取商業支援

可以從下面的網址擷取商業網站服務商的支援人員:
http://www.apache.org/info/support.cgi

8 瞭解Apache伺服器的網路資源的相關文檔

Apache 伺服器是使用最廣泛的web伺服器,它的版本很多。從以下的網路資源中可以擷取大量有用的提示可以協助您快速解決故障和建立web服務。
通用Apache文檔:http://httpd.apache.org/docs-2.0
Apache FAQ:http://www.apache.org/foundation/faq.html
1.3 版本FAQ:http://httpd.apache.org/docs/misc/FAQ.html
郵件清單:http://httpd.apache.org/userslist.html
紅帽企業版 Linux 5 部署指南:
http://www.redhat.com/docs/manuals/enterprise/RHEL-5-manual/zh-CN/Deployment_Guide/index.html

總結:

本文介紹了在Linux下建立Apache 伺服器的過程和故障排除的方法。需要說明的是Apache 遭到駭客的攻擊是造成其伺服器故障的一個主要原因,限於篇幅這裡沒有完全做到面面俱到,您可以閱讀筆者的《Linux 伺服器安全性原則詳解》第六章(http://www4.it168.com/jtzt/shenlan/server/linux02/linux02.htm )其中詳細介紹了提高Apache伺服器的安全的方法。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.