從服務器角度一次web資源請求具體過程javascript
創建鏈接:tcp三次握手php
接收請求css
處理請求html
訪問資源java
構建響應報文linux
發送響應nginx
記錄日誌web
===================================================================算法
httpd工做模型sql
阻塞模型,單進程模型。缺點:每次只能響應一個請求,對於現代的高併發無知足
只有一個進程,每次只能響應一個用戶的請求 。
多進程模型,缺點:不停的建立和收回進程,進程間切換也耗費時間。
httpd監聽在套接字上,每當一個客戶端請求,它會生成一個子進程來響應,子進程用鏈接套接字來標記與客戶端的鏈接,處理客戶端的請求。由主進程的監聽套接字與客戶端通訊。
多進程進程池模型, 缺點:進程間切換須要保存現場等,在內核空間耗費大量時間。
httpd啓動時會事先啓動一批進程,當多個客戶端發起請求時,找一個空間進程響應。當響應完成,該進程並不會回收,而是標記爲空閒進程,以等待下次響應請求。有了進程池能夠控制併發請求量,它能夠控制最多能夠啓動多少個進程。
複用的I/O機制:
用單個線程來響應用戶講求,線程比進程更小的單位,更輕量級,屬於進程內部的執行流,能夠共享進程內容的資源。線程仍是須要不停的切換,不用保護現場。 (linux進程很輕量級,線程和進程區分不是很明顯,不少狀況下這種機制並不必定會比多進程切換性能好。)
複用的I/O機制:在進程內部使用某種算法,讓一個線程能夠同響應多個請求,使用事件驅動機制(event),來得出響應完成於否。這樣就能夠在多核心的cpu上綁定每一個線程運行在一個cpu上,從而減小進程切換。全部請求都由這一個線程來響應。(nginx使用這種模型)
=============================================================
httpd的特性
高度模塊化:核心程序與模塊組成
DSO:Dynamic Shared Object.模塊能夠動態裝卸載
MPM:Multipath Processing Module。多道處理模塊,由多個模塊組成,
prefork:每一個進程響應一個用戶請求,提供一個進程池,預先生成多個空閒進程。select():這種機制最穩定,但響應併發數最少,最多隻能響應1024個。
worker:啓動多個進程,每一個進程生成多個線程,線程響應用戶請求
event:2.2中爲實驗性的版本,2.4爲正式可用。啓動多個線程,每一個線程響應多個請求。減小了上下文切換。基於event-driven事件驅動機制,使一個進程響應多個用戶請求。
豐富用戶認證
基於認證:使用明文認證
摘要認證:使用用戶名和密碼的特徵碼認證,應用很少,不少瀏覽器不支持
支持CGI:原生支持perl CGI
支持虛擬主機:支持ip,端口,主機名的虛擬主機
反向代理:文件代理,二進制代理,負載均衡
用戶站點
路徑別名
支持第三方模塊
====================================================================
rpm安裝httpd後,常常須要打交道的文件。
/etc/httpd/conf/httpd.conf 主配置文件
/etc/httpd/conf.d/*.conf 輔助配置文件
/etc/rc.d/init.d/httpd 服務腳本
/etc/sysconfig/httpd 服務腳本的配置文件
/etc/rc.d/init.d/htcacheclean httpd作爲緩存服務器時,用來清理緩存的腳本
/etc/lib64/httpd/modules httpd模塊的目錄,(/etc/httpd/modules是它的連接)
/usr/sbin/httpd httpd的主程序
/usr/sbin/apachectl 用來控制httpd服務啓動關閉,和查看httpd運行狀態的程序
/usr/sbin/httpd.worker 啓動worker的工做模式,默認啓動 prefork模式。切換模式可修改啓動腳本實現。
/usr/sbin/httpd.event 啓動基於event的工做模式 (2.2處於試驗階段,不推薦使用)
/var/log/httpd/ 日誌文件目錄,分兩個一個是訪問日誌,一個是錯誤日誌
access_log:訪問日誌,記錄用戶訪問日誌
error_log:錯誤日誌,刻錄程序運行時的狀態,日誌有記錄級別。
/var/www/html 站點文檔根目錄。能夠在配置文件中修改。
/var/www/html/cgi-bin cgi執行程序根目錄。cgi方式通常不多使用,安全性比較差。
====================================================================
經常使用命令組合
#httpd -l 查看當前http進程加載的主要模塊
#httpd -D DUMP_MODULES #查看http進程都加都了那此模塊
#httpd -M #查看http進程都加都了那此模塊
htpasswd 用戶建立認證用戶的
-c 建立用戶時順便把保存用戶名和密碼的文件也建立好,只在第一次建立用戶沒有保存用戶的文件時使用
-m 密碼使用md5加密密碼
-s 使用sha加密密碼
-p 不加密密碼
-D 刪除用戶
示例: # htpasswd -m /etc/httpd/conf/.htpasswd wukui
==========================================
定義httpd的工做特性的主配置文件,有三段組成,第一段全局配置段,定義httpd進程的工做特性,和各虛擬主機共同的工做特性,第二段,網站主服務器的配置,第三段爲虛擬主機的配置,第二段和第三段通常不會同時使用,默認啓動主服務器配置段。配置文件不區分大小寫,但linux文件系統區分大小寫。
-----全局配置-----------------------------------------------------------
ServerTokens OS 若是沒有訪問到頁面,服務器會給客戶端發本機是操做系統信息,httpd程序版本信息。不安全,應當註釋掉。
ServerRoot "/etc/httpd" 程序的運行目錄,定義了此路徑後,下面使用的其它相對路徑都是相對它的
PidFile "run/httpd.pid" PID保存的文件,相對於上面定義的路徑
Timeout 60 等待tcp三次握手超時時間,超事後就直接斷開。
KeepAlive {On|off} 是否支持持久鏈接,服務器繁忙時啓動反而下降性能了。
MaxKeepAliveRequests 100 在使用持久鏈接時,請求資源最多請個數。
KeepAliveTimeout 15 在使用持久鏈接時,最大請求時間,以秒爲單位。與請求資源個數誰先知足誰先生效
EnableSendfile off
<IfModule prefork.c> prefork模型工做的特性
StartServers 8 在程序啓動時就啓動8個響應用戶的進程
MinSpareServers 5 最少空閒進程,不管任什麼時候候都要有這麼多空閒進程。
MaxSpareServers 20 最多空閒進程不該該小於StartServer
ServerLimit 256 爲MaxClinets最多啓動進程個數,不該當大於MaxClient
MaxClients 256 最多同時容許多少個客戶端鏈接,
MaxRequestsPerChild 4000 每一個子進程在生命週期內,最多容許處理多少個請求,完成最大數後子進程會被銷燬,再建立新進程
</IfModule> 封裝
<IfModule worker.c> worker工做模式的特性
StartServers 4 服務啓動時就啓動4個進程
MaxClients 300 最大用戶併發請求
MinSpareThreads 25 最少空閒線程數
MaxSpareThreads 75 最多空閒線程數
ThreadsPerChild 25 每一個子進程最多能夠啓動多少個線程
MaxRequestsPerChild 0 每一個線程最多能夠處理多少個請求,0表示不作限定
</IfModule>
Listen 80 默認監聽的端口,若是這裏不寫ip表示監聽全部ip。Listen能夠出現屢次。好比下面
Listen 8080 若是修改端口必須重啓服務才能生效,從新加載配置沒法生效。
LoadModule auth_basic_module modules/mod_auth_basic.so 指定要加載的模塊。格式 LoadModule 模塊名稱 模塊文件名。這裏使用相對路徑,相對ServerRoot指定的路徑。
Include conf.d/*.conf 指定主配置文件還有其它文件
User apache 進程以那個用戶身份運行
Group apache 進程以那個組身份運行
-----主服務器配置-----------------------------------------
特別說明:
<Directory /> 儘可能使用<Directory> 而非<Location>
</Directory> 上面與這個directory是成對出現的,每對爲一個容器,每一個容器是對某個對像作訪問控制的。這個容器就是對/作訪問控制的。Directory是對文件系統訪問路徑作訪問控制。可使用通配符,如<Directory ~ "/">
<Location /server-status> Location是對請求的URL作訪問控制的。把控制的選項寫到與標籤中,就對/server-status生效了。
</Location>
<File /var/www/html/index.html> 用來控制單個文件的
</File>
ServerAdmin wukui@wukui.net.cn 指定管理員郵箱,在網頁請求出錯時,頁面會顯示
#ServerName www.wukui.net.cn 指定當前系統的主機名,默認沒有啓動。它會獲取當前主機名,它會反解ip後與當前主機名對比。這時啓動服務時會報個錯誤,主要用來指定系統主機名稱的。
UseCanonicaName Off
DocumentRoot "/var/www/html" 指定站點根目錄,若是使用虛擬主機。這一項須要註釋掉
DirectoryIndex index.html index.php 定義頁面訪問的默認文件,優先級自左而右
站點路徑訪問控制
基於本地文件系統路徑作訪問控制
<Directory /> 定義一個封裝容器,這個容器用來對根作訪問控制。
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory />
<Directory "/var/www/html">
Options Indexes FollowSymlinks Options用來定義選項的.
Indexes 用來定義若是沒有默認頁面,會把當前目錄下全部文件都例出來。
FollowSymlinks 跟蹤符號連接文件,若是站點目錄下有連接文件,會找到原文件發送給客戶端。
ExecCGI 是否容許執行CGI腳本
AllowOverride None 是否執行.htaccess文件中的指令,None表示不啓用任何指令 All表示執行
默認httpd2.2版本,在站點的每一個目錄下能夠建立.htaccess文件,在這個文件中能夠定義每一個目錄的訪問權限,能夠定義每一個目錄和文件的訪問權限。通常不使用,由於比較影響httpd的性能。
Order allow,deny 作訪問控制,allow爲白名單,deny爲黑名單,這裏表示若是白名單沒有匹配到,黑名單生效。
Allow from all 白名單爲任何爲
使用格式:Allow from 172.16.0.0/16 白名單爲172.16.0.0網絡全部主機
使用格式:Deny form 192.168.0.1表示拒絕192.168.0.1,黑名單優先級高於白名單。
</Directory>
基於URL訪路徑作訪問控制
ErrorLog logs/error_log 定義錯誤日誌文件名
LogLevel warn 定義記錄日誌的級別。級別有:debug, info, notice, warn, error, crit, alert, emerg
自定義日誌記錄的內容和格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 定義的日誌格式和名稱
%h 客戶端主機ip地址
%l 遠程登錄名 一般爲-
%u 遠程認證登錄時的用戶名,一般爲-
%t 服務器收到用戶請求時的時間
\" 表示使用隱號,"有特殊意義\表示轉義
%r 請求報文的起始行,有<method><request-URL><version>三部分組成
%>s 響應狀態碼,如404,503等
%b 響應報文的長度
%{Referer}i 記錄請求由那個url連接過來的,若是爲空表示直接打開的。
%{User-Agent}i 記錄用戶使用的瀏覽器類型
%{HEADER_NAME}i 記錄指定首部對應的值
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
customLog logs/access_log combined 自定義訪問日誌文件位置。和使用的日誌格式。格式由上面的LogFormat定義
KeepAlive {Off|On} 定義是否支持持久鏈接
KeepAliveTimeout 15 若是開啓了持久鏈接,客戶端若是沒有數據傳輸最少多少時間內不斷開
Alias /URL/ "/path/to/somewhere/" 路徑別名,若是請求的url中的 包含了alias定義的/URL/,則會映射到/path/to/somewhere/。它不會侷限於DocumentRoot定義的站點根目錄。別名的優先級高於站點根目錄。
AddDefaultCharset UTF-8 設置字符集。經常使用的中文字符集有GB2312 GB18030 GBK等
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 定義CGI腳本腳本的URL別名,當請求的URL帶有/cgi-bin/時,httpd程序會自動定位到/var/www/cgi-bin/目錄下
<Directory "/var/www/www1"> 定義一個容器,對/var/www/www1目錄作特性
Options none 沒有任何指定開放的功能
AllowOverride AuthConfig 表示作要作認證相關的配置
AuthType Basic 認證類型爲Basic
AuthName "Admin Area." 認證名稱,再提示用戶輸入用戶名和密碼的時候提示的信息
AuthUserFile /etc/httpd/conf/.htpasswd 存儲用戶名和密碼的地方,此文件能夠用htpasswd命令生成
AuthBasicProvider file 指定用戶認證時使用存儲用戶名和密碼的類型,有文件,和sql數據庫和ldap等,若是不寫默認使用文件。
Require valid-user 容許指定文件中那些用戶登錄,valid-user表示.htpasswd文件中全部用戶能夠登錄。
#Require user wukui 只容許某些用戶登錄的寫法,多個用戶間用空格隔開。
AuthGroupFile /etc/httpd/conf/.htgroup 使用組認證時指明組文件的位置。(組文件內容寫法。group1: user1 user2)
Require group group1 給指定的組受權,組認證時必須把require user這個選項註釋掉。
</Directory>
配置虛擬主機前須要把DocumentRoot註釋掉,由於虛擬主機須要本身定義站點根目錄。虛擬主機能夠基於ip,端口,主機名作。三者能夠同時存在,但要理清三者之間佔用套接字的關係。
NameVirtualHost *:80 設定虛擬主機使用的ip。*爲使用所有。若是這裏只指定一個ip,那麼這個ip是給基於主機名的虛擬主機使用的。基於ip的虛擬主機能夠本身定義單獨ip,不受這裏控制。
<VirtualHost *:80> 定義虛擬主機的容器,並指定此虛擬主要監聽的ip和端口
ServerName www2.stu2.com 定義虛擬主機的名稱,基於主機名的虛擬主機必須有。
DocumentRoot /var/www/www2 定義虛擬主機的站點根目錄
LogLevel warn 定義虛擬主機的錯誤日誌記錄級別
ErrorLog /var/log/httpd/www2.err 定義虛擬主機的錯誤目錄名稱,每一個虛擬主機都就有本身獨立的日誌文件
CustomLog /var/log/httpd/www2.access combined 虛擬主機的訪問日誌文件
SetHandler server-status 爲此虛擬主機啓用apache的內部處理器server-status
</VirtualHost>
<Location /server-status> 定義url /server-status的訪問控制選項
SetHandler server-status 開啓apache的內核處理器server-status,用來監視httpd程序的運行狀態,能夠在瀏覽器訪問看到
Order allow,deny 定義白名單和黑名單的優先級
Allow from 172.16.0.0/16 白名單的地址。
</Location>
------傳輸數據壓縮配置---------------------------------------
# LoadModule deflate_module modules/mod_deflate.so 前提要確認此模塊是否起用
SetOutputFilter DEFLATE 啓用輸出的過濾器爲DEFLATE
# mod_deflate configuration
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain 對純文本的內容啓動DEFLATE過濾器啓動壓縮功能
AddOutputFilterByType DEFLATE text/html 對超文本類型啓動壓縮功能
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9 設定壓縮比
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html 對於Mozilla4這樣的瀏覽器只啓用gzip算法的壓縮
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip 對於Mozilla4.06, 4.07, 4.08啓用no-gzip的算法壓縮
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html 對於ie6不使用no-gzip和gzip-only-text/html壓縮。ie6不支持。