前文咱們聊了下http協議web服務的一些常識和httpd服務器軟件三種響應模型的簡單介紹,回顧請參考http://www.javashuo.com/article/p-reeqozre-ct.html;今天咱們來聊一聊httpd的一些經常使用配置;html
httpd是一款歷史悠久的web服務器軟件,現現在比較流行的版本是2.2和2.4;對於httpd2.2的配置文件大概能夠分爲3段,第一段是全局指令配置段,對中心主機和虛擬主機都生效;第二段是中心主機相關配置;第三段是虛擬主機相關配置,做用於各虛擬主機;對於httpd2.2的配置中,中心主機的配置和虛擬主機的配置上能夠共存,共存表示它能夠在同一配置文件中,可是它兩不能同時生效,在使用虛擬主機配置時,咱們必須手動去註釋中心主機的Documentroot所指定的文件系統路徑;在2.4的配置中,雖然沒有明確的區分中心主機和虛擬主機,默認狀況下咱們使用虛擬主機,對於中心主機的配置,自動就失效了,咱們不須要額外的去是手動關閉中心主機的配置;node
所謂中心主機就是一個物理服務器上,只維護一個站點;而對於一個物理服務器來講維護一個站點實在是有點大材小用,因此後面就有了虛擬主機的概念;所謂虛擬主機咱們能夠理解爲,一臺物理服務器上維護着多個不一樣的站點,固然這些站點有基於ip地址的虛擬站點,這對於物理服務器來講要擁有多個ip地址才能實現,一般狀況下基於ip地址的虛擬服務器在互聯網上使用相對比較少;其次也有基於端口的虛擬站點,對於物理服務器,不一樣的站點監聽在不一樣的端口上,這類虛擬主機相對也不是很經常使用,咱們知道web服務默認工做在tcp的80端口,若是咱們在互聯網上讓web服務監聽在一個非80的端口上,這樣用戶訪問咱們的站點就不得而知所監聽的端口,因此這種基於端口的虛擬主機也是相對不經常使用的;還有就是比較經常使用的基於FQDN(名稱解析)或域名的虛擬主機,這裏虛擬主機能夠監聽在同一個ip和端口下,用戶請求咱們站點時,是以請求報文首部中的host來區分,對於用戶請求報文首部的不一樣的host,對於服務端就是不一樣的虛擬主機;對於虛擬主機以上三種方式均可以共存,也就說咱們的虛擬主機能夠是基於ip地址,能夠基於端口,能夠基於主機名或域名的名稱解析;web
不管是httpd2.2仍是httpd2.4,經過yum安裝的程序,默認主配置文件都是/etc/httpd/conf/httpd.conf,這個配置文件的格式是指令+值的方式,指令是不區分大小寫;當對應指令的值爲路徑時,是否區分字符大小寫取決於文件系統,Linux文件系統是區分大小寫的,windows是不區分大小寫的;瞭解了上面的配置文件的格式接下來咱們來講說一些經常使用的配置指令的用吧;windows
一、Listen:此指令是指定站點監聽的IP和端口,其語法格式爲Listen [IP-address:]portnumber [protocol];其中若是省略了ip表示監聽在物理服務器上的全部地址的對應端口;listen指令能夠重複出現屢次;修改這個指令後,重啓服務進程便可生效;若是限定客戶端必須經過ssl通訊是,其後面的protocol須要定義爲https;centos
示例:安全
提示:以上配置表示監聽本機全部地址的80端口,用戶能夠訪問本機任何一個地址的80端口,均可以被響應;bash
提示:以上配置就表示監聽本機的192.168.0.99這個地址的80端口上,若是本機還有其餘地址,用戶只有訪問192.168.0.99這個地址的80端口才可以被服務端響應;服務器
提示:以上配置表示192.168.0.99:443端口必須是https協議纔給予響應;若是咱們用http協議去訪問443端口,將不可以正常響應服務器資源的;iview
二、持久鏈接(保持鏈接,長鏈接)dom
什麼叫持久鏈接呢?所謂持久鏈接就是當tcp鏈接被創建後,每一個資源獲取完成後不斷開鏈接,而是繼續等待其餘資源請求的進行;什麼意思呢,咱們知道用戶經過http協議來訪問服務端資源時,首先是要創建tcp鏈接(三次握手)後,其次纔可以經過http協議通訊,當客戶端訪問一個資源後,tcp鏈接就會斷開,這樣一來若是客戶端請求的資源是不少,那麼對於這種請求不少資源的客戶端,若是每請求一次資源就得三次握手四次斷開,這對客戶端來講是至關慢的,爲了解決這樣一種窘境,長鏈接就出現了;對於長鏈接有兩個點須要考慮,第一個點上時間的限制,咱們不能也不該該讓一個用戶一直鏈接服務器而不斷開;第二個點就是請求資源的數量,咱們不可以讓一個用戶只請求了幾個資源後就斷開(若是一個頁面資源特別多的狀況),因此開啓長鏈接,咱們須要指定長鏈接的超時時長的同時,還須要指定最大請求資源的數量;
KeepAlive On|Off:此指令表示開啓或關閉長鏈接
KeepAliveTimeout time:此指令表示指定長鏈接的超時時長
MaxKeepAliveRequests number :此指令表示指定最大請求數量
示例:
提示:以上在主配置文件中加上這個指令就表示不開啓長鏈接
測試:
提示:能夠看到當服務端沒有開啓長鏈接功能時,客戶端訪問服務端,服務端響應客戶端後就直接斷開了;咱們配置啓用長鏈接功能在來試試呢?
提示:以上配置表示開啓長鏈接功能,一次訪問服務端資源的超時時長爲5秒(從上一次請求服務端後倒計時,若是在這個倒計時內沒有訪問服務端,則鏈接視爲超時,則斷開),最大請求資源數量爲5個,意思就是若是在5秒時間內,用戶請求服務端資源5秒鐘內請求資源的數量沒有達到5個鏈接將不會斷開;相反客戶端在5秒之內訪問資源大於5個,則鏈接將會斷開,即使沒有達到指定時間,又或者請求的資源沒有達到5個,可是鏈接的時長大於5秒,鏈接也會斷開;
測試:
提示:能夠看到開啓長鏈接後,用戶在第一次請求服務端資源後並無當即斷開,而且在第二次請求時間未到達5秒時請求了服務端,鏈接沒有被斷開,直到客戶端訪問了服務端的5次後或者客戶端訪問服務端一次後,在5秒鐘沒有請求服務端才被斷開;以上就是http的保持鏈接功能的演示,這裏須要提醒一下的是,httpd2.2和httpd2.4在保持鏈接功能上,httpd2.4能夠將超時時長精確到毫秒級別,配置和上面配置同樣,若是要精確的毫秒級別,只須要在keepalivetimeout 指令的後面的值上加上ms表示精確的毫秒;
三、MPM :httpd-2.2不支持同時編譯多個MPM模塊,因此只能編譯選定要使用的那個;CentOS 6的rpm包爲此專門提供了三個應用程序文件,httpd(prefork), httpd.worker, httpd.event,分別用於實現對不一樣的MPM機制的支持;
示例:查看如今使用的程序文件的方法
提示:默認使用的爲/usr/sbin/httpd,其爲prefork的MPM模塊 ;
示例:查看靜態編譯的模塊
提示:以上表示當前httpd 靜態編譯的模塊有 core.c prefork.c http_core.c mod_so.c,其中prefork.c表示使用的是prefork響應模型,這也是http2.2默認的響應模型;若是主程序是httpd.worker,查看靜態編譯模塊使用httpd.worker -l查看,event模型 使用httpd.event -l 查看;
示例:httpd.2.2查看靜態編譯及動態編譯的模塊
[root@test_node2-centos6 ~]# httpd -M httpd: apr_sockaddr_info_get() failed for test_node2-centos6.7 httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName Syntax OK Loaded Modules: core_module (static) mpm_prefork_module (static) http_module (static) so_module (static) auth_basic_module (shared) auth_digest_module (shared) authn_file_module (shared) authn_alias_module (shared) authn_anon_module (shared) authn_dbm_module (shared) authn_default_module (shared) authz_host_module (shared) authz_user_module (shared) authz_owner_module (shared) authz_groupfile_module (shared) authz_dbm_module (shared) authz_default_module (shared) ldap_module (shared) authnz_ldap_module (shared) include_module (shared) log_config_module (shared) logio_module (shared) env_module (shared) ext_filter_module (shared) mime_magic_module (shared) expires_module (shared) deflate_module (shared) headers_module (shared) usertrack_module (shared) setenvif_module (shared) mime_module (shared) dav_module (shared) status_module (shared) autoindex_module (shared) info_module (shared) dav_fs_module (shared) vhost_alias_module (shared) negotiation_module (shared) dir_module (shared) actions_module (shared) speling_module (shared) userdir_module (shared) alias_module (shared) substitute_module (shared) rewrite_module (shared) proxy_module (shared) proxy_balancer_module (shared) proxy_ftp_module (shared) proxy_http_module (shared) proxy_ajp_module (shared) proxy_connect_module (shared) cache_module (shared) suexec_module (shared) disk_cache_module (shared) cgi_module (shared) version_module (shared) [root@test_node2-centos6 ~]#
提示:以上若是後面是shared就表示編譯成可動態模塊,static表示靜態編譯的模塊;如上所示,若是模塊後面標記的是shared表示能夠動態裝載模塊使用,動態裝載使用LoadModule指令指定模塊名稱以及模塊存放路徑裝載便可;對於模塊後面是static標記的模塊表示隨程序自身已經將其編譯好,若是要更換隻能更換其程序;因此在httpd2.2的程序文件中有3個主程序文件,httpd、httpd.worker、httpd.enent 這三個程序文件對應的是三個不一樣的響應模型;對於httpd2.4來說,它只有一個主程序文件,將其對應響應模型是作成了動態模塊加載的形式,更改只須要在/etc/sysconfig/httpd文件中將HTTPD的值更改爲對應程序重啓服務便可;因此在httpd2.4若是要更換其響應模型,咱們只須要在/etc/httpd/conf.modules.d/00-mpm.conf 加載對應的模塊重啓服務便可;
示例:httpd.2.2更換使用httpd程序,以支持其它MPM機制
提示:若是咱們須要使用其餘響應模型來啓動httpd,咱們只須要將其HTTPD=/usr/sbin/httpd.worker 更改成對應的程序便可,而後重啓httpd服務便可生效,以下,咱們將httpd的響應模型更改成worker
提示:能夠看到咱們使用不一樣的httpd響應模型,對應啓動的進程各不相同,這是由於對於不一樣的響應模型,其配置是個不相同的;
MPM配置:對於httpd.2.2配置mpm在其配置文件裏就明確的說明了,以下
提示:以上信息是httpd2.2配置mpm的配置,其中ifmodule指令表示判斷當前程序靜態編譯的模塊文件,以上配置表示,若是當前程序靜態編譯的是prefork.c,則使用<IfModule prefork.c>配置塊裏的配置生效,若是當前程序靜態編譯的是worker.c則使用<IfModule worker.c>配置塊的配置生效;
對於prefork響應模型中的配置指令,startservers 表示指定啓動的空閒進程數量;也就是說服務啓動,生成多少個子進程等待接收用戶請求;minspareservers表示最小空閒進程數量;maxspareservers表示最大空閒進程數量;serverlimit表示服務器生存期的MaxClients的最大值;maxclients表示最大容許啓動的進程數量;一般狀況下serverlimit的值同maxclients的值同樣;startservers的值應該小於maxspareservers的值,大於minspareservers的值;MaxRequestsPerChild表示一個子進程最大可以接收的請求數量,若是子進程接收處理請求的數量到達咱們指定的值時,主控進程會將其銷燬,而後從新啓動一個新的子進程;若是該值是0 表示不限制子進程的最大接收處理請求的數量;
對於worker響應模型中的配置指令,startservers一樣表示啓動的空閒進程數量;maxclients表示最大客戶端的鏈接數量;minsparethreads表示最小空閒線程數量;maxsparethreads表示最大空閒線程數量;threadsperchild表示一個子進程內部啓動的線程數量;maxrequestsperchild表示限定子進程接收處理請求的數量,若是是worker響應模型,一般狀況都是0,表示不限制;
示例:在httpd2.4中配置prefork響應模型
提示:在httpd2.4中若是要手動配置mpm,須要編輯/etc/httpd/conf.module.d/00-mpm.conf文件,將其對應的配置寫進去,重啓httpd服務便可;
提示:在沒有重啓httpd以前,咱們能夠看到啓動了5個子進程一個主控進程;
提示:咱們重啓了httpd服務後,能夠看到咱們指定啓動子進程數量爲8個生效了;同理若是配置worker響應模型也能夠在/etc/httpd/conf.moudle.d/00-mpm.conf中加入對應的配置重啓服務便可;
四、DSO機制,所謂DSO機制就是httpd支持動態加載模塊的方式,在上面的配置中,咱們有提到過動態加載模塊的方法,用LoadMoudle指令指定要加載的模塊名稱(須要將模塊的真實名稱的「mod_」去掉將其後面的".so"更換成"_module")以及模塊存放路徑以及真實名稱(帶.so),以下
提示:以上表示裝載mpm_prefork_module 其對應模塊的路徑名稱爲modules/mod_mpm_prefork.so,以上使用的模塊路徑名稱是使用的相對路徑,這個相對路徑時相對於serverroot指令所指定的路徑;
提示:此指令是在主配置文件中指定,因此不難找到httpd模塊存放路徑在/etc/httpd/modules/目錄中
提示:其實這個目錄也是一個軟鏈接,真正的目錄是在/usr/lib64/httpd/modules;對於httpd2.2動態加載模塊,其方式方法是同樣的,只不過它加載模塊的配置上卸載/etc/httpd/conf/httpd.conf文件中;而httpd2.4是在/etc/httpd/conf.moudles.d/00-base.conf中加載;
五、servername:設定標識中心主機或虛擬主機名稱
語法:ServerName [scheme://]fully-qualified-domain-name[:port],一般狀況下都是fqdn名稱
六、serveralias:設定表示虛擬主機別名,此指令只能用於虛擬主機
語法:ServerAlias hostname [hostname] ...
示例:
提示:以上指令可標識中心主機名稱,也能夠標識虛擬主機名稱
<VirtualHost *:80> ServerName server.domain.com ServerAlias server server2.domain.com server2 ServerAlias *.example.com UseCanonicalName Off # ... </VirtualHost>
提示:serveralias指令指令用於標識虛擬主機名稱,能夠在一個虛擬主機內屢次使用,表示多個別名
七、DocumentRoot標識URL根路徑與之對應的文件系統路徑映射,意思定義httpd服務器工做目錄;
示例:
提示:以上定義就表示指定httpd的工做目錄爲/var/www/html;若是用戶訪問/index.html,就至關於訪問/var/www/html/index.html;這裏特別要注意一點的是URL路徑和文件系統路不是等同的,他倆是存在一種映射關係;
八、站點訪問控制常見機制;httpd的資源訪問控制有兩種機制指定,第一種是文件系統路徑訪問控制,第二種是基於URL路徑的訪問控制;
示例:基於文件系統路徑的訪問控制
提示:以上是默認httpd2.4的根路徑訪問控制的配置示例;以上配置表示/var/www/html這個目錄容許全部人訪問,即所用用戶均可以經過訪問對應URL「/」來訪問該目錄中的文件;
提示:以上配置表示訪問的文件名稱中包含.ht開頭的文件是不容許被訪問的;
提示:以上配置表示 若是用戶訪問的文件名稱是.gif或者是jpeg或jpg 或者是png結尾的,那麼都被容許訪問;經過文件路徑訪問控制一般狀況是以上三種形式來指定文件系統路徑或文件,而後作容許或拒絕訪問;
示例:基於URL路徑的訪問控制
提示:以上配置表示用戶訪問的URL路徑被匹配到將拒絕被拒絕訪問;
提示:以上配置表示當用戶訪問的url被指定locationmatch匹配時,將容許ip地址爲192.168.0.0/24網段的用戶訪問;基於URL的訪問控制主要就是以上兩種方式配置;這裏還須要注意一點,若是咱們想讓某一網段內的全部主機訪問,可是排除某一ip訪問時,咱們須要把對應的規則寫到<requireall> 容器中;
提示:若是咱們這樣配置,是有語法錯誤的;
提示:咱們要想匹配某一網段,或者咱們指定了一個範圍內的主機,又排除了部分主機時,咱們須要把其配置在一個<requireall>配置段中;以下
提示:這樣配置,咱們再作語法檢測就不會出現問題了
以上配置都是在httpd2.4中的配置,在httpd2.2中,訪問控制的配置同2.4所使用的指令都差很少,惟一不一樣的是裏面的require 對應httpd2.2中就不是require 了,在httpd2.2中的訪問控制是這樣的;以下
說明:在httpd2.2中的訪問控制要使用order allow,deny,這個指令主要是指定默認是容許仍是被拒絕,以上配置表示,默認不被指定條目所匹配的都拒絕,一般狀況下默認法則就是order最後的值,若是是allow就表示默認法則是容許的,若是是deny就表示默認法則是被拒絕的,像上面的例子就是默認法則被拒絕;
示例:httpd2.2基於文件系統文件名做訪問控制
提示:以上配置表示用戶訪問以.ht開頭的文件都將被拒絕;
提示:以上配置表示用戶訪問以.gif或者gpg或者jpg或者jpeg或者png結尾的資源都將被容許;
示例:httpd2.2基於URL訪問控制
提示:以上配置表示用戶訪問的url是/index.html時將被容許任何人訪問,訪問/admin或者/login時,將拒絕用戶IP爲192.168.0.0/24網段的用戶訪問;
九、options:配置特定目錄中可用的特性,其後可跟一個或多個以空白字符分隔的選項列表;
Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶;
FollowSymLinks:容許跟蹤符號連接文件所指向的源文件;
None:表示沒有任何特性;
ALL:表示出Multiviews 的全部特性;
示例:
提示:以上配置表示配置中心主機的根目錄爲/data/www/html,而且容許在其根路徑下沒有主頁文件,將其目錄下的文件以索引的方式羅列出來;
提示:能夠看到當對應目錄下沒有主頁文件時,使用options 指定 indexes就能夠將其目錄下的資源給羅列出來;
提示:以上配置在前面的配置上加了容許訪問連接文件所鏈接的源文件
提示:能夠看到咱們配置對應目錄下的資源選項容許對應目錄下的鏈接文件訪問源文件後,重讀配置文件就能夠在對應目錄下訪問鏈接文件所鏈接的源文件;一般狀況下options指令的值爲none比較安全,若是咱們的站點沒有特殊要求,建議都將options的值設置爲none
十、定義站點主頁
DirectoryIndex:此指令指定主頁文件名稱,能夠是多個分別用空白字符隔開;表示主頁文件能夠是指定主頁文件名稱列表中的任意一個;
示例:定義主頁文件爲test.html
提示:以上配置表示配置/data/www/html/目錄下的主頁文件爲test.html
提示:能夠看到在對應目錄下有了主頁文件後,其餘文件就再也不以索引的方式給羅列出來,而且經過訪問服務端,也都是響應的是指定主頁文件內容;