Linux基礎教程之HTTP相關配置解讀
1、建立連接:接收或拒絕鏈接請求2、接受請求:接收客戶端請求報文中對某資源的一次請求的過程
Web訪問響應模型(Web I/O)單進程I/O模型:啟動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應;多進程I/O模型:并行啟動多個進程,每個進程響應一個鏈接請求;復用I/O結構:啟動一個進程,同時響應N個鏈接請求;實現方法:多線程模型和事件驅動;多線程模型:一個進程生成N個線程,每線程響應一個連接請求;事件驅動:一個進程處理N個請求。復用的多進程I/O模型:啟動M個進程,每個進程響應N個連接請求,同時接收M*N個請求。
?3、處理請求:
服務器對請求報文進行解析,并獲取請求的資源及請求方法
等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理元數據:請求報文首部<method> <URL> <VERSION>HEADERS 格式 name:value<request body>
示例:Host : haohuigou.com 請求的主機名稱Server: Apache/2.4.7HTTP常用請求方式,Method GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
4、訪問資源:
服務器獲取請求報文中請求的資源web服務器,即存放了 web資源的服務器,負責向請求者提供對方請求的靜態資源,或 動態運行后生成的資源 。資源放置于本地文件系統特定的路徑:DocRoot –> /var/www/html/var/www/html/images/logo.jpghttp://haohuigou.com/images/logo.jpgweb服務器資源路徑映射方式:
(a) docroot(b) alias(c) 虛擬主機docroot(d) 用戶家目錄docroot
?5、構建響應報文:
一旦Web服務器識別除了資源,就執行請求方法中描述的動作,并返回響應報文。響應報文中包含有響應狀態碼、響應首部,如果生成了響應主體的話,還包括響應主體。
1)響應實體:如果事務處理產生了響應主體,就將內容放在響應報文中回送過去。響應報文中通常包括: 描述了響應主體MIME類型的Content-Type首部描述了響應主體長度的Content-Length 實際報文的主體內容2)URL重定向:web服務構建的響應并非客戶端請求的資源 ,而是資源另外一個訪問路徑:
永久重定向:http://www.360buy.com臨時重定向:http://www.taobao.com
3)MIME類型:
Web服務器要負責確定響應主體的MIME類型。有很多配置服務器的方法可以將MIME類型與資源管理起來 ;魔法分類:Apache web服務器可以掃描每個資源的內容,并將其與一個已知模式表(被稱為魔法文件)進行匹配,以決定每個文件的MIME類型。這樣做可能比較慢,但很方便,尤其是文件沒有標準擴展名的時候;顯式分類:可以對Web服務器進行配置,使其不考慮文件的擴展名或內容,強制特定文件或目錄內容擁有某個MIME類型。類型協商: 有些Web服務器經過配置,可以以多種文檔格 式來存儲資源。在這種情況下,可以配置Web服務器,使其可 以通過與用戶的協商來決定使用哪種格式(及相關的MIME類型 )”最好”
6、發送響應報文
Web服務器通過連接發送數據時也會面臨與接收數據一 樣的問題。服務器可能有很多條到各個客戶端的連接,有些是空 閑的,有些在向服務器發送數據,還有一些在向客戶端回送響應 數據。服務器要記錄連接的狀態,還要特別注意對持久連接的處 理。對非持久連接而言,服務器應該在發送了整條報文之后,關 閉自己這一端的連接。對持久連接來說,連接可能仍保持打開狀 態,在這種情況下,服務器要正確地計算Content-Length首部 ,不然客戶端就無法知道響應什么時候結束了
7、記錄日志?
最后,當事務結束時,Web服務器會在日志文件中添加 一個條目,來描述已執行的事務
特性:
高度模塊化: core+modulesDSO:Dynamic Shared Object 動態加/卸載MPM:multi-processing module 多路處理模塊MPM工作模式:
prefork:多進程I/O模型,每個進程響應一個請求,默認模型 。一個主進程:生成和回收n個子進程,創建套接字,不響應請求多個子進程:工作work進程,每個子進程處理一個請求;系統初始 時,預先生成多個空閑進程,等待請求,最大不超過1024個 。worker:復用的多進程I/O模型,多進程多線程,IIS使用此模型 。一個主進程:生成m個子進程,每個子進程負責生成n個線程,每個 線程響應一個請求,并發響應請求:m*nevent:事件驅動模型(worker模型的變種)一個主進程:生成m個子進程,每個進程直接響應n個請求,并發響 應請求:m*n,有專門的線程來管理這些keep-alive類型的線程,當有 真實請求時,將請求傳遞給服務線程,執行完畢后,又允許釋放。這樣 增強了高并發場景下的請求處理能力 。httpd-2.2: event 測試版, centos6默認httpd-2.4:event 穩定版,centos7默認
版本:centos6:2.2centos7:2.4安裝方式:rpm:centos發行版,穩定,建議使用編譯:定制或特殊需求Centos 6程序環境:httpd-2.2配置文件:/etc/httpd/conf/httpd.conf/etc/httpd/conf.d/*.conf檢查配置語法:????????????httpd -t
? ? ? ? ? ??service httpd configtest
? ????進行語法檢測時,會報錯,雖然沒有影響,但是也不好看;解決方法:
? ? ? ? ? ? 方法一:
? ? ? ? ? ? ? ? ? ? ? ?
方法二: vim /etc/hosts ?進行本地地址解析
? ? ?
服務腳本:/etc/rc.d/init.d/httpd
腳本配置文件:/etc/sysconfig/httpd服務控制和啟動:
chkconfig httpd on|offservice {start|stop|restart|status|configtest|reload} httpd
站點網頁文檔根目錄: /var/www/html模塊文件路徑:?
/etc/httpd/modules
/usr/lib64/httpd/modules
主程序文件:
/usr/sbin/httpd/usr/sbin/httpd.worker/usr/sbin/httpd.event主進程文件: /etc/httpd/run/httpd.pid/var/run/httpd/httpd.pid
日志文件目錄:
/var/log/httpdaccess_log: 訪問日志error_log:錯誤 日志
幫助文檔包:
? ? ? ? ? ? httpd-manual
? ??? 如果上不了網時,可以手動安裝文檔包,進行查看
Httpd 2.2常見配置模塊文件路徑:
/usr/lib64/httpd/modules
httpd配置文件的組成:
# grep “Section” /etc/httpd/conf/httpd.conf 主配置文件### Section 1: Global Environment 全局環境匹配### Section 2: ‘Main’ server configuration 主服務的的配置### Section 3: Virtual Hosts 虛擬主機配置
配置格式:
directive + value 指令 + 值
directive: 不區分字符大小寫value: 為路徑時,是否區分大小寫,取決于文件系統
下面先介紹一個小實驗,再介紹HTTPD的基本配置:
??
在客戶端機器連接服務器時,顯示出Apache版本信息,不安全。? ? ? ?編輯HTTPD主配置文件,加上下面一行就可以了
? ? ? #vim /etc/httpd/conf/httpd.conf
? ? ? ?ServerTokens productonly(可以簡寫prod)
? ? ? ? ??service restart httpd
?
HTTPD基本配置及用法:
1、切換工作模式:
vim /etc/sysconfig/httpdHTTPD=/usr/sbin/httpd.worker
2、修改監聽的IP和Port
Listen [IP:]PORT(1) 省略IP表示為0.0.0.0;表示監聽本機所有IP;(2) Listen指令可重復出現多次Listen 80Listen 8080(3) 修改監聽socket,重啟服務進程方可生效
4、MPM( Multi-Processing Module)多路處理模塊 :
prefork, worker, event(試驗階段)httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個;rpm安裝的包提供三個二進制程序文件,
分別用于實現對不同MPM機制的支持
確認方法:
ps aux | grep httpd默認為/usr/sbin/httpd, 即prefork模式查看靜態編譯的模塊 :httpd -l查看靜態編譯及動態裝載的模塊 :httpd –M動態模塊加載:不需重啟即生效動態模塊路徑 :/usr/lib64/httpd/modules/
更換使用的httpd程序:vim /etc/sysconfig/httpdHTTPD=/usr/sbin/httpd.worker重啟服務生效httpd.worker -l 查看pstree -p |grep httpd 查看進程和線程測試:yum install httpd-toolsab -c 1000 -n 10000?http://192.168.164.129/
prefork的默認配置:
<IfModule?prefork.c>StartServers 8 開機啟動時,默認開啟8個進程MinSpareServers 5 最小空閑進程MaxSpareServers 20 最大空閑進程ServerLimit 256 最多進程數,最大20000MaxClients 256 最大并發MaxRequestsPerChild 4000 子進程最多能處理的請求 數量。在處理MaxRequestsPerChild 個請求之后,
子進程將 會被父進程終止,這時候子進程占用的內存就會釋放(為0時 永遠不釋放)
</IfModule>?worker的默認配置:<IfModule?worker.c>StartServers 4 開機啟動時,默認開啟4個進程MaxClients 300 最大支持多少客戶端并發訪問MinSpareThreads 25 最小的空閑線程MaxSpareThreads 75 最大的空閑線程ThreadsPerChild 25 每個子進程生成的線程數量MaxRequestsPerChild 0 無限制</IfModule>
5、DSO: Dynamic Shared Object 動態共享對象
加載動態模塊配置:/etc/httpd/conf/httpd.conf配置指令實現模塊加載格式:LoadModule <mod_name> <mod_path>模塊文件路徑可使用相對路徑:相對于ServerRoot(默認/etc/httpd)指向的路徑而言:/etc/httpd/modules/
示例:要使用某個某塊,需按照下面格式,加載到主配置文件里即可:
? ?LoadModule auth_basic_module modules/mod_auth_basic.so
6、定義’Main’ server的文檔頁面路徑 :
DocumentRoot “/path”?網站主頁目錄文檔路徑映射:DocumentRoot指向的路徑為URL路徑的起始位置
下面先介紹一下,什么是URL:
URL組成<scheme>://<user>:<password>@<host>:<port>/<path>;<params> ?<query>#<frag>schame:方案,訪問服務器以獲取資源時要使用哪種協議user:用戶,某些方案訪問資源時需要的用戶名password:密碼,用戶對應的密碼,中間用:分隔Host:主機,資源宿主服務器的主機名或IP地址port:端口,資源宿主服務器正在監聽的端口號,很多方案有默認端口號path:路徑,服務器資源的本地名,由一個/將其與前面的URL組件分隔params:參數,某些方案用這個組件來指定輸入的參數,參數為名/值對,URL中可多含多個參數,用;分隔 .query:查詢,某些方案會用這個組件傳遞參數以激活程序,如數據庫,用?分隔,多個查詢用&分隔frag:片段,一小片或一部分資源的名字,此組件在客戶端使用,用#分隔
好了,通過以上已經了解了什么事URL了,下面介紹怎么設置主頁等相關操作:
實驗:更改HTTPD主頁;實驗環境在centos6.9主機上搭建的HTTPD服務,
? ? ? ? ? (主機IP:192.168.164.129)
? ? ? ? 首先自定義一個主頁目錄以及文件:
#vim /etc/httpd/conf/httpd.confDocumentRoot “/app/website1”#service httpd reload訪問測試:
? ? ? ? ?如果以上自定義的主頁文件不存在時,會出現以下情景:
默認情況下,會在/var/www/html目錄下找index.html這個主頁文件,如果找不到,則顯示下圖主頁。DirectoryIndex index.html index.html.varInclude conf.d/*.conf下圖主頁文件:/etc/httpd/conf.d/welcome.conf
? 如果welcome.conf這個文件也找不到,會出現下圖的情景:
?cd /etc/httpd/conf.d
? ? ? ? ?mv welcome.conf welcome.conf.bak
如果把主配置文件里的主頁目錄再改回去,cd /var/www/html/mv index.html b.html
下圖把主頁目錄下的文件都列出來了,不安全vim /etc/httpd/conf/httpd.confOption -Indexes FollowSymLinksservice httpd reload?
下圖中,再次訪問網站時,主目錄下的文件就顯示不了,變得安全點。
注意:SELinux和iptables的狀態
7、站點訪問控制常見機制
可基于兩種類型的路徑指明對哪些資源進行何種訪問控制訪問控制機制有兩種:客戶端來源地址,用戶賬號文件系統路徑:<Directory “/path “>…</Directory><File “/path/file”>…</File><FileMatch “PATTERN”>…</FileMatch>URL路徑:<Location ” ” >…</Location><LocationMatch ” “>….</LocationMatch>
示例:
<FilesMatch “.(gif|jpe?g|png)$”><Files “?at.*”> 通配符<Location /status><LocationMatch “/(extra|special)/data”>訪問控制機制:基于來源地址基于賬號Directory中“基于來源地址”實現訪問控制
(1)Options: 后跟1個或多個以空白字符分隔的選項列表 在選項前的+,- 表示增加或刪除指定選項所有可用特性:Indexes Includes FollowSymLinksSymLinksifOwnerMatch ExecCGI MultiViews常見選項:Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶 。沒寫時默認是不開啟的。
FollowSymLinks:允許訪問主頁目錄下的符號鏈接文件所指向的源文件 ;沒寫時默認是開啟的。None:全部禁用All: 全部允許
(2) AllowOverride
與訪問控制相關的哪些指令可以放在指定目錄下的?.htaccess(由AccessFileName指定)文件中,覆蓋之前的配置指令只對<directory>語句有效AllowOverride All: 所有指令都有效AllowOverride None: .htaccess 文件里定義的策略無效AllowOverride AuthConfig Indexes 除了AuthConfig 和Indexes的其它指令都無法覆蓋? 示例:實現AllowOverride ,基于指定目錄.htaccess,以及FollowSymlinks的用法
? ? ? ? ?# vim /etc/httpd/conf/httpd.conf
touch /app/website1/.htaccess? 訪問測試,訪問軟鏈接,直接指向源文件的內容。
?
(3)基于來源地址的訪問控制機制
Order:定義生效次序;寫在最后面的表示默認法則Order allow,deny ? ?:默認拒絕Order deny,allow ? ?:默認允許Allow from?
?Deny from
來源地址:IPNetAddr: 172.16172.16.0.0172.16.0.0/16
具體用法:下圖中定義了order allow,deny先允許,后拒絕;根據法則后定義的生效
? ? #curl ?http://192.168.164.29 ??是被拒絕訪問的
? ? ?
8、定義默認主頁面
DirectoryIndex index.html inex.html.var
9、日志設定
日志類型:訪問日志 錯誤日志錯誤日志:
ErrorLog logs/error_logLogLevel warn?定義日志級別,默認值warn
loglevel 可選值: debug, info, notice, warn,error crit, alert, emerg訪問日志: /var/log/httpd/access_log定義日志格式:LogFormat format stringsLogFormat “%h %l %u %t ”%r” %>s %b ”%{Referer}i” ”%{User-Agent}i”” combined使用日志格式: CustomLog logs/access_log combined參考幫助: http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h 客戶端IP地址%l 遠程用戶,啟用mod_ident才有效,通常為減號“-”%u 驗證(basic,digest)遠程用戶,非登錄訪問時,為 一個減號“-”%t 服務器收到請求時的時間%r First line of request,即表示請求報文的首行;記錄了 此次請求的“方法”,“URL”以及協議版本%>s 響應狀態碼%b 響應報文的大小,單位是字節;不包括響應報文http首部%{Referer}i 請求報文中首部“referer”的值;即從哪個頁 面中的超鏈接跳轉至當前頁面的%{User-Agent}i 請求報文中首部“User-Agent”的值;即 發出請求的應用程序
10、定義路徑別名
格式: Alias /URL/ ?“/PATH/”DocumentRoot “/www/htdocs”http://haohuigou.com/download/bash.rpm==>/www/htdocs/download/bash.rpm
Alias /download/ ? ?“/rpms/pub/”
http://haohuigou.com/download/bash.rpm==>/rpms/pub/bash.rpmhttp://haohuigou.com/images/logo.png
==>/www/htdocs/images/logo.png注意:以上紅色字體標識,是一一對應的,注意/路徑和別名的區分。
11、設定默認字符集AddDefaultCharset UTF-8中文字符集:GBK, GB2312, GB18030?12、基于用戶的訪問控制
認證質詢:WWW-Authenticate:響應碼為401,拒絕客戶端請求,并說明要求客戶端提供賬號和密碼認證:Authorization:客戶端用戶填入賬號和密碼后再次發送請求報文;認證通過時,則服務器發送響應的資源認證法式兩種:basic:明文–不安全,可以基于https訪問digest:消息摘要認證,兼容性差安全域:需要用戶認證后方能訪問的路徑;應該通過名稱對其進行標識,以便告知用戶認證的原因用戶的賬號和密碼虛擬賬號:僅用于訪問某服務時用到的認證標識存儲:文本文件,SQL數據庫,ldap目錄存儲,nis等
?
basic認證配置示例:
(1) 定義安全域<Directory “/path”>Options NoneAllowOverride None 是否允許驗證.htaccess文件AuthType Basic 認證類型AuthName “String” 管理目錄提示語句AuthUserFile “/PATH/HTTPD_USER_PASSWD_FILE”驗證配置文件Require user username1 username2 …指定用戶</Directory>允許賬號文件中的所有用戶登錄訪問: Require valid-user
(2) 提供賬號和密碼存儲(文本文件)
使用專用命令完成此類文件的創建及用戶管理htpasswd命令來源于httpd-tools包htpasswd?[options] /PATH/HTTPD_PASSWD_FILE username
-c:自動創建文件,僅應該在文件不存在時使用-m:md5格式加密-s:sha格式加密-D:刪除指定用戶
實驗:基于用戶賬號密碼認證的訪問控制;
實驗環境在centos6.9上搭建httpd服務,(192.168.8.128)
也可以定義在.htaccess文件里:
vim /etc/httpd/conf/httpd.conf
實驗:基于用戶組的安全認證,在上個實驗基礎上實現
示例:?
Require valid-user
14、虛擬主機
站點標識: socketIP相同,但端口不同IP不同,但端口均為默認端口FQDN不同;請求報文中首部Host: haohuigou.com有三種實現方案:
基于ip:為每個虛擬主機準備至少一個ip地址 ;基于port:為每個虛擬主機使用至少一個獨立的port;基于FQDN:為每個虛擬主機使用至少一個FQDN
注意:一般虛擬機不要與main主機混用;因此,要使用虛擬主機, 一般先禁用main主機禁用方法:注釋中心主機的DocumentRoot指令即可虛擬主機的配置方法:
<VirtualHost IP:PORT>ServerName FQDNDocumentRoot “/path”</VirtualHost>建議:上述配置存放在獨立的配置文件中
其它可用指令:
ServerAlias:虛擬主機的別名;可多次使用ErrorLog: 錯誤日志CustomLog:訪問日志<Directory “/path”> </Directory>Alias
15、status頁面幫助我們實現http服務器的一些功能狀態的查看,以頁面的方式查看他的工作情況:進程編號,負載狀態。vim /etc/httpd/conf/httpd.conf
LoadModule status_module modules/mod_status.so要想實現status功能,模塊必須加載。
可以在虛擬機設置里面定義,也可以單獨定義在conf.d目錄下。
<Location /server-status>SetHandler server-statusOrder allow,denyAllow from 172.16</Location>ExtendedStatus On 顯示擴展信息