思惟導圖javascript
ASF(Apache Software Foundation)css
1)服務器的類型html
2)httpd的特性java
高度模塊化(Core+modules)node
DSO機制(Dynamic Shared Object ,動態共享對象)nginx
MPM(Multipath Procession Modules,多路處理模塊)web
3)httpd的併發響應模型數據庫
# 工做模型 一個主進程: 負責生成子進程及回收子進程 負責建立套接字、接受請求,並將其派發給某子進程進行處理 n個子進程: 每一個子進程處理一個請求 # 注意: 會預先生成幾個空閒進程,隨時等待用於響應用戶請求 最大空閒和最小空閒
# 工做模型 一個主進程: 負責生成子進程、建立套接字、接受請求,並將其派發給某子進程進行處理 多個子進程: 每一個子進程負責生成多個線程 每一個線程: 負責響應用戶請求 # 併發響應數量: 子進程數 * 每一個子進程能建立的最大線程數
# 工做模型: 一個主進程: 負責生成子進程、建立套接字、接受請求,並將其派發給某子進程進行處理 子進程: 基於事件驅動機制直接響應多個請求 # httpd-2.4中的event機制能夠在生產環境中使用
1)總體結構apache
全局環境配置(Global Environment):對進程本身的工做特色,對全部虛擬主機都通用的設定vim
主服務器配置段(「Main」 server configuration):在2.2上若是要使用主服務器,則要將虛擬主機關掉
虛擬主機(Virtual Hosts)
2)配置格式:directive value
# 格式: Listen [IP:]Port [protocol] # 若省略IP則表示0.0.0.0 # Listen指令能夠重複出現屢次 Listen 80 Listen 8080 # 注意: 修改監聽的套接字,重啓服務進程才能生效 限制其必須經過ssl通訊時,protocol須要定義爲https
# 做用: 指定以哪一個用戶的身份運行httpd服務器進程 # 格式: User apache Group apache # 對主控進程是root用戶的說明: 主控進程是root,由於80端口是特權端口(小於1024的端口),只有管理員才能使用 因此主控進程是root,而其餘的進程使用普通用戶權限 SUexec在某些指令執行時能夠切換到另一個用戶(默認沒有裝載)
# 設置默認字符集 # 格式 AddDefaultCharset UTF-8 # 中文字符集: GBK、GB23十二、GB18030
# 格式: DirectoryIndex index.html index.html.var
# 持久鏈接 Persistent Connection 保持鏈接,長鏈接 tcp鏈接創建後,每一個資源獲取完成後不斷開鏈接,而是繼續等待其餘資源請求的進行 # 斷開條件 1. 數量限制 2. 時間限制 # 反作用 對併發訪問量較大的服務器,長鏈接機制會使得後續某些請求沒法獲得正常響應 # 折中方案 1. 使用較短的持久鏈接時長 2. 限制較少的請求數量 # 配置 KeepAlive On | Off # 是否啓用長鏈接 KeepAliveTimeout 15 # 超時時長,單位爲秒 MaxKeepAliveRequests 100 #保持鏈接上面所能獲取的最大請求數量(每一個鏈接上面的最大請求數量) # 注意 httpd2.4的KeepAliveTimeout能夠是毫秒級,若是要設置毫秒級,能夠直接在數值後面加上ms表示毫秒
telnet 10.0.0.110 80
GET / HTTP/1.1 Host: 10.0.0.110
1)說明
在2.2中(CentOS6的rpm包)專門提供了三個應用程序文件;由於httpd2.2不支持經過編譯多個MPM模塊,因此只能編譯選定要使用的那個;
這三個應用程序文件分別用於實現對不一樣的MPM機制的支持,默認是使用prefork機制
2)查看httpd程序的模塊列表
# 查看httpd程序的模塊列表 # 查看靜態編譯的模塊 httpd -l # 查看靜態編譯及動態編譯的模塊,查看全部模塊 httpd -M
3)切換MPM機制
### 2.2中 # 1.更換使用的httpd程序,以支持其餘MPM機制 vim /etc/sysconfig/httpd HTTPD=/usr/sbin/httpd.{worker,event} # 2.而後啓用的時候要使用/usr/sbin/httpd.worker /usr/sbin/httpd.worker -k start ### 2.4中 # 直接在這個文件中將對應的模塊取消註釋就ok vim /etc/httpd/conf.modules.d/00-mpm.conf # 查看當前的工做模式 httpd -V # 注意:重啓服務方可生效
4)MPM的配置
# prefork的配置: <IfModule prefork.c> StartServers 8 # httpd服務進程啓用之後自動建立出空閒的子進程數量 MinSpareServers 5 # 最少空閒進程數,不管如何都須要有5個空閒進程來對待新請求 MaxSpareServers 20 # 最大空閒進程數,要大於StartServers的數量 ServerLimit 256 # 同時在生命週期內處於活躍狀態的服務器進程數(跟MaxClients應該是相同的) MaxClients 256 # 最大容許啓動的服務器子進程的數量 MaxRequestsPerChild 4000 # 一個子進程最多能處理的請求,若超過這個值,就將這個進程kill掉而建立新的進程 # 設置爲0則表示永不過時 </IfModule> # worker的配置: <IfModule worker.c> StartServers 4 # httpd服務進程啓動之後自動建立出空閒的子進程數量 MinSpareThreads 25 # 最少空閒的線程數 MaxSpareThreads 75 # 最大空閒的線程數 MaxClients 300 # 最大的容許在線的線程數 ThreadsPerChild 25 # 每一個子進程生成多少個線程 MaxRequestsPerChild 0 # 單個進程最大容許響應多少個請求 <IfModule>
# DSO動態共享對象 # 模塊位置 /etc/httpd/conf.modules.d/ 在這個目錄下的模塊對應的配置文件中修改 # 加載模塊 LoadModule <mod_name> <mod_path> 模塊文件路徑可以使用相對路徑,相對於ServerRoot,默認是 /etc/httpd
# 定義Main Server ServerName FQDN # 語法格式 ServerName [scheme://]fully-qualified-domain-name[:port] # 此處的名字是用來表示當前主機認爲主機主要是服務於誰的 # 若是這條指令沒有定義,那麼httpd啓動時會試圖反解本地的IP地址(把IP解析爲主機名),若是解析不成功,則會警告 DocumentRoot "/var/www/html" # 做用:指明網站的站點的url映射到本地的哪一個文件系統路徑下 # 文檔路徑映射: # DocumentRoot指向的路徑爲URL路徑的起始位置,其至關於站點URL的根路徑 # URL PATH與FileSystem PATH不是等同的,而是存在一種映射關係
# 格式: Alias /URL/ "/PATH/TO/SOMEDIR" # 把URL跟另外的其餘的目錄創建映射關係 # 注意:在httpd2.4中要對那個目錄進行顯示受權(在Directory中定義那個目錄的權限)
DocumentRoot "/www/htdocs"
http://www.hgzero.com/download/xxx.txt /www/htdocs/download/xxx.txt Alias /download/ "/doc/pub/" http://www.hgzero.com/download/xxx.txt /doc/pub/xxx.txt
# 文件系統路徑: <Directory ""> # 對目錄下的全部資源進行控制 ... </Directory> <File ""> # 針對某個文件進行控制 ... </File> <FileMatch "PATTERN"> # 針對符合正則匹配的全部文件進行控制 ... </FileMatch> # URL路徑: <Location ""> # 針對URL路徑進行控制 ... </Location> <LocationMatch ""> ... </LocationMatch>
在2.4上面要裝載的模塊:LoadModule status_module modules/mod_status.so
# 在httpd2.2中: <Location /server-status> SetHandler server-status Order allow,deny Allow from 172.16 </Location> # 在httpd2.4中: <Location /server-status> SetHandler server-status <RequireAll> Require ip 172.16 </RequireAll> </Location>
1)做用
2)適用場景
3)設置示例
SetOutputFilter DEFLATE # 設置一個叫DEFLATE的過濾器 # mod_deflate configuration # Restrict compression to these MIME types # 指定對哪些內容作壓縮 AddOutputFilterByType DEFLATE text/plain 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. # 匹配特定的瀏覽器,再對其作特定的壓縮,由於可能有些瀏覽器的特性不同,如IE BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
1)站點標識(IP、PORT、FQDN)
2)虛擬主機種類
1)匹配規則
注意:
2)虛擬主機配置格式
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot "" ... ServerAlias:虛擬主機的別名,可屢次使用 </VirtualHost>
1)基於IP的虛擬主機(基於端口)
# 基於IP的虛擬主機(基於端口的虛擬主機無非就是IP地址相同,而端口不一樣而已): <VirtualHost 10.0.0.201:81> ServerName www.hgzero.com DocumentRoot "/data/html/www" <Directory "/data/html/www"> Options None AllowOverride None Require all granted </Directory> CustomLog "/data/html/www/log/access_log" combined </VirtualHost> <VirtualHost *:82> # 這裏的*表示監聽本地全部地址 ServerName bbs.hgzero.com DocumentRoot "/data/html/bbs" <Directory "/data/html/bbs"> Options None AllowOverride None Require all granted </Directory> CustomLog "/data/html/bbs/log/access_log" combined </VirtualHost>
2)基於FQDN的虛擬主機
# 基於主機名(FQDN) <VirtualHost *:80> ServerName web.hgzero.com DocumentRoot "/data/html/www" <Directory "/data/html/www"> Options None AllowOverride None Require all granted </Directory> CustomLog "/data/html/www/log/access_log" combined </VirtualHost> <VirtualHost *:80> ServerName bbs.hgzero.com DocumentRoot "/data/html/bbs" <Directory "/data/html/bbs"> Options None AllowOverride None Require all granted </Directory> CustomLog "/data/html/bbs/log/access_log" combined </VirtualHost> # 注意:若是是在http2.2上,則使用基於FQDN的虛擬主機時,要事先使用以下指令 NameVirtualHost 172.16.100.6:80 # 意爲在這個IP和端口上,開放基於主機名的虛擬主機
3)注意
基於名稱的虛擬主機必須指定ServerName指令,不然它將會繼承操做系統的FQDN
對於基於名稱的虛擬主機,若是使用IP地址請求沒法匹配到任何虛擬主機時,將採用第一個虛擬主機做爲默認虛擬主機
1)httpd2.2和httpd2.4中的訪問控制
### httpd-2.2 ### AllowOverride # 表示是否容許覆蓋這裏的配置;與訪問控制相關的指令能夠放在.htaccess文件中 All None order # 定義生效次序,寫在後面的表示默認法則 allow deny Allow from # 容許哪些地址的訪問 Deny from #拒絕哪些地址的訪問
### httpd-2.4 ### # 基於IP控制 Require ip IP_ADDR Require not ip IP_ADDR # 基於主機名控制 Require host 主機名或域名 Require not host 主機名或域名 ### 注意: # 以上的這些控制信息須要定義在<RequireAll>...</RequireAll>中或<RequireAny>配置塊中 # 2.4中的源地址的訪問控制須要顯示指定
2)Options選項
Indexes # 指明的URL路徑下不存在與定義的主頁面資源相等的資源文件時,返回索引列表給用戶 FollowSymLinks # 容許跟蹤符號連接文件所指向的源文件(在配置別名時頗有用) None All
3)httpd2.4中的配置示例
### 配置示例 <Directory "/var/www/html/bbs"> Options None AllowOverride None <RequireAll> # 這裏定義了基於IP的訪問控制(這裏也能夠緩存域名或主機名) Require ip 192.168.0.0/16 Require not ip 192.168.1.102 </RequireAll> </Directory> ### 來源地址的格式:若是是基於主機名的話,要寫成Requrie host node1.com IP NetAddr: 172.16 172.16.0.0/16 172.16.0.0/255.255.0.0
# 控制頁面資源容許全部來源的主機可訪問: # http-2.2 <Directory ""> ... Order allow,deny Allow from all </Directory> # http-2.4 <Directory ""> ... Require all granted </Directory> # 控制頁面資源拒絕全部來源的主機可訪問: # http-2.2 <Directory ""> ... Order allow,deny Deny from all </Directory> # http-2.4 <Directory ""> ... Require all denied </Directory>
1)認證概述
# 認證質詢 WWW-Authenticate,響應碼爲401,拒絕客戶端請求,並說明要求客戶端提供帳號和密碼 客戶端用戶填入帳號和密碼後再次發送請求報文,若認證經過,則服務器發送響應的資源 # 認證方式 basic:明文 digest:消息摘要認證 表單認證 # 安全域 須要用戶認證後方能訪問的路徑 應該經過名稱對其特性標識,以便告知用戶認證的緣由 # 用戶的帳號和密碼存放的位置 虛擬帳號:僅用於訪問某服務時用到的認證標識 存儲: 文本文件 SQL數據庫 ldap目錄存儲
2)basic認證配置示例
# 定義安全域: <Directory ""> Options None AllowOverride None # 是否容許覆蓋這裏的配置,通常都是設置爲None AuthType Basic # 也能夠指明digest認證方式 AuthName "String" # 指明提示信息 AuthUserFile "/etc/httpd/conf.d/.htpasswd" # 密碼文件,最好將其設置爲隱藏文件 Require user username1 username2 ... # 容許登陸的用戶 Require valid-user # 容許帳號文件中的全部用戶登陸訪問 </Directory>
# 定義安全域: <Directory ""> Options None AllowOverride None AuthType Basic AuthName "String" AuthUserFile "PATH/TO/HTTPD_USER_PASSWD_FILE" AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" # 這裏引用的是組帳號的文件 Require group groupname1 grpname2 ... # 容許登陸的組 </Directory> # 建立用戶帳號和組帳號文件: # 組帳號定義格式: 組文件:每一行定義一個組(建立組帳號文件) GRP_NAME:username1 username2 ...
1)SSL會話過程
2)SSL會話緩存