前兩天學習了WEB服務感覺挺簡單的,然而一直對于其主配置檔案的各個部分的含義并不是很清楚,将其整理一下,和大家分享。
首先配置檔案分為三部分使用指令:grep "/" /etc/httpd/conf/httpd.conf -n
得到:
33:### Section 1: Global Environment
234:### Section 2: 'Main' server configuration
955:### Section 3: Virtual Hosts
其中三部分意義分别是全局配置檔案,主配置檔案,虛拟主機。其中需要說明一下主配置檔案的選項在虛拟主機中都可以使用。以下将分别介紹這三個部分
全局配置檔案
ServerRoot "/etc/httpd"
用于指定Apache的運作目錄,服務啟動之後自動将目錄改變為目前目錄,在後面使用到的所有相對路徑都是想對這個目錄下
PidFile run/httpd.pid
記錄httpd守護程序的pid号碼,這是系統識别一個程序的方法,系統中httpd程序可以有多個,但這個PID對應的程序是其他的父程序
Timeout 120
伺服器與用戶端與伺服器斷開的時間
KeepAlive Off
是否持續連接配接(因為每次連接配接都得三次握手,如果是通路量不大,建議打開此項,如果網站通路量比較大關閉此項比較好)
MaxKeepAliveRequests 100
表示一個連接配接的最大請求數
KeepAliveTimeout 15
斷開連接配接前的時間
StartServers 8
MinSpareServers 5
maxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
以上這幾行是系統預設的子產品兒,表示為每個通路啟動一個程序(即當有多個連接配接公用一個程序的時候,在同一時刻隻能有一個獲得服務)。
StartServer開始服務時啟動8個程序,最小空閑5個程序,最多空閑20個程序。
MaxClient限制同一時刻用戶端的最大連接配接請求數量超過的要進入等候隊列。
MaxRequestsPerChild每個程序生存期内允許服務的最大請求數量,0表示永不結束
ServerLimit 10
ThreadLimit 64
StartServers 2
MaxClients 250
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
以上幾行是為Apache配置線程通路,即每對WEB服務通路啟動一個線程,這樣對記憶體占用率比較小。
ServerLimit伺服器允許配置程序數的上限。
ThreadLimit每個子程序可能配置的線程上限
StartServers啟動兩個httpd程序,
MaxClients同時最多能發起250個通路,超過的要進入隊列等待,其大小有ServerLimit和ThreadsPerChild的乘積決定
ThreadsPerChild每個子程序生存期間常駐執行線程數,子線程建立之後将不再增加
MaxRequestsPerChild每個程序啟動的最大線程數,如達到限制數時程序将結束,如置為0則子線程永不結束
Listen 80
監聽的端口,如有多塊網卡,預設監聽所有網卡
LoadModule .......
啟動時加載的子產品兒
Include conf.dpublic_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#
# Order allow,deny
# Allow from all
# Order deny,allow
# Deny from all
如果允許通路使用者的家目錄中的網頁檔案,則取消以上注釋,并對其中進行修改
DirectoryIndex index.html index.html.var
指定所要通路的首頁的預設首頁名字
AccessFileName .htaccess
定義每個目錄下的通路控制檔案名,預設為.htaccess
Order allow,deny
Deny from all
控制不讓web上的使用者來檢視.htpasswd和.htaccess這兩個檔案
TypesConfig /etc/mime.types
用于設定儲存有不同MIME類型資料的檔案名,
DefaultType text/plain
預設的網頁的類型
# MIMEMagicFile /usr/share/magic.mime
MIMEMagicFile conf/magic
指定判斷檔案真實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需要指出
ServerSignature On
定義當客戶請求的網頁不存在,或者錯誤的時候是否提示伺服器的版本的一些資訊
Alias /icons/ "/var/www/icons/"
定義一些不在DocumentRoot下的檔案,而可以将其映射到網頁根目錄中,這也是通路其他目錄的一種方法,但在聲明的時候切記目錄後面加 ”/”
Options Indexes MultiViews
AllowOverride None
Allow from all
以上這幾行定義了,對/var/www/icons/的權限
# Location of the WebDAV lock database.
DAVLockDB /var/lib/dav/lockdb
這是對mod_dav_fs.c子產品兒的管理
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
對CGI子產品兒的的别名,與Alias相似。
Options None
對/var/www/cgi-bin檔案夾的管理,方法同上
#Redirect old-URI new-URL
Redirect參數是用來重寫URL的,當浏覽器通路伺服器上的一個已經不存在的資源的時候,伺服器傳回給浏覽器新的URL,告訴浏覽器從該URL中擷取資源。這主要用于原來存在于伺服器上的文檔改變位置之後,又需要能夠使用老URL能通路到原網頁
IndexOptions FancyIndexing
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/p_w_picpath2.gif) p_w_picpath/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
#AddDescription “GZIP compressed document“ .gz
#AddDescription “tar archive“ .tar
#AddDescription “GZIP compressed tar archive“ .tgz
ReadmeName README
HeaderName HEADER
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
當一個HTTP請求的URL為一個目錄的時候,伺服器傳回這個目錄中的索引檔案,如果目錄中不存在索引檔案,并且伺服器有許可顯示目錄檔案清單的時候,就會顯示這個目錄中的檔案清單,為了使得這個檔案清單能具有可了解性,而不僅僅是一個簡單的清單,就需要前這些參數。如果使用了IndexOptions FancyIndexing 選項,可以讓伺服器針對不同的檔案引用不同的圖示。如果沒有就使用DefaultIcon定義預設圖示。同樣,使用AddDescription可以為不同類型的文檔介入描述
AddLanguage zh-CN .zh-cn
添加語言
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的解析添加這樣一行
AddType application/x-httpd-php .php
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz
以上兩行表示支援對以.Z和.gz .tgz結尾的檔案
AddType application/x-gzip .gz .tgz
添加對上述兩種檔案的應用
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
添加動态處理類型為server-parsed由伺服器預先分析網頁内的标記,将标記改為正确的HTML辨別
#ErrorDocument 404 /missing.html
當伺服器出現404錯誤的時候,傳回missing.html頁面
Alias /error/ "/var/www/error/"
同理為指派别名
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
LanguagePriority en es de fr
ForceLanguagePriority Prefer Fallback
以上為對/var/www/error網頁的權限及操作
BrowserMatch
這裡設定特殊的參數,以保證對老版本浏覽器的相容,并支援新浏覽器的特性
虛拟主機
NameVirtualHost *:80
這是虛拟主機的設定,如果啟用虛拟主機的話,必須将前面的注釋去掉,而且,第二部分的内容都可以出現在每個虛拟主機部分。
# ServerAdmin webmaster@網址
# DocumentRoot /www/docs/網址
# ServerName 網址
# ErrorLog logs/網址-error_log
# CustomLog logs/網址-access_log common
以上為一個虛拟主機的示例,和第二部分的内容完全相同。
==================================================================================
1、KeepAlive的概念與優勢
HTTP的KeepAlive就是浏覽器和服務端之間保持長連接配接,這個連接配接是可以複用的。當用戶端發送一次請求,收到相應内容後,這個連接配接會保持一段時間,在該時間内的第二次就不需要再重建立立連接配接,就可以直接使用這次的連接配接來發送請求了,極大的提高了速度。
2、KeepAlive的劣勢
是不是所有網站都應該開啟KeepAlive了?答案肯定是不是的。KeepAlive在增加通路效率的同時,也會增加伺服器的壓力。
3、apache配置KeepAlive
apache通過配置KeepAlive和KeepAliveTimeout來控制KeepAlive,具體參數如下:
KeepAlive On/Off (可以設定開啟On或者是關閉Off)
KeepAliveTimeout 10 (持久連接配接保持的時間,到時間會斷開連結)
4、案例說明(來源網際網路):
假設 KeepAlive 的逾時時間為 10 秒種,伺服器每秒處理 50 個獨立使用者通路,那麼系統中Apache的總程序數就是 10 * 50 = 500 個,如果一個程序占用 4M 記憶體,那麼總共會消耗2G記憶體,是以可以看出,在這種配置中,相當消耗記憶體,但好處是系統隻處理了 50次 TCP 的握手和關閉操作。
如果關閉 KeepAlive,如果還是每秒50個使用者通路,如果使用者每次連續的請求數為3個,那麼 Apache 的總程序數就是 50 * 3 = 150 個,如果還是每個程序占用 4M 記憶體,那麼總的記憶體消耗為600M,這種配置能節省大量記憶體,但是,系統處理了 150 次 TCP 的握手和關閉的操作,是以又會多消耗一些 CPU 資源。
5、總結
(1)如果記憶體和CPU都足夠,開啟和關閉KeepAlive對性能影響不大。
(2)如果考慮伺服器壓力,如果是靜态頁面,大量的調用js或者圖檔的話,建議開啟KeepAlive;如果是動态網頁,建議關閉KeepAlive。
===============================
Apache worker & prefork (相對來說,prefork方式速度要稍高于worker,然而它需要的cpu和memory資源也稍多于worker)
選擇prefork還是worker可以在編譯時使用 --with-mpm=MPM參數來指定,預設為prefork,
prefork
prefork采用預派生子程序方式,用單獨的子程序來處理不同的請求,程序之間彼此獨立。在make編譯和make install安裝後,使用httpd -l 來确定目前使用的MPM是不是prefork.c .檢視httpd-mpm.conf配置檔案,裡面包含如下預設的配置段:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5500
MaxRequestsPerChild 100
prefork控制程序在最初建立“startServers”子程序後,為了滿足MinSpareServers設定的需要建立了一個程序,等待一秒钏,繼續建立兩個,再等待一秒鐘,繼續建立4個... ... 如此按指數級增加建立的程序數,最多達到每秒32個,直到滿足MinspareServers設定的值為止。這種模式可以不必在請求到來時再産生新的程序,進而減小了系統開銷以增加性能。MaxSpareServers設定了最大的空閑程序數,如果空閑程序數大于這個值,Apache會自動kill掉一些多餘程序。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整為MinSpareServers+1。如果站點負載較大,可以考慮同時加大MinSpareServers和MaxSpareServers。MaxRequestsPerChild 設定的是每個子程序可處理的請求數。每個子程序在處理了“MaxRequestsPerChild”請求後将自動銷毀。0意味着無限,即子程序永不銷毀。雖然預設設為0可以觎每個子程序處理更多的請求,但如果設成非零值也有兩點重要的好處:
1、可以防止意外的記憶體洩漏。
2、在伺服器負載下降的時候會自動減少子程序數。是以,可根據伺服器的負載來調整這個值。MaxClients是這些指令中最為重要的一個,設定的是Apache可以同時處理的請求,是對Apache性能影響最大的參數。其預設值150是遠遠不夠的,如果請求總數已達到這個值(可以通過ps -ef |grep httpd |wc -l來确認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP通路卻很慢的主要原因。雖然理論上這個值越大可以處理的請求越多,但Apache預設限制不能大于256。 ServerLimit指令無須重編譯Apache就可以加大MaxClients 。
worker
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
相對于prefork,worker全新的支援多線程和多程序混合模型的MPM。由于使用線程來處理,是以可以處理相對海量的請求,而系統資源的開銷要小于基于程序的伺服器。但是,worker也使用了多程序,每個程序又生成多個線程,以獲得基于程序伺服器的穩定性。在configure --with-mpm=worker後,進行make編譯、make install安裝。在預設生成的httpd-mpm.conf中有以下預設的配置段:
StartServers 2
MaxClients 150
Worker由主要制程序生成“StartServers”個子程序,每個子程序中包含固定的ThreadsPerChild線程數,各個線程獨立的處理請求。同樣,為了不在請求到來 時再生成線程,MinSpareThreads和MaxSpareThreads設定了最少和最多的空閑線程數;而MaxClients設定了同時連入的clients最大總數。如果現有子程序中的線程總數不能滿足負載,控制程序将派生新的子程序。MinSpareThreads和MaxSpareThreads的最大預設值分别是75和250.這兩個參數對Apache的性能影響并不大,可以按照實際情況相應調節。ThreadsPerChild是Worker MPM中與性能相關最密節的指令。ThreadsPerChild的最大預設值是64,如果負載較大,64也是不夠的。這時要顯示傅ThreadLimit指令,它的最大預設值是20000 。Worker模式下所能同時處理的請求總數是由子程序總數乘以ThreadsPerChild值決定的,應該大于等于MaxClients。如果負載很大,現有的子程序數不能滿足時,控制程序會派生新的子程序。預設最大的子程序總數是16,加大時也需要顯示聲明serverlimit (最大值是20000)
。需要注意的是,如果顯示聲明了ServerLimit,那麼它乘以ThreadsPerChild的值必須大于等于MaxClients,而且MaxClients必須是ThreadserChild的整數倍,否則Apache将會自動調節到一個相應值。
ServerLimit 25
ThreadLimit 200