第十三章 httpd詳解

13.1 httpd簡介

  httpd是Apache超文本傳輸協議(HTTP)服務器的主程序。被設計爲一個獨立運行的後臺進程,它會建立一個處理請求的子進程或線程的池。


  通常,httpd不應該被直接調用,而應該在類Unix系統中由apachectl調用,在Windows中作爲服務運行。


13.2 httpd版本

  本文主要介紹httpd的兩大版本,httpd-2.2和httpd-2.4。

  CentOS6系列的版本默認提供的是httpd-2.2版本的rpm包,而CentOS7默認提供的是httpd-2.4版本的rpm包


13.2.1 httpd的特性

  httpd有很多特性,下面就分別來說說httpd-2.2版本和httpd-2.4版本各自的特性。

  httpd-2.2的特性:

  a) 事先創建進程

  b) 按需維持適當的進程

  c) 模塊化設計,核心比較小,各種功能通過模塊添加(包括PHP),支持運行時配置,支持單獨編譯模塊

  d) 支持多種方式的虛擬主機配置,如基於ip的虛擬主機,基於端口的虛擬主機,基於域名的虛擬主機等

  e) 支持https協議(通過mod_ssl模塊實現)

  f) 支持用戶認證

  g) 支持基於IP或域名的ACL訪問控制機制

  h) 支持每目錄的訪問控制(用戶訪問默認主頁時不需要提供用戶名和密碼,但是用戶訪問某特定目錄時需要提供用戶名和密碼)

  i) 支持URL重寫

  j) 支持MPM(Multi Path Modules,多處理模塊)。用於定義httpd的工作模型(單進程、單進程多線程、多進程、多進程單線程、多進程多線程)

    prefork:多進程模型,預先生成進程,一個請求用一個進程響應

      一個主進程負責生成n個子進程,子進程也稱爲工作進程;

      每個子進程處理一個用戶請求,即使沒有用戶請求,也會預先生成多個空閒進程,隨時等待請求到達,最大不會超過1024個

    worker:基於線程工作,一個請求用一個線程響應(啓動多個進程,每個進程生成多個線程)

    event:基於事件的驅動,一個進程處理多個請求


  httpd-2.4的新特性:

  a) MPM支持運行DSO機制(Dynamic Share Object,模塊的動態裝/卸載機制),以模塊形式按需加載

  b) 支持event MPM,eventMPM模塊生產環境可用

  c) 支持異步讀寫

  d) 支持每個模塊及每個目錄分別使用各自的日誌級別

  e) 每個請求相關的專業配置,使用<If>來配置

  f) 增強版的表達式分析器

  g) 支持毫秒級的keepalive timeout

  h) 基於FQDN的虛擬主機不再需要NameVirtualHost指令

  i) 支持用戶自定義變量

  j) 支持新的指令(AllowOverrideList)

  k) 降低對內存的消耗


13.2.2 httpd-2.4新增的模塊

  httpd-2.4在之前的版本基礎上新增了幾大模塊,下面就幾個常用的來介紹一下。

  mod_proxy_fcgi:反向代理時支持apache服務器後端協議的模塊

  mod_ratelimit:提供速率限制功能的模塊

  mod_remoteip:基於ip的訪問控制機制被改變,不再支持使用Order,Deny,Allow來做基於IP的訪問控制


13.3 httpd基礎

13.3.1 httpd自帶的工具程序

  htpasswd:basic認證基於文件實現時,用到的帳號密碼生成工具

  apachectl:httpd自帶的服務控制腳本,支持start,stop,restart

  apxs:由httpd-devel包提供的,擴展httpd使用第三方模塊的工具

  rotatelogs:日誌滾動工具

    access.log -->

    access.log,access.1.log

    access.log,access.1.log,access.2.log

  suexec:訪問某些有特殊權限配置的資源時,臨時切換至指定用戶運行的工具

  ab:apache benchmark,httpd的壓力測試工具


13.3.2 rpm包安裝的httpd程序環境

  httpd-2.2版本程序環境:

    配置文件:

      /etc/httpd/conf/httpd.conf

      /etc/httpd/conf.d/*.conf

    配置文件的組成:grep "Section" /etc/httpd/conf/httpd.conf

### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts

      配置格式:directive value

        directive:指令,不區分字符大小寫

        value:爲路徑時,取決於文件系統

    服務腳本:

      /etc/rc.d/init.d/httpd

    服務腳本的配置文件:

      /etc/sysconfig/httpd

    主程序文件:

      /usr/sbin/httpd

      /usr/sbin/httpd.event

      /usr/sbin/httpd.worker

    日誌文件目錄:

      /var/log/httpd/

        access.log:訪問日誌

        error_log:錯誤日誌

    站點文檔目錄:

      /var/www/html/

    模塊文件路徑:

      /usr/lib64/httpd/modules/


  httpd-2.4版本程序環境:

    主配置文件:/etc/httpd/conf/httpd.conf

    模塊配置文件:/etc/httpd/conf.modules.d/*.conf

    輔助配置文件:/etc/httpd/conf.d/*.conf


    mpm:以DSO機制提供,配置文件爲/etc/httpd/conf.modules.d/00-mpm.conf


13.3.3 web相關的命令

  curl命令:

    curl是基於URL語法在命令行方式下工作的文件傳輸工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等協議。

    curl支持:

      https認證

      http的POST/PUT等方法

      ftp上傳

      kerberos認證

      http上傳

      代理服務器

      cookies

      用戶名/密碼認證

      下載文件斷點續傳

      socks5代理服務器

      通過http代理服務器上傳文件到ftp服務器


    語法:curl [options] [URL ...]

    常用的options:

      -A/--user-agent <string>:設置用戶代理髮送給服務器

      -basic:使用Http基本認證

      --tcp-nodelay:使用TCP_NODELAY選項

      -e/--referer <URL>:來源網址

      --cacert <file>:CA證書(SSL)

      --compressed:要求返回時壓縮的格式

      -H/--header <line>:自定義請求首部信息傳遞給服務器

      -I/--head:只顯示響應報文首部信息

      --limit-rate <rate>:設置傳輸速度

      -u/--user <user[:password]>:設置服務器的用戶和密碼

      -0/--http1:使用http 1.0版本,默認使用1.1版本。這個選項是數字0而不是字母o


  elinks命令:

    語法:elinks [options] [URL ...]

    常用的options:

      -dump:不進入交互式模式,而直接將URL的內容輸出至標準輸出


  httpd命令:

    語法:httpd [options]

    常用的options:

      -l:查看靜態編譯的模塊,列出核心中編譯了哪些模塊。它不會列出使用LoadModule指令動態加載的模塊

      -M:輸出一個已經啓用的模塊列表,包括靜態編譯在服務器中的模塊和作爲DSO動態加載的模塊

      -v:顯示httpd的版本,然後退出

      -V:顯示httpd和apr/apr-util的版本和編譯參數,然後退出

      -X:以調試模式運行httpd。僅啓動一個工作進程,並且服務器不與控制檯脫離


13.4 編譯安裝httpd-2.4

  httpd依賴於apr-1.4+,apr-util-1.4+,[apr-icon]

  apr:apache portable runtime

  CentOS6提供的apr是1.3.9版本,而apr-util也是1.3.9版本,所以想在CentOS6上安裝httpd-2.4版本時需要先安裝apr-1.4+和apr-util-1.4+,而在CentOS7中則不用另行安裝


  httpd-2.4編譯安裝步驟:

  a) 安裝開發環境(yum groupinstall)

  b) 下載並安裝apr-1.4+和apr-util-1.4+。此步驟僅需在CentOS6系列上執行,CentOS7無需執行此步

cd /usr/src/
wget http://mirrors.hust.edu.cn/apache//apr/apr-1.5.2.tar.bz2
wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.5.4.tar.bz2
tar xvf apr-1.5.2.tar.bz2
tar xvf apr-util-1.5.4.tar.bz2
cd apr-1.5.2
./configure --prefix=/usr/local/apr
make && make install
cd ../apr-util-1.5.4
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install

  c) 編譯安裝httpd

groupadd -r apache
useradd -r -g apache apache
yum -y install openssl-devel pcre-devel
./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
make && make install


13.5 httpd常用配置

  httpd-2.2常用配置:

  修改監聽的IP和端口:

Listen [IP:]PORT

    省略IP表示監聽所有地址。Listen可重複出現多次


  持久連接:即長連接

Persistent Connection:連接建立,每個資源獲取完成後不會立即斷開連接,而是繼續等待其它的請求完成

      如何斷開?

        數量限制:默認獲取100個資源後會自動斷開連接

        時間限制:可配置,對於併發很大的服務器來說,此值不能設定太大

      副作用:對於併發訪問量較大的服務器,持久連接功能會使有些請求得不到響應

      折衷:使用較短的持久連接時間。httpd-2.4支持毫秒級持久時間

KeepAlive {On | Off}:設定是否啓用持久連接
MaxKeepAliveRequests 100:設定最大允許獲取的資源數,當達到些設定值時將自動斷開連接
KeepAliveTimeout 15:設定時間限制,當達到些時間限制時將自動斷開連接


    測試持久連接:

telnet HOST PORT                # telnet 192.168.1.1 80
GET /URL HTTP/1.1              # GET /index.html HTTP/1.1
Host: HOSTNAME or IP        # Host: 192.168.1.1


  MPM:Multi Path Modules,多處理模塊。用於定義httpd的工作模型(單進程、單進程多線程、多進程、多進程單線程、多進程多線程)

    httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個

    rpm安裝的包提供了三個二進制程序文件,分別用於實現對不同MPM機制的支持。確認方法:

ps aux |grep httpd

    默認爲/usr/sbin/httpd,其使用prefork

    更換使用的httpd程序:編輯/etc/sysconfig/httpd文件,並重啓服務使之生效

HTTPD={httpd | httpd.worker | httpd.event}

    配置MPM:編輯主配置文件/etc/httpd/conf/httpd.conf

    prefork的配置:

StartServers:服務啓動時啓動的服務器進程數(提供服務的子進程數,不包含主進程)
MinSpareServers:最少空閒進程數
MaxSpareServers:最大空閒進程數
ServerLimit:爲MaxClients所準備的在其服務生命週期內所允許的進程數量最大值
MaxClients:最大併發請求數
MaxRequestsPerChild:一個服務器進程最多能夠響應多少次的請求

    worker的配置:

StartServers:服務啓動時啓動的服務器進程數(提供服務的子進程數,不包含主進程)
MaxClients:服務端最多啓動的線程數量
MinSpareThreads:最少空閒線程數
MaxSpareThreads:最多空閒線程數
ThreadsPerChild:每個進程所能夠啓動的線程數
MaxRequestsPerChild:每個線程所能夠響應的最大請求數量,0表示無限制


  DSO:Dynamic Share Object,模塊的動態裝/卸載機制

    配置指令實現模塊加載:

LoadModule <mod_name> <mod_path>

    模塊路徑(mod_path)可使用相對路徑:

        相對於ServerRoot(/etc/httpd)指向的路徑而言

          /etc/httpd/modules   -->  /usr/lib64/httpd/modules


  定義“Main”server的文檔頁面路徑,DocumentRoot

    文檔路徑映射:

      DocumentRoot指向的路徑爲URL路徑的起始位置

DocumentRoot "/var/www/html"

          test/index.html  -->  http://HOST:PORT/test/index.html


  站點訪問控制:

    可基於兩種類型的路徑指明對哪些資源進行訪問控制:

      針對文件系統路徑:

<Directory ""> </Directory>
<File ""> </File>
<FileMatch ""> </FileMatch>

      針對URL路徑:

<Location ""> </Location>
<LocationMatch ""> </LocationMatch>

    訪問控制機制:

      基於來源地址

      基於帳號


  Directory中“基於來源地址”實現訪問控制:httpd-2.2版本

    a) Options

      所有可用特性:

Indexes  Includes  FollowSymLinks  SymLinksifOwnerMatch  ExecCGI  MultiViews

        Indexes:索引,當不指定要訪問的頁面具體路徑而又沒有默認主頁(index.html)時,以鏈接形式列出根(默認爲/var/www/html)下的所有內容

        FollowSymLinks:允許跟蹤符號鏈接文件

    b) 基於來源地址的訪問控制機制

Order:檢查次序
Order allow,deny    先允許後拒絕。默認所有都拒絕,只有明確允許的才允許訪問
Order deny,allow    先拒絕後允許。默認所有都允許,只有明確拒絕的才拒絕訪問
Allow from 來源地址
Deny from 來源地址

      來源地址可以爲:

        IP:如192.168.1.1

        NetAddr:

          172.16

          172.16.0.0

          172.16.0.0/16

          172.16.0.0/255.255.0.0

        FQDN:可以是完整的主機名,也可以是一個域名,如*.idfsoft.com

        All


  基於用戶的訪問控制:

    認證質詢:此處是一個響應報文

      WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並說明要求客戶提供帳號和密碼

    認證:此處是一個請求報文

      Authorization:客戶端用戶填入帳號和密碼後再次發送請求報文,認證通過,則服務器發送響應的資源

      認證類型:

        basic:明文

        digest:消息摘要,經過MD5加密

    安全域:需要用戶認證後才能訪問的路徑稱之爲安全域

      應該通過名稱對其進行標識,並用於告知用戶認證的原因

    用戶的帳號和密碼存儲於何處:

      虛擬帳號:僅用於訪問某服務時用到的認證標識

      存儲機制:

        文本文件

        SQL數據庫

        ldap

        nis


    basic認證:基於文本文件的存儲機制

      a) 定義安全域

<Directory "">
  Options None
  AllowOverride None
  AuthType Basic
  AuthName "String"
  AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
  Require user username1 username2 ...     #只允許帳號文件中指定的用戶登錄訪問
</Directory>

允許帳號文件中的所有用戶登錄訪問:
  在<Directory> </Directory>之間添加Require valid-user

      b) 提供帳號和密碼存儲(使用htpasswd命令)

htpasswd [options] passwordfile username

      常用的options:

        -c:自動創建passwordfile,因此,僅應該在添加第一個用戶時使用

        -m /path/to/passwordfile:md5加密用戶密碼

        -s:sha1加密用戶密碼

        -D:刪除指定用戶

      c) 實現基於組進行認證

<Directory "">
  Options None
  AllowOverride None
  AuthType Basic
  AuthName "String"
  AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
  AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
  Require group GROUP1 GROUP2 ...
</Directory>

      要提供用戶帳號文件和組文件:

        組文件:只能手動定義,每一行定義一組。格式如下:

GROUP_NAME:user1 user2 user3 ...

  在組文件中的user必須在帳號文件中存在。


  定義默認主頁面:

DirectoryIndex index.html index.html.var

  日誌設定:

    定義日誌格式:LogFormat 

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

      常用的日誌格式定義宏:詳情請看 官方文檔

%h:客戶端IP地址
%l:小寫的L,遠程登錄的用戶名,Remote logname (from identd,if supplied). -表示爲空
%u:遠程用戶。Remote user, (from auth; may be bogus if return status (%s) is 401)
%t:服務器收到請求的時間
%r:請求報文的首行信息(請求的方法,URL,協議版本)
%>s:響應狀態碼
%b:響應報文的大小,不包含響應報文首部,單位是字節
%{Referer}i:請求報文當中"referer"首部的值。當前資源的訪問入口,即從哪個頁面中的超鏈接跳轉而來
%{User-Agent}i:請求報文當中"User-Agent"首部的值。即發出請求用到的應用程序

                                       

   錯誤日誌:

Errorlog logs/error_log
LogLevel <日誌級別>    #默認是warn級別

     日誌級別有以下這些:從低到高,日誌級別越低,記錄越詳細

      debug

      info

      notice

      warn

      error

      crit

      alert

      emerg

   訪問日誌:

CustomLog logs/access_log combined


  路徑別名:把一個URL映射至別的路徑上

Alias /URL/ "/PATH/TO/SOMEDIR/"
如:Alias /bbs/ "/bbs/htdocs"


  設定默認字符集:

AddDefaultCharset UTF-8

  

  虛擬主機:

   有三種實現方案:

     基於ip:爲每個虛擬主機準備至少一個ip地址

     基於port:爲每個虛擬主機準備至少一個專用port,實踐中很少使用

     基於域名:爲每個虛擬主機準備至少一個專用域名

      需要將NameVirtualHost的註釋去掉

     可混合使用上述三種方式中任意方式

   注意:一般虛擬主機莫與中心主機混用,所以,要使用虛擬主機,必須先禁用中心主機

     禁用中心主機:註釋DocumentRoot

   每個虛擬主機都有專用配置:還可以在虛擬主機中通過Directory進行訪問控制

<VirtualHost *:80>    #此處的*可以換成指定的IP地址
  ServerAdmin [email protected]
  DocumentRoot /www/docs/dummy-host.example.com
  ServerName dummy-host.example.com
  ErrorLog logs/dummy-host.example.com-error_log
  CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>


  內置的status頁面:可以查看服務器的狀態

<Location /server-status>
  SetHandler server-status
  Order deny,allow
  Deny from all
  Allow from .example.com
</Location>


  使用mod_deflate模塊壓縮頁面優化傳輸速度:適用於httpd-2.2版本

   適用場景:

     a) 節約帶寬,額外消耗CPU,同時,可能有些較老瀏覽器不支持

     b) 壓縮適於壓縮的資源,例如文本文件

   方法:

     a) 編輯主配置文件/etc/httpd/conf/httpd.conf,查找mod_deflate.so,將其前面的註釋去掉,啓用mod_deflate模塊

     b) 將以下內容添加至主配置文件:

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.    根據首部的User-Agent基於正則模式匹配瀏覽器類型和版本
BrowserMatch ^Mozilla/4 gzip-only-text/html        #瀏覽器是Mozilla/4時,用gzip壓縮,但只壓縮text/html格式的文檔
# Netscape 4.06-4.08 have some more problems    根據首部的User-Agent基於正則模式匹配瀏覽器類型和版本
BrowserMatch ^Mozilla/4\.0[678] no-gzip                #瀏覽器是Mozilla的4.0、4.6、4.7或4.8版本時不壓縮
# MSIE masquerades as Netscape, but it is fine    根據首部的User-Agent基於正則模式匹配瀏覽器類型和版本
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html    #瀏覽器是IE6.0之前的版本時,不壓縮,若要壓縮則只用gzip壓縮text/html格式的文檔


  配置httpd支持https:

   a) 爲服務器申請數字證書

     測試:通過私建CA發證書

      創建私有CA

      在服務器創建證書籤署請求

      CA簽證

   b) 配置httpd支持使用ssl,及使用的證書

yum -y install mod_ssl

     配置文件:/etc/httpd/conf.d/ssl.conf

DocumentRoot = ??
ServerName = ??
SSLCertificateFile = ??
SSLCertificateKeyFile = ??

   c) 測試基於https訪問相應的主機

openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]


  httpd-2.4常用配置:

   切換使用MPM(編輯/etc/httpd/conf.modules.d/00-mpm.conf文件):

LoadModule mpm_NAME_module modules/mod_mpm_NAME.so

#   NAME:有三種,分別爲prefork,event,worker


   修改“Main" Server的DocumentRoot


   基於IP的訪問控制法則:

     允許所有主機訪問: Require all granted

     拒絕所有主機訪問: Require all deny


     控制特定IP訪問:

Require ip IPADDR:授權指定來源地址的主機訪問
Require not ip IPADDR:拒絕指定來源地址的主機訪問

IPADDR的類型:
  IP:192.168.1.1
  Network/mask:192.168.1.0/255.255.255.0
  Network/Length:192.168.1.0/24
  Net:192.168

     控制特定主機(HOSTNAME)訪問:

Require host HOSTNAME
Require not host HOSTNAME

HOSTNAME的類型:
  FQDN:特定主機的全名
  DOMAIN:指定域內的所有主機

     注意:httpd-2.4版本默認是拒絕所有主機訪問的,所以安裝以後必須做顯示授權訪問

     示例:

<RequireAll>
  Require not ip 192.168.1.20
  Require all granted
</RequireAll>


   虛擬主機:

     基於IP、PORT和域名都支持

     基於域名的不再需要NameVirtualHost指令


   ssl:

     啓用模塊:編輯/etc/httpd/conf.modules.d/00-base.conf文件,添加下面這行,如果已經有了但是註釋了,則取消註釋即可

LoadModule ssl_module modules/mod_ssl.so


    服務腳本:

     CentOS6編譯安裝的服務腳本:apachectl {start | stop | restart}

     CentOS7的服務腳本:httpd.service,使用systemctl控制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章