Apache(httpd)詳解

思惟導圖javascript

1. httpd服務

1.1 httpd概述

ASF(Apache Software Foundation)css

1)服務器的類型html

  • http服務器(httpd,nginx,Lighttpd)
  • 應用程序服務器(IIS:.NET  ,tomcat:.JSP)

2)httpd的特性java

高度模塊化(Core+modules)node

DSO機制(Dynamic Shared Object ,動態共享對象)nginx

MPM(Multipath Procession Modules,多路處理模塊)web

  • 能夠經過修改MPM來修改併發響應模型
  • 2.4支持MPM模塊動態切換,2.2不支持

3)httpd的併發響應模型數據庫

  • prefork:兩級進程模型,父進程管理子進程,每一個進程響應一個請求
# 工做模型
一個主進程:
    負責生成子進程及回收子進程
    負責建立套接字、接受請求,並將其派發給某子進程進行處理
n個子進程:
    每一個子進程處理一個請求

# 注意:
會預先生成幾個空閒進程,隨時等待用於響應用戶請求
最大空閒和最小空閒
  • worker:三級進程模型,父進程管理子進程,子進程經過線程響應用戶請求,每一個線程處理一個用戶請求
# 工做模型
一個主進程:
  負責生成子進程、建立套接字、接受請求,並將其派發給某子進程進行處理
多個子進程:
  每一個子進程負責生成多個線程
每一個線程:
  負責響應用戶請求

# 併發響應數量:
子進程數 * 每一個子進程能建立的最大線程數
  • event:兩級模型,父進程管理子進程,子進程經過事件驅動event-driven機制直接響應n個請求
# 工做模型:
一個主進程:
    負責生成子進程、建立套接字、接受請求,並將其派發給某子進程進行處理
子進程:
    基於事件驅動機制直接響應多個請求

# httpd-2.4中的event機制能夠在生產環境中使用

2.2 httpd的程序結構

  • httpd2.2(CentOS6中)
  • httpd2.4(CentOS7及以上)

3. httpd的主配置文件

3.1 配置文件結構和格式

1)總體結構apache

全局環境配置(Global Environment):對進程本身的工做特色,對全部虛擬主機都通用的設定vim

主服務器配置段(「Main」 server configuration):在2.2上若是要使用主服務器,則要將虛擬主機關掉

虛擬主機(Virtual Hosts)

2)配置格式:directive value

  • directive,不區分字符大小寫
  • value,爲路徑時,是否區分字符大小寫,取決於文件系統

3.2 監聽的IP和PORT

# 格式:
Listen [IP:]Port [protocol] # 若省略IP則表示0.0.0.0
    # Listen指令能夠重複出現屢次
        Listen 80
        Listen 8080        

# 注意:
修改監聽的套接字,重啓服務進程才能生效
限制其必須經過ssl通訊時,protocol須要定義爲https

3.3 用戶和用戶組

# 做用:
指定以哪一個用戶的身份運行httpd服務器進程
    
# 格式:
User apache Group apache # 對主控進程是root用戶的說明:
主控進程是root,由於80端口是特權端口(小於1024的端口),只有管理員才能使用
因此主控進程是root,而其餘的進程使用普通用戶權限
        
SUexec在某些指令執行時能夠切換到另一個用戶(默認沒有裝載)

3.4 默認字符集

# 設置默認字符集
# 格式
AddDefaultCharset   UTF-8

# 中文字符集:
GBK、GB23十二、GB18030

3.5 站點主頁面

# 格式:
DirectoryIndex  index.html  index.html.var

3.6 持久鏈接

# 持久鏈接 Persistent Connection  保持鏈接,長鏈接
tcp鏈接創建後,每一個資源獲取完成後不斷開鏈接,而是繼續等待其餘資源請求的進行
        
# 斷開條件
1. 數量限制
2. 時間限制
        
# 反作用
對併發訪問量較大的服務器,長鏈接機制會使得後續某些請求沒法獲得正常響應
        
# 折中方案
1. 使用較短的持久鏈接時長
2. 限制較少的請求數量
    
# 配置
KeepAlive  On | Off        # 是否啓用長鏈接
KeepAliveTimeout  15       # 超時時長,單位爲秒
MaxKeepAliveRequests  100  #保持鏈接上面所能獲取的最大請求數量(每一個鏈接上面的最大請求數量)
        
# 注意
httpd2.4的KeepAliveTimeout能夠是毫秒級,若是要設置毫秒級,能夠直接在數值後面加上ms表示毫秒
  • 能夠用telnet命令來對持久鏈接進行測試
telnet 10.0.0.110 80
GET / HTTP/1.1 Host: 10.0.0.110

3.7 配置MPM

1)說明

在2.2中(CentOS6的rpm包)專門提供了三個應用程序文件;由於httpd2.2不支持經過編譯多個MPM模塊,因此只能編譯選定要使用的那個;

這三個應用程序文件分別用於實現對不一樣的MPM機制的支持,默認是使用prefork機制

  • httpd(prefork)默認就是使用prefork機制
  • httpd.worker
  • httpd.event

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>

3.8 模塊加載

# DSO動態共享對象
    
# 模塊位置
/etc/httpd/conf.modules.d/ 
在這個目錄下的模塊對應的配置文件中修改
    
# 加載模塊
LoadModule   <mod_name>  <mod_path>
模塊文件路徑可以使用相對路徑,相對於ServerRoot,默認是 /etc/httpd

3.9 定義Main Server

# 定義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不是等同的,而是存在一種映射關係

3.10 路徑別名

# 格式:
Alias  /URL/   "/PATH/TO/SOMEDIR" 
# 把URL跟另外的其餘的目錄創建映射關係

# 注意:在httpd2.4中要對那個目錄進行顯示受權(在Directory中定義那個目錄的權限)
  • Alias和DocumentRoot的區別:
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

3.11 站點訪問控制

# 文件系統路徑:
        <Directory  "">        # 對目錄下的全部資源進行控制
          ...
        </Directory>
        
        <File  "">             # 針對某個文件進行控制
          ...
        </File>
        
        <FileMatch  "PATTERN"> # 針對符合正則匹配的全部文件進行控制
          ...
        </FileMatch>

# URL路徑:
        <Location  "">         # 針對URL路徑進行控制
          ...
        </Location>
        
        <LocationMatch  "">
          ...
        </LocationMatch>

3.12 status頁面

在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>

3.13 頁面壓縮deflate

1)做用

  • 使用mod_deflate模塊壓縮頁面優化傳輸速度(壓縮文本文件,圖片文件不須要壓縮)

2)適用場景

  • 節約帶寬,額外消耗CPU;同時,可能有些較老瀏覽器不支持
  • 壓縮適於壓縮的資源,例如文件文件

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

4. 虛擬主機

4.1 虛擬主機概述

1)站點標識(IP、PORT、FQDN)

  • IP相同,端口不一樣
  • IP不一樣,端口均爲默認端口
  • FQDN不一樣:http請求報文首部中 Host:www.hgzero.com

2)虛擬主機種類

  • 基於IP地址:爲每一個虛擬主機準備至少一個ip地址,默認是匹配自上而下的第一個符合條件的
  • 基於端口PORT:爲每一個虛擬主機使用至少一個獨立的port
  • 基於FQDN:爲每一個虛擬主機使用至少一個FQDN
    • 基於FQDN時,要將全部的FQDN都解析到同一個IP地址上
    • 能夠在本地hosts文件中定義或者在DNS服務器上指定
    • 基於FQDN時,是根據http請求報文中的host值來判斷的,這個host值是不會被解析的

4.2 匹配規則&匹配格式

1)匹配規則

  • 通配的越少的虛擬主機,匹配優先級越高
  • 若是基於名稱的虛擬主機沒法匹配上,則採用虛擬主機列表中的第一個虛擬主機做爲響應主機
  • 若是全部的虛擬主機都沒法匹配上,則採用主配置段中的主機,若是主配置段中註釋了DocumentRoot,則返回對應的錯誤

注意:

  • 通常虛擬主機不要與中心主機混用,若是要使用虛擬主機,得先禁用main主機;2.4則能夠不由Main Server
  • 禁用中心主機:註釋DocumentRoot便可

2)虛擬主機配置格式

<VirtualHost  IP:PORT>
        ServerName  FQDN
        DocumentRoot  "" ... ServerAlias:虛擬主機的別名,可屢次使用 </VirtualHost>

4.3 虛擬主機配置示例

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地址請求沒法匹配到任何虛擬主機時,將採用第一個虛擬主機做爲默認虛擬主機

5. 訪問控制

5.1 基於源地址的訪問控制

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

5.2 控制頁面容許or不容許全部主機訪問

# 控制頁面資源容許全部來源的主機可訪問:
        # 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>

5.3 htpasswd

5.4 基於用戶的訪問控制

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 ...

6. https的配置

6.1 https的工做流程

1)SSL會話過程

 2)SSL會話緩存

  • SSL會話的時長
    • 若每次通訊都通過ssl handshake,那將是很是浪費資源的,因此Server端能夠吧ssl會話給緩存下來
    • 在一段時間內同一客戶端訪問時這個ssl handshake過程就沒必要再作了,直接利用此前已經創建的會話資源就能夠了
    • 可是此會話不能保存太長時間,通常是五分鐘以內都是有效的
  • SSL會話是基於IP地址建立的,因此單IP的主機上,僅可使用一個https的虛擬主機

6.2 配置httpd支持https

7. 日誌相關

7.1 日誌的記錄

7.2 日誌輪替

  • cronolog
  • rotatelog

8. 壓測工具

9. httpd自帶的工具程序

  • apachectl
  • apxs
  • suexec

10. LAMP基本架構

相關文章
相關標籤/搜索