前文我們聊了下http協議web服務的一些常識和httpd服務器軟件三種響應模型的簡單介紹,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/12515075.html;今天我們來聊一聊httpd的一些常用配置;
httpd是一款歷史悠久的web服務器軟件,現如今比較流行的版本是2.2和2.4;對於httpd2.2的配置文件大概可以分為3段,第一段是全局指令配置段,對中心主機和虛擬主機都生效;第二段是中心主機相關配置;第三段是虛擬主機相關配置,作用於各虛擬主機;對於httpd2.2的配置中,中心主機的配置和虛擬主機的配置上可以共存,共存表示它可以在同一配置文件中,但是它兩不能同時生效,在使用虛擬主機配置時,我們必須手動去注釋中心主機的Documentroot所指定的文件系統路徑;在2.4的配置中,雖然沒有明確的區分中心主機和虛擬主機,默認情況下我們使用虛擬主機,對於中心主機的配置,自動就失效了,我們不需要額外的去是手動關閉中心主機的配置;
所謂中心主機就是一個物理服務器上,只維護一個站點;而對於一個物理服務器來說維護一個站點實在是有點大材小用,所以后面就有了虛擬主機的概念;所謂虛擬主機我們可以理解為,一台物理服務器上維護着多個不同的站點,當然這些站點有基於ip地址的虛擬站點,這對於物理服務器來說要擁有多個ip地址才能實現,通常情況下基於ip地址的虛擬服務器在互聯網上使用相對比較少;其次也有基於端口的虛擬站點,對於物理服務器,不同的站點監聽在不同的端口上,這類虛擬主機相對也不是很常用,我們知道web服務默認工作在tcp的80端口,如果我們在互聯網上讓web服務監聽在一個非80的端口上,這樣用戶訪問我們的站點就不得而知所監聽的端口,所以這種基於端口的虛擬主機也是相對不常用的;還有就是比較常用的基於FQDN(名稱解析)或域名的虛擬主機,這里虛擬主機可以監聽在同一個ip和端口下,用戶請求我們站點時,是以請求報文首部中的host來區分,對於用戶請求報文首部的不同的host,對於服務端就是不同的虛擬主機;對於虛擬主機以上三種方式都可以共存,也就說我們的虛擬主機可以是基於ip地址,可以基於端口,可以基於主機名或域名的名稱解析;
不論是httpd2.2還是httpd2.4,通過yum安裝的程序,默認主配置文件都是/etc/httpd/conf/httpd.conf,這個配置文件的格式是指令+值的方式,指令是不區分大小寫;當對應指令的值為路徑時,是否區分字符大小寫取決於文件系統,Linux文件系統是區分大小寫的,windows是不區分大小寫的;了解了上面的配置文件的格式接下來我們來說說一些常用的配置指令的用吧;
1、Listen:此指令是指定站點監聽的IP和端口,其語法格式為Listen [IP-address:]portnumber [protocol];其中如果省略了ip表示監聽在物理服務器上的所有地址的對應端口;listen指令可以重復出現多次;修改這個指令后,重啟服務進程即可生效;如果限定客戶端必須通過ssl通信是,其后面的protocol需要定義為https;
示例:

提示:以上配置表示監聽本機所有地址的80端口,用戶可以訪問本機任何一個地址的80端口,都可以被響應;

提示:以上配置就表示監聽本機的192.168.0.99這個地址的80端口上,如果本機還有其他地址,用戶只有訪問192.168.0.99這個地址的80端口才能夠被服務端響應;

提示:以上配置表示192.168.0.99:443端口必須是https協議才給予響應;如果我們用http協議去訪問443端口,將不能夠正常響應服務器資源的;
2、持久連接(保持連接,長連接)
什么叫持久連接呢?所謂持久連接就是當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表示精確的毫秒;
3、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中加入對應的配置重啟服務即可;
4、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中加載;
5、servername:設定標識中心主機或虛擬主機名稱
語法:ServerName [scheme://]fully-qualified-domain-name[:port],通常情況下都是fqdn名稱
6、serveralias:設定表示虛擬主機別名,此指令只能用於虛擬主機
語法:ServerAlias hostname [hostname] ...
示例:

提示:以上指令可標識中心主機名稱,也可以標識虛擬主機名稱
<VirtualHost *:80> ServerName server.domain.com ServerAlias server server2.domain.com server2 ServerAlias *.example.com UseCanonicalName Off # ... </VirtualHost>
提示:serveralias指令指令用於標識虛擬主機名稱,可以在一個虛擬主機內多次使用,表示多個別名
7、DocumentRoot標識URL根路徑與之對應的文件系統路徑映射,意思定義httpd服務器工作目錄;
示例:

提示:以上定義就表示指定httpd的工作目錄為/var/www/html;如果用戶訪問/index.html,就相當於訪問/var/www/html/index.html;這里特別要注意一點的是URL路徑和文件系統路不是等同的,他倆是存在一種映射關系;
8、站點訪問控制常見機制;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網段的用戶訪問;
9、options:配置特定目錄中可用的特性,其后可跟一個或多個以空白字符分隔的選項列表;
Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶;
FollowSymLinks:允許跟蹤符號鏈接文件所指向的源文件;
None:表示沒有任何特性;
ALL:表示出Multiviews 的所有特性;
示例:

提示:以上配置表示配置中心主機的根目錄為/data/www/html,並且允許在其根路徑下沒有主頁文件,將其目錄下的文件以索引的方式羅列出來;

提示:可以看到當對應目錄下沒有主頁文件時,使用options 指定 indexes就可以將其目錄下的資源給羅列出來;

提示:以上配置在前面的配置上加了允許訪問鏈接文件所連接的源文件

提示:可以看到我們配置對應目錄下的資源選項允許對應目錄下的連接文件訪問源文件后,重讀配置文件就可以在對應目錄下訪問連接文件所連接的源文件;通常情況下options指令的值為none比較安全,如果我們的站點沒有特殊要求,建議都將options的值設置為none
10、定義站點主頁
DirectoryIndex:此指令指定主頁文件名稱,可以是多個分別用空白字符隔開;表示主頁文件可以是指定主頁文件名稱列表中的任意一個;
示例:定義主頁文件為test.html

提示:以上配置表示配置/data/www/html/目錄下的主頁文件為test.html

提示:可以看到在對應目錄下有了主頁文件后,其他文件就不再以索引的方式給羅列出來,並且通過訪問服務端,也都是響應的是指定主頁文件內容;
