Apache-配置、測試和調試


首先執行下面的指令列出有用的Apache配置信息

grep -v '#' /usr/local/apache2/etc/httpd.conf |grep -v '^$'
ServerRoot "/usr/local/apache2/" #指定守護進程httpd的運行目錄, 服務器的根目錄, 不要在目錄結尾加'/', 配置文件內使用的目錄都是以此目錄為根節點, 比如modules/mod_rewrite.so就存儲在/usr/local/apache2/modules
  文件夾下 Listen 8000 #服務器監聽的端口
BindAddress * #綁定監聽IP地址
Listen 12.34.56.78:80 #Listen參數可以指定服務器除了監視標准的80端口之外, 還監視其他端口的HTTP請求, 由於FreeBSD系統可以同時擁有多個IP地址, 因此也可以指定服務器只聽取對某個BindAddress</B>的IP地址的HTTP請求,
  如果沒有配置這一項, 則服務器會回應對所有IP的請求, 即使使用了BindAddress參數, 使得服務器只回應對一個IP地址的請求, 但是通過使用擴展的Listen參數, 仍然可以讓HTTP守護進程回應對其他IP地址的請求, 此時Listen參數
  的用法與上面的第二個例子相同, 這種比較復雜的用法主要用於設置虛擬主機, 此后可以用 VirtualHost參數定義對不同IP的虛擬主機, 然而這種用法是較早的HTTP 1.0標准中設置虛擬主機的方法, 每針對一個虛擬主機就需要一個IP
  地址, 實際上用處並不大, 在HTTP/1.1中, 增加了對單IP地址多域名的虛擬主機的支持, 使得虛擬主機的設置具備更大的意義
PidFile logs/httpd.pid #指定的文件將記錄httpd守護進程的進程號, 由於httpd能自動復制其自身, 因此系統中有多個httpd進程, 但只有一個進程為最初啟動的進程, 它為其他進程的父進程, 對這個進程發送信號將影響所有的httpd進程
  PidFile定義的文件中就記錄httpd父進程的進程號
Timeout 300 #定義客戶程序和服務器連接的超時間隔,超過這個時間間隔(秒)后服務器將斷開與客戶機的連接。
KeepAlive On #在HTTP/1.0中, 一次連接只能作傳輸一次HTTP請求, 而KeepAlive參數用於支持HTTP1.1版本的一次連接、多次傳輸功能, 這樣就可以在一次連接中傳遞多個HTTP請求, 只有較新的瀏覽器才支持, 但還是打開使用這個選項
MaxKeepAliveRequests 100 #為一次連接可以進行的HTTP請求的最大請求次數, 將其值設為0將支持在一次連接內進行無限次的傳輸請求, 事實上沒有客戶程序在一次連接中請求太多的頁面, 通常達不到這個上限就完成連接了
KeepAliveTimeout 15 #測試一次連接中的多次請求傳輸之間的時間, 如果服務器已經完成了一次請求, 但一直沒有接收到客戶程序的下一次請求, 在間隔超過了這個參數設置的值之后, 服務器就斷開連接, 注意與Timeout的區別
  #一次請求后, 保持連接需要占用資源, 所以此值不能過大
ThreadsPerChild 50 #設置服務器使用進程的數目 這是以服務器的響應速度為准的, 數目太大則會變慢
MaxRequestsPerChild 30 #使用子進程的方式提供服務的Web服務, 常用的方式是一個子進程為一次連接服務, 這樣造成的問題就是每次連接都需要生成、退出子進程的系統操作, 使得這些額外的處理過程
  占據了計算機的大量處理能力, 因此最好的方式是一個子進程可以為多次連接請求服務, 這樣就不需要這些生成、退出進程的系統消耗, Apache就采用了這樣的方式, 一次連接結束
  后, 子進程並不退出, 而是停留在系統中等待下一次服務請求, 這樣就極大的提高了性能,  但由於在處理過程中子進程要不斷的申請和釋放內存, 次數多了就會造成一些內存垃圾,
  就會影響系統的穩定性, 並且影響系統資源的有效利用, 因此在一個副本處理過一定次數的請求之后, 就可以讓這個子進程副本退出, 再從原始的httpd進程中重新復制一個干凈的
  副本, 這樣就能提高系統的穩定性, 這樣, 每個子進程處理服務請求次數由MaxRequestPerChild定義, 缺省的設置值為30, 這個值對於具備高穩定性特點的FreeBSD系統來講是過於
  保守的設置, 可以設置為1000甚至更高, 設置為0支持每個副本進行無限次的服務處理,  為了安全,設置為零
ExtendedStatus On #Apache服務器可以通過特殊的HTTP請求, 來報告自身的運行狀態, 打開這個ExtendedStatus參數可以讓服務器報告更全面的運行狀態信息
ServerAdmin suiyong_jie@163.com #這將在HTTP服務出現錯誤的條件下返回給瀏覽器, 以便讓Web使用者和管理員聯系, 報告錯誤
ServerName localhost #缺省情況下, 並不需要指定這個ServerName參數, 服務器將自動通過名字解析過程來獲得自己的名字, 但如果服務器的名字解析有問題(通常為反向解析不正確), 或者沒有正式的DNS名字, 也可以在這里指定IP
  地址, 當ServerName設置不正確的時候, 服務器不能正常啟動, 通常一個Web服務器可以具有多個名字, 客戶瀏覽器可以使用所有這些名字或IP地址來訪問這台服務器, 但在沒有定義虛擬主機的情況下, 服務器總是以自己的正式名字回應
  瀏覽器, ServerName就定義了Web服務器自己承認的正式名字, 例如一台服務器名字(在DNS中定義了A類型)為 freebsd.exmaple.org.cn, 同時為了方便記憶還定義了一個別名(CNAME記錄)為www.exmaple.org.cn, 那么Apache
  自動解析得到的名字就為freebsd.example.org.cn, 這樣不管客戶瀏覽器使用哪個名字發送請求, 服務器總是告訴客戶程序自己為freebsd.example.org.cn, 雖然這一般並不會造成什么問題, 但是考慮到某一天服務器可能遷移到其他
  計算機上, 而只想通過更改 DNS中的www別名配置就完成遷移任務, 所以不想讓客戶在其書簽中使用 freebsd記錄下這個服務器的地址, 就必須使用ServerName來重新指定服務器的正式名字
TypesConfig /usr/local/apache2/etc/mime.types #用於設置保存有不同的MIME類型數據的文件名 可以用命令查看下其內容
MIMEMagicFile /usr/local/apache2/etc/magic #除了從文件的后綴出發來判斷文件的MIME類型之外, Apache還可以進一步分析文件的一些特征, 來判斷文件的真實MIME類型, 這個功能是由mod_mime_magic模塊實現的, 它需要一個
  記錄各種MIME類型特征的文件, 以進行分析判斷, 上面的設置是一個條件語句, 如果載入了這個模塊, 就必須指定相應的標志文件magic的位置
HostnameLookups Off #一般訪問日志只會記錄客戶機IP, 此選項配置是否記錄客戶機的主機名以進行日志記錄和提供給CGI程序使用 每次請求使用DNS反查詢 增加系統開銷
ServerSignature On #一些情況下, 例如當客戶請求的網頁並不存在時, 服務器將產生錯誤文檔, 缺省情況下由於打開了ServerSignature選項, 錯誤文檔的最后一行將包含服務器的名字、Apache的版本等信息, 有的管理員更傾向於
  不對外顯示這些信息, 就可以將這個參數設置為Off, 或者設置為Email, 最后一行將替換為對ServerAdmin 的Email提示 LoadModule deflate_module modules/mod_deflate.so #要使用基於DSO的功能模塊, 加載對應的模塊 模塊載入的順序很重要 運行"apche -l"將列表顯示Apache內建的模塊 LoadModule expires_module modules/mod_expires.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule php5_module modules/libphp5.so <IfModule !mpm_netware_module> #IfModule就是如果加載了某個模塊就執行其內的配置代碼 <IfModule !mpm_winnt_module> User daemon #Apache進程的執行者是daemon Group daemon #Apache進程的執行者所屬組為daemon </IfModule> </IfModule>
ServerName localhost ServerAdmin suiyong_jie@
163.com #管理員郵箱 DocumentRoot "/htdocs" #網站的根目錄, 默認狀態下,所有的請求都以這個目錄為基礎
<Directory /> #設置服務器本身根目錄(Linux的/)及其子目錄具有基本權限 Options FollowSymLinks #Options指定在此目錄中將使用哪些服務器特性, 里面指令都可以在前面加上"+"或者"-"來增加或者刪除, None, All, Includes(允許服務器頁面內嵌套頁面, 比如在一個靜態頁面中嵌套
    <!--#include file="public/header.html"-->), Indexes(如果一個映射到目錄的URL被請求, 而此目錄中又沒有DirectoryIndex(例如: index.html), 那么服務器會返回一個格式化后的目錄列表, 如果去掉Indexes
    就不會顯示目錄結構), ExecCGI(允許此目錄下執行CGI腳本), MultiViews(服務器執行一個隱含的文件名模式匹配, 並在其結果中選擇, 比如在地址欄內輸入index.php可以顯示頁面, 在地址欄內輸入index同樣可以顯示
    index.php頁面),FollowSymLinks不檢查文件是否是符號鏈接(快捷方式), 如果是符號鏈接就解析符號鏈接指向真正的目錄或文件(可以使程序訪問根目錄以外的目錄), 開啟后會對請求的每個目錄或者文件都會進行檢查, 速度變慢 AllowOverride None #當為None時.htaccess文件里的指令無效, 即不用查看這個目錄下的相應訪問控制文件 Order deny
,allow #設定拒絕和允許的先后順序, 如果"deny, allow"表示拒絕所有的訪問, 除去明確允許的; "allow, deny"表示允許所有的, 除去明確拒絕的 Deny from all #Deny from、Allow from后可以跟IP地址, 域名, All(所有) </Directory> <Directory "/htdocs"> #/htdocs目錄的權限選項設置 Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>

#以上ServerName, ServerAdmin和, ocumentRoot和Directory為一個域名下訪問的情況, 以下介紹多個域名對應一台服務器(虛擬主機)的情況, 只要在hosts文件里把www.a.com和www.b.com與192.168.209.128綁定就OK了
NameVirtualHost 192.168.209.128 <VirtualHost 192.168.209.128> DocumentRoot /htdocs/win ServerName www.a.com </VirtualHost> <VirtualHost 192.168.209.128> DocumentRoot /htdocs/manager CustomLog /htdocs/manager/home-access_log common ServerName www.b.com </VirtualHost>
<Directory "/htdocs/win"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> <Directory "/htdocs/manager"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
#虛擬主機配置結束
<IfModule dir_module> DirectoryIndex index.shtml index.php index.html #設置目錄默認首頁 </IfModule> <FilesMatch "^\.ht"> #如果請求的文件名符合"^\.ht", 則設置以下權限, 也可以應用為"jpg|gif|png|js|css|swf", 如果要匹配文件夾則需要用DirectoryMatch Order allow,deny Deny from all Satisfy All #暫時不知道 </FilesMatch> ErrorLog "logs/error_log" #指定錯誤日志存放的文件 也可以通過CustomLog /var/log/httpd-access.log [common|referer|agent|combined]來配置詳細的各種日志存放位置 即普通訪問|引用頁面|客戶端記錄|聯合記錄 LogLevel warn #用於調整記於錯誤日志中的信息的詳細程度 <IfModule log_config_module> # LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common <IfModule logio_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> CustomLog "logs/access_log" common </IfModule>
<IfModule mpm_prefork_module> #Apache有兩種工作模式, prefork, worker
ServerLimit 1000 #在Apache1.3的時候加入想增加MaxClients超過256則需要在configure之前修改src/include/httpd.h中的#define HARD_SERVER_LIMIT 256, 將256改為想要的大值, 然后重新編譯安裝Apache, 而
    在Apache2.0中只需要添加ServerLimit列, 無須重新編譯就可以增加MaxClients的值超過256 ServerLimit和MaxClients在配置文件中出現的先后順序是不可以顛倒的
StartServers 5 #服務器啟動時建立的子進程數量 在該工作模式下, 服務器啟動后起動5個httpd進程(加父進程共6個, 在Linux中通過ps -ax|grep httpd命令可以看到)
MinSpareServers 5 #空閑子進程的最小數量 所謂空閑子進程就是沒有正在處理請求的子進程 如果當前空閑子進程燒油MinSpareServers, Apache會以每秒一個翻倍型的速度產生新的子進程(第一秒1個, 第二秒2個, 第三秒4個)
    當有用戶連接時, apache會使用一個空閑進程為該連接服務, 同時父進程會fork一個子進程, 直到內存中的空閑進程達到MaxSpareServers(那個處理請求的進程處理完后也就變成空閑進程了)
MaxSpareServers 10 #最多空閑子進程, 如果空閑子進程多於此值Apache會kill掉多於的子進程, 且此值比MinSpareServers要大, 如果比MinSpareServers小的話會自動修改為MinSpareServers+1
MaxClients 150 #此項中最重要的一個配置 Apache可以同時處理的請求 這是對Apache性能影響最大的參數 指服務於客戶端請求的最大請求數, 即限制同一時間客戶端最大接入請求的數量, 默認值為256, 任何超過MaxClients
    限制的請求都將進入等候隊列, 一旦一個連接被釋放, 隊列中的請求將得到服務, 在Apache1.3中最大只能設置為256, 但在Apache2.0中, 可以通過在配置開頭(必須在MaxClients之前)增加ServerLimit項目來突破256的
    限制, 此時必須MaxClients ≤ ServerLimit ≤ 20000
MaxRequestsPerChild 1000 #每個子進程被處理多少次后被kill掉, 設為0澤表示不限制, 與上文的那個MaxRequestsPerChild是相同的, 不要重復, 推薦設為1000
</IfModule>
#上面的工作原理 首先服務啟動后會創建以StartServers個數的進程, 然后等待來自客戶端的請求, 我們這里先假設從客戶端來了大量的請求, 這時Apache服務器會根據自身的負載情況自動創建新進程, 如果服務器一直沒有空閑進程那么它
  就會一直創建新進程, 直到滿足MaxClients和ServerLimit設置的最大值, 如果來自客戶端的負載沒有那么大, Apache服務器將會根據MinSpareServers、MaxSpareServers和MaxRequestsPerChild設置的值來殺掉多余的
  進程, 其中每個進程在某個確定的時間只能維持一個連接
#然后, 在訪問量高峰期, 經常會出現的情況是突然之間發生非常多的並發連接, 然后突然之間減少了很多訪問, 如果Apache沒有准備足夠數量的預備進程, 那訪問只能等待Apache每秒1個的新增進程, 隨后又要將多余的進程刪除, 那Apache
  只能一直忙於新建和銷毀進程, 大大地降低了訪問速度, 可以 適當增加StartServers、MinSpareServers、MaxSpareServers來使得Apache不需要一直忙於作無用功
#強烈推薦MaxRequestsPerChild不要設置為0, 設置為非0, 可以保護Apache進程免遭內存泄漏的影響, 因為你不知道運行在Apache上的應用程式在什么時候會出錯導致內存泄漏


#可以根據服務器性能進行優化比如
#ServerLimit 1000
#StartServers 30
#MinSpareServers 30
#MaxSpareServers 45
#MaxClients 1000
#MaxRequestsPerChild 4000

#優化
#查看當前連接數
  #pgrep httpd|wc -l
#計算httpd占用內存的平均數
  #ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'
  #由於基本都是靜態頁面, CPU消耗很低, 每進程占用內存也不算多, 大約200K
#服務器內存有2G, 除去常規啟動的服務大約需要500M(保守估計), 還剩1.5G可用, 那么理論上可以支持1.5*1024*1024*1024/200000 = 8053.06368
#約8K個進程, 支持2W人同時訪問應該是沒有問題的(能保證其中8K的人訪問很快, 其他的可能需要等待1、2秒才能連上, 而一旦連上就會很流暢(可以根據配置細想一下這句話))
#可以配置為如下
#ServerLimit 5500
#MaxClients 5000

<IfModule mpm_worker_module> #內存使用比prefork要少的多 但不完善處在於一個線程崩潰, 其他線程全玩完
  ServerLimit 12 #同上
  StartServers 2 #與上同 該模式是由線程來監聽客戶的連接, 當有新客戶連接時, 由其中的一個空閑線程接受連接, 服務器在啟動時啟動兩個進程, 每個進程產生的線程數是固定的(ThreadsPerChild決定), 因此啟動時
    有50個線程(進程數*ThreadsPerChild), 當50個線程不夠用時, 服務器自動fork一個進程,再產生25個線程。
  MaxClients 150 #最大並發連接數
  MinSpareThreads 25 #服務器保持的最小空閑線程數 每一個線程在某個確定的時間只能維持一個連接,
  MaxSpareThreads 75 #服務器保持的最大空閑線程數
  ThreadLimit 75 #每個子進程可以創建的線程數, 即ThreadPerChild的上限
  ThreadsPerChild 25 #每個子進程的產生的線程數
  MaxRequestsPerChild 0 #與上同
</IfModule>
<IfModule mpm_perchild_module>
  NumServers 5 #服務器啟動時啟動的子進程數
  StartThreads 5 #每個子進程啟動時啟動的線程數
  MinSpareThreads 5 #內存中的最小空閑線程數
  MaxSpareThreads 10 #最大空閑線程數
  MaxThreadsPerChild 2000 #每個線程最多被請求多少次后退出, 0不受限制
  MaxRequestsPerChild 10000 #每個子進程服務多少次后被重新fork, 0表示不受限制
</IfModule> <IfModule alias_module> ScriptAlias /cgi-bin/
"/usr/local/apache2//cgi-bin/" #它標明此目標目錄下只有CGI腳本 使不在DocumentRoot目錄下的內容也能成為文檔樹的一部分 ScriptAlias也是用於URL路徑的映射, 但與Alias的
  不同在於, ScriptAlias是用於映射CGI程序的路徑, 這個路徑下的文件都被定義為CGI程序, 通過執行它們來獲得結果, 而非由服務器直接返回其內容, 缺省情況下CGI程序使用cgi-bin目錄作為虛擬路徑 </IfModule> <IfModule cgid_module> </IfModule>
Alias /icons/ "/usr/local/www/icons/" #Alias參數用於將URL與服務器文件系統中的真實位置進行直接映射, 一般的文檔將在DocumentRoot 中進行查詢, 然而使用Alias定義的路徑將直接映射到相應目錄下, 而不再到
  DocumentRoot下面進行查詢, 因此Alias可以用來映射一些公用文件的路徑, 例如保存了各種常用圖標的icons路徑, 這樣使得除了使用符號連接之外, 文檔根目錄(DocumentRoot)外的目錄也可以通過使用了Alias映射,
  提供給瀏覽器訪問, 定義好映射的路徑之后, 應該需要使用Directory語句設置訪問限制 <Directory
"/usr/local/apache2//cgi-bin"> #配置/usr/local/apache2//cgi-bin的目錄權限 AllowOverride None Options None Order allow,deny Allow from all </Directory> DefaultType text/plain #如果Web服務器不能決定一個文檔的缺省類型, 這通常表示文檔使用了非標准的后綴, 那么服務器就使用DefaultType定義的MIME類型將文檔發送給客戶瀏覽器, 這里的設置為text/plain, 這樣設置的問題是
  如果服務器不能判斷出文檔的MIME, 那么大部分情況下這個文檔為一個二進制文檔, 但使用 text/plain格式發送回去, 瀏覽器將在內部打開它而不會提示保存, 因此建議將這個設置更改為application/octet-stream, 這樣瀏覽器將提示
  用戶進行保存 <IfModule mime_module> TypesConfig etc//mime.types AddType application/x-compress .Z AddType application/x-gzip .gz .tgz </IfModule> <IfModule ssl_module> SSLRandomSeed startup builtin SSLRandomSeed connect builtin </IfModule> AddType application/x-httpd-php .php .phps


未完待續

參考: http://www.cnblogs.com/gugunet/archive/2009/11/08/1598373.html

參考: http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/index.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM