1. 程式人生 > >WEB應用之httpd基礎入門(一)

WEB應用之httpd基礎入門(一)

  前文我們聊了下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

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