Apache-配置、測試和調試

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

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的人訪問很快, 其餘的可能須要等待一、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


複製代碼
相關文章
相關標籤/搜索