一丶Apache常用目錄詳解
1) /etc/httpd/conf/httpd.conf
httpd.conf是Apache的主配文件,整個Apache也不過就是這個配置文件,里面幾乎包含了所有的配置。有的distribution都將這個文件拆分成數個小文件分別管理不同的參數。但是主要配置文件還是以這個文件為主。
- /etc/httpd/conf/logs鏈接到/var/log/httpd,用于存放默認主服務器的日志文件;
- /etc/httpd/conf/modules鏈接到/usr/lib64/httpd/modules,用于存放所有httpd所能裝載的DSO模塊文件;
- /etc/httpd/conf/run鏈接到/var/run/httpd,用來存放主進程的PidFile。
2) /etc/httpd/conf.d/*.conf
如果你不想要修改原始配置文件httpd.conf的話,那么可以將你自己的額外參數文件獨立出來,注意以.conf結尾放在/etc/httpd/conf.d/目錄下。重啟Apache的時候,這個配置文件就會被讀入主配文件之中了。他的好處就是當你在進行系統升級的時候,幾乎不需要改動原本的配置文件,只要將你自己的額外參數文件復制到正確的地點即可,維護起來非常方便。
3) /etc/httpd/modules/
Apache支持很多的外掛模塊,例如PHP以及SSL都是Apache外掛的一種。所有你想要使用的模塊文件默認是放置在這個目錄當中的。
4) /var/www/html/
這個目錄就是Apache默認的存放首頁的目錄(默認是index.html),網站根目錄
5) /var/www/error/
當因為服務器設置錯誤,或是瀏覽器要求的數據錯誤時,在瀏覽器上出現的錯誤信息就以這個目錄的默認信息為主
6) /var/www/icons/
這個目錄提供Apache默認給予的一些小圖示,可以隨意使用。
7) /var/www/cgi-bin/
默認給一些可執行的CGI(網頁程序)程序放置的目錄。
8) /var/log/httpd/
默認的Apache日志文件都放在這里,對于流量比較大的網站來說,這里的數據文件可能會非常大。
9) /usr/sbin/apachectl
這個就是Apache的主要執行文件,這個執行文件其實就是一個Shell Script而已,他可以主動地偵測系統上面的一些設置值,好讓你啟動Apache時更簡單一些。
10) /usr/sbin/httpd
這個是主要的Apache二進制執行文件。
11) /usr/bin/htpasswd
在當你想要登入某些網頁時你需要輸入帳號與密碼,那Apache本身就提供一個最基本的密碼保護方式,該密碼的產生就是通過這個命令來實現的。Apache密碼保護
二丶Apache配置文件詳解及優化(http.conf)
ServerTokens OS //此參數告知客戶端我們服務器的版本和操作系統而已,不需要改動他;如果不在乎你的系統信息被遠程用戶查詢到,則可以將這個項目注釋掉(不建議)
ServerRoot ?“/etc/httpd” //服務器設置的最頂層目錄,有點類似于chroot那種感覺。包括logs , modules等的數據都應該要放置在此目錄下面(如果這些配置沒有聲明成絕對路徑的話)
PidFile run/httpd.pid //放置PID的文件,可方便apache軟件的管理。只有相對路徑考慮ServerRoot設置值,所以文件在/etc/httpd/run/httpd.pid
Timeout 60 //不論接收或發送,當持續連接等待超過60秒則該次連接就中斷一般來說,此數值在300秒左右即可,不需要修改這個原始值
KeepAlive on //最好把默認值”Off”修改為”On”,表示是否允許持續性的連接,也就是一個TCP連接可以具有多個文件資料傳送的要求;比如,如果你的網頁內含有很多圖片文件,那么這一次連接就會將所有的數據傳送完,而不必每一個圖片都需要進行一次TCP連接。
MaxKeepAliveRequests 100 //可以將默認的100改成500或更高與上一個設置的值KeepAlive有關,當KeepAlive的值設置為On的時候,這個數值可以決定該次連接能夠傳輸的最大傳輸數量。為了提高效率則可以改大一點。0代表不限制
KeepAliveTimeout 65 //在KeepAlive設置為”On”的情況下,該次連接在最后一次傳輸后等待延遲的秒數,當超過該秒數的時候該連接中斷。保持默認值即可,如果設置的值太高(等待時間較長)在較忙碌的系統上面將會有較多的Apache程序占用資源,可能有效率方面的問題。
<IfModule prefork.c>
StartServers ???8 //啟動Apache的時候,喚醒幾個PID來處理服務的。Apache使用了進程預派生的技術來處理請求,大大提高了響應速度
MinSpareServers ? 5 //最小預備使用的PID數量
MaxSpareServers ?20 //最大預備使用的PID數量
ServerLimit ???4096 //服務器的限制
MaxClients ???4096 //最多可以有多少個客戶端同時連接到Apache,最大的同時連接數量,也就是process不會超過這一數值。這個MaxClients設置值可以控制同時連上www服務器的總連接要求數量,也可以將其看作是最高實時在線人數。不過要注意的是:這個值并非越大越好因為他會消耗物理內存(與process有關),所以如果你設置太高導致超出物理內存,能夠容許的范圍,那么效率就會大大降低(因為會跑SWAP),此外,MaxClients也在Apache編譯的時候就指定最大值了,所以你也無法超出系統最大值,除非你重新編譯
Apache MaxRequestsPerChild ?4000 //每個程序能夠提供的最大傳輸次數要求。舉例來說:如果有個用戶連上服務器之后,要求數百個網頁,當他的要求數量超過這個值的時候則該程序會被丟棄,另外切換一個新程序。這個設置可以有效地管理每個process在系統上存活的時間。根據觀察所得,新程序的效果較好。
</IfModule>
<IfModule worker.c> //MPM的另一個模型
StartServers ? ? ? ? ? ? 8
MaxClients ? ? ? ? ? ? ?4000
MinSpareThreads ? ? ? ? ? 25
MaxSpareThreads ? ? ? ? ? 75
ThreadsPerChild ? ? ? ? ? 75 //每個子進程的最大并發線程數
MaxRequestsPerChild ? ? 0
</IfModule>
上面的prefork和worker其實是兩個MPM模型的參數,可能會存在第三個模型event。默認的項目配置對于一般中小型網站來說已經很夠用了,網站的流量比較大,可以修訂一下里面的數值,設置的數值越大代表系統會啟動越多的程序來提供Apache的服務,反映速度就比較快。Redhat和CentOS將這兩個模塊分別放到了不同的執行文件中,分別是/usr/sbin/httpd(prefork模塊);/usr/sbin/httpd.worker(worker模塊),/etc/sysconfig/httpd 這個文件決定了Apache使用哪一個模塊,可以通過修改這個文件來切換不同的工作模式。參數HTTPD=/usr/sbin/httpd.worker
Listen 80 //監聽的端口,如有多塊網卡,默認監聽所有網卡
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so //啟動加載的模塊,Apache提供了非常多的模塊供我們使用
Include conf.d/*.conf //加載的配置文件
ServerAdmin root@localhost //系統管理員的郵箱,當網站出現問題的時候,錯誤信息會顯示的聯系郵箱
ServerName www.example.com:80 //默認是不需要指定的,服務器通過名字解析過程來獲得自己的名字,但如果解析有問題(如反向解析不正確),或者沒有DNS名字,也可以在這里指定IP地址,當這項不正確的時候服務器不能正常啟動。前面啟動Apache時候提示正在啟動 httpd:httpd: apr_sockaddr_info_get() failed forjustin httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1forServerName,解決方法就是啟動該項把www.example.com:80修改為自己的域名或者直接修改為localhost
UseCanonicalName Off //如果客戶端提供了主機名和端口,Apache將會使用客戶端提供的這些信息來構建自引用URL。這些值與用于實現基于域名的虛擬主機的值相同,并且對于同樣的客戶端可用。CGI變量SERVER_NAME和SERVER_PORT也會由客戶端提供的值來構建
DocumentRoot???“/var/www/html” //配置放置首頁的目錄
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
</Directory> //下面會有詳細介紹,例如:
<Directory “/var/www/html”> //使用Directory指定了一個絕對路徑的目錄
Options -Indexes FollowSymLinks //Options(目錄參數),此設置值表示在這個目錄內能夠讓Apache進行的操作,也就是針對Apache的程序的權限設置。主要的參數值有:
- Indexes:如果在此目錄下找不到首頁文件(默認為index.html)時,就顯示整個目錄下的文件名,至于首頁文件名則與DirectoryIndex設置的值有關,建議注釋掉Indexes
- FollowSymLinks:Fllow Symolic Links的縮寫,字面意義是讓連接文件可以生效。首頁的目錄是在/var/www/html,既然是WWW的根目錄,理論上就像被chroot一般。一般說來說被chroot的程序無法離開其目錄,也就是說,默認的情況下,你在/var/www/html下面的連接文件只要鏈接到非此目錄的其他地方,則該連接文件默認是失效的。但是使用這個設置可以讓鏈接有效的離開本目錄,默認為禁用
- ExecCGI:讓此目錄具有執行CGI的權限,非常重要。舉例來說,OpenWebMail使用了很多Perl程序,你要讓OpenWebMail可以執行,就需要在該程序所在目錄擁有ExecCGI的權限才行。但是要注意:不要讓所有的目錄均可以使用ExecCGI
- Includes:讓一些Server-Side Include程序可以運行。建議可以加上去
- MultiViews:這個有點像是多國語言的支持,與語言數據有關。在錯誤信息的回報內容中最常見,在同一臺主機中,可以依據客戶端的語言而給予不同的語言顯示。默認在回報信息中存在,你可以檢查一下/var/www/error/目錄下的數據。
- AllowOverride None:允許覆蓋參數功能,表示是否允許額外配置文件.htaccess的某些參數覆蓋。我們可以在httpd.conf內設置好所有的權限,不過這樣一來,若用戶自己的個人網頁想要修改權限時將會對管理員造成困擾。因此,Apache默認可以讓用戶以目錄下的.htaccess文件內覆蓋<Direcoty>內的某些功能參數。這個項目則是在規定.htaccess可以覆蓋的權限類型有哪些。常見的有以下幾種:
- ALL:全部的權限均可以覆蓋
- AuthConfig:僅有網頁認證(帳號與密碼)可以覆蓋
- Indexes:僅允許Indexes方面的覆蓋
- Limits:允許用戶利用Allow、Deny與Order管理可瀏覽的權限
- None:不可覆蓋,也就是讓.htaccess文件失效
使用.htaccess會嚴重影響到Apache的性能,如果不是特殊需要,建議關閉
?
Apache配置文件權限操作
Apache內部的Order可以處理相關權限的限制,其中有兩個值,Allow和Deny
Order deny,allow 可以理解為拒絕所有,開放特定
Order allow,deny 可以理解為開放所有,拒絕特定
當allow與deny中有重復的規則出現,則最后一條的配置起到了決定性的作用,比如
Order allow,deny //開放所有,拒絕特定
allow from all //定義了允許的規則,開放所有
deny 192.168.1.1 //定義了拒絕的規則,拒絕了一個IP,這個IP包含在第二行的all當中,所以它的權限就默認由最后一行配置決定,最后一行是deny,所以1.1被被拒之門外
</Directory>
DirectoryIndex ?jfedu.php index.html index.html.var //網站默認的首頁文件的名稱,如果上面的文件全部存在的話,就會按照設置的順序顯示排在最前面的首頁,這個與之前在Option中談到的Indexes有關。
<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy All
</Files> //不讓用戶查看.htpasswd和.htaccess這兩個文件
TypesConfig /etc/mime.types //用于設置保存有不同MIME(描述消息內容類型的因特網標準)類型數據的文件名
DefaultType text/plain //默認的網頁的類型
<IfModule mod_mime_magic.c>
# MIMEMagicFile /usr/share/magic.mime
MIMEMagicFile conf/magic
</IfModule> //指定判斷文件真實MIME類型功能的模塊
HostnameLookups Off //當打開此項功能時,在記錄日志的時候同時記錄主機名,這需要服務器來反向解析域名,增加了服務器的負載,通常不建議開啟
#EnableMMAP off //是否允許內存映射:如果httpd在傳送過程中需要讀取一個文件的內容,它是否可以使用內存映射。如果為on表示如果操作系統支持的話,將使用內存映射。在一些多核處理器的系統上,這可能會降低性能,如果在掛載了NFS的DocumentRoot上如果開啟此項功能,可能造成因為分段而造成httpd崩潰
#EnableSendfile off //這個指令控制httpd是否可以使用操作系統內核的sendfile支持來將文件發送到客戶端。默認情況下,當處理一個請求并不需要訪問文件內部的數據時(比如發送一個靜態的文件內容),如果操作系統支持,Apache將使用sendfile將文件內容直接發送到客戶端而并不讀取文件
ErrorLog logs/error_log //錯誤日志存放的位置
LogLevel warn //Apache日志的級別
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent //定義了日志的格式,并用不同的代號表示
#CustomLog logs/access_log common
CustomLog logs/access_log combined //說明日志記錄的位置,這里面使用了相對路徑,所以ServerRoot需要指出,日志位置就存放在/etc/httpd/logs
ServerSignature On //定義當客戶請求的網頁不存在,或者錯誤的時候是否提示apache的版本的一些信息
Alias /icons/ "/var/www/icons/" //定義一些不在DocumentRoot下的文件,而可以將其映射到網頁根目錄中,這也是訪問其他目錄的一種方法,但在聲明的時候切記目錄后面加”/”
<IfModule mod_dav_fs.c>
# Location of the WebDAV lock database.
DAVLockDB /var/lib/dav/lockdb
</IfModule> //對mod_dav_fs.c模塊兒的管理
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" //對CGI模塊兒的的別名,與Alias相似
# Redirect old-URI new-URL //Redirect參數是用來重寫URL的,當瀏覽器訪問服務器上的一個已經不存在的資源的時候,服務器返回給瀏覽器新的URL,告訴瀏覽器從該URL中獲取資源。這主要用于原來存在于服務器上的文檔改變位置之后,又需要能夠使用老URL能訪問到原網頁
IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
...
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
當一個HTTP請求的URL為一個目錄的時候,服務器返回這個目錄中的索引文件,如果目錄中不存在索引文件,并且服務器有許可顯示目錄文件列表的時候,就會顯示這個目錄中的文件列表,為了使得這個文件列表能具有可理解性,而不僅僅是一個簡單的列表,就需要前這些參數。如果使用了IndexOptionsFancyIndexing選項,可以讓服務器針對不同的文件引用不同的圖標。如果沒有就使用DefaultIcon定義缺省圖標。同樣,使用AddDescription可以為不同類型的文檔介入描述
AddLanguage ca .ca
......
AddLanguage zh-TW .zh-tw //添加語言
LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW //Apache支持的語言
AddDefaultCharset UTF-8 //默認支持的語言
#AddType application/x-tar .tgz//支持的應用如果想支持對php的解析添加這樣一行
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz //支持對以.Z和.gz.tgz結尾的文件
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz //添加對上述兩種文件的應用
#AddHandler cgi-script .cgi //修改為:AddHandler cgi-script .cgi .pl 表示允許擴展名為.pl的CGI腳本運行
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml //添加動態處理類型為server-parsed由服務器預先分析網頁內的標記,將標記改為正確的HTML標識
#ErrorDocument 404 /missing.html //當服務器出現404錯誤的時候,返回missing.html頁
<Directory "/var/www/error">
AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en es de fr
ForceLanguagePriority Prefer Fallback
</Directory> //對/var/www/error網頁的權限及操作
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
.....
設置特殊的參數,以保證對老版本瀏覽器的兼容,并支持新瀏覽器的特性
#NameVirtualHost *:80 //如果啟用虛擬主機的話,必須將前面的注釋去掉,而且,第二部分的內容都可以出現在每個虛擬主機部分。
#<VirtualHost *:80> //標簽后面的IP定義一定要和上面NameVirtualHost定義的一致
# ServerAdmin webmaster@www.linuxidc.com //管理員的郵箱
# DocumentRoot /www/docs/www.linuxidc.com //虛擬主機的網頁存放目錄,必須,
# ServerName www.linuxidc.com //能被DNS或Hosts解析的完整域名,必須
# ServerAlias www.dummy-host.example.com //虛擬主機別名
# ErrorLog logs/www.linuxidc.com-error_log //錯誤日志
# CustomLog logs/www.linuxidc.com-access_log common //訪問日志
#</VirtualHost>
在虛擬主機之上還能設置很多的功能,第二部分的內容都可以出現在每個虛擬主機部分,最精簡的配置是需要有ServerName和DocumentRoot這兩個配置,在添加了虛擬主機的配置之后需要把中心主機的信息也單獨寫成一個虛擬機的配置,(或者注銷ServerName和DocumentRoot這兩個配置),不然中心主機名的服務就不知道丟到哪里去了,這一步驟在Apache幫助文檔中稱做:取消中心主機
當然,如果你想有多個域名都指向到同一個虛擬主機是可以通過在<VirtualHost>塊中配置ServerAlias功能來實現的。
- DNS指向問題:如果你設置了別名,多個域名指向同一個虛擬主機,那么一定要保證DNS能正常解析的到
- <VirtualHost>段配置指定作用域的問題:你可以把其他一些指令放入<VirtualHost>段中,以更好的配置一個虛擬主機。大部分指令都可以放入這些<VirtualHost>段中以改變相應虛擬主機配置。主服務器(main server)范圍內的配置指令(在所有<VirtualHost>配置段之外的指令)僅在它們沒有被虛擬主機的配置覆蓋時才起作用。
- 虛擬主機名的問題:當一個請求到達的時候,服務器會首先檢查它是否使用了一個能和NameVirtualHost相匹配的IP地址。如果能夠匹配,它就會查找每個與這個IP地址相對應的<VirtualHost>段,并嘗試找出一個與請求的主機名相同的ServerName或ServerAlias配置項。如果找到了,它就會使用這個服務器。否則,將使用符合這個IP地址的第一個列出的虛擬主機。
順序展示:客戶端發起一個訪問域名的請求—>DNS解析到目標主機—>檢查是否開啟了虛擬主機的功能—>檢查是否能和NameVirtualHost相匹配—>查找出每個與該IP對應的虛擬主機段配置—>嘗試找出與請求的完整域名相同的ServerName或ServerAlias—>如果找到就使用這個虛擬主機的配置—>如果配置中與中心主機的配置不沖突則優先使用中心主機的配置,如果找不到與之相匹配的完整域名的虛擬主機配置—>使用符合這個IP地址的第一個虛擬主機
綜上所述,第一個列出的虛擬主機充當了默認虛擬主機的角色。當一個IP地址與NameVirtualHost指令中的配置相符的時候,主服務器中的DocumentRoot將永遠不會被用到。所以,如果你想創建一段特殊的配置用于處理不對應任何一個虛擬主機的請求的話,你只要簡單的把這段配置放到<VirtualHost>段中,并把它放到配置文件的最前面就可以了。
實例
NameVirtualHost?*:80<VirtualHost?*:80>ServerName?www1.myweb.com
ServerAlias www2.myweb.comDocumentRoot?/myseb/vhosts/www1
ErrorLog "logs/dummy-host.aaa.com-error.log"
<Directory "/myseb/vhosts/www1">
Options None
AllowOverride None
Order allow,deny
Allow from all
</Directory></VirtualHost><VirtualHost?*:80>ServerName?www1.myweb2.comDocumentRoot?/myweb/vhosts/www2</VirtualHost>