HTTP服務和APACHE

HTTP服務和APACHE

1. 跨Internet的主機間通信

要經過Internet進行通訊,至少須要一對套接字;其中一個運行在客戶端,定義了一個惟一的客戶進程,稱之爲ClientSocket,另外一個運行於服務器端面,定義了一個惟一的服務器進程,稱爲ServerSocket。根據鏈接啓動的方式以及本地要鏈接的目標,套接字之間的鏈接過程能夠分爲三個步驟:服務器監聽、客戶端請求、鏈接確認javascript

  • Socket套接字php

    1. 套接(Socket)字做用
      進程間通訊(IPC)的一種實現,容許位於不一樣主機(或同一主機)上不一樣進程之間進行通訊和數據交換css

      進程間通訊(IPC,Inter-Process Communication)指至少兩個進程或線程間傳送數據或信號的一些技術或方法html

    2. Socket組成
      IP地址和端口號,合稱爲套接字地址(socket address)java

    3. 開發程序時如何實現Socket通信
      調用Socket API(封裝了內核中所提供的socket通訊相關的系統調用),須要指定兩項內容linux

      1. Socket Domain:根據其所使用的地址
        1. AF_INET:Address Family,IPv4 <==經常使用
        2. AF_INET6:IPv6
        3. AF_UNIX:UNIX文件,同一主機上不一樣進程之間通訊時使用,不須要封裝解封裝,經過此文件通信
      2. Socket Type:根據使用的傳輸層協議
        1. SOCK_STREAM:流,tcp套接字,可靠地傳遞、面向鏈接 <==經常使用
        2. SOCK_DGRAM:數據報,udp套接字,不可靠地傳遞、無鏈接
        3. SOCK_RAW:裸套接字,無須tcp或udp,APP直接經過IP包通訊

          #API(Application Programming Interface,應用程序編程接口)是一些預先定義的函數,目的是提供應用程序與開發人員基於某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內部工做機制的細節nginx

    4. 應用程序通信過程
      開發一個能夠和網絡通信的應用程序,客戶端和服務端相互通信,須要調用Socket相關的一些函數
      在這裏插入圖片描述web

    5. 通信過程正則表達式

      1. 服務器端先建立一個ServerSocket,綁定用到的協議,ip地址,端口(低於1023的端口只有管理員可用)
      2. 綁定成功後服務器端不定位具體的客戶端套接字,而是處於等待鏈接的狀態,實時監控網絡狀態(監聽)
      3. 在客戶端,須要鏈接服務器也須要建立Socket(ClientSocket不須要綁定地址和端口),須要指出服務器端套接字的地址和端口號,建立成功後發起鏈接請求
      4. 服務器監聽到請求,建立新的套接字描述符,用accept函數接收請求
      5. 鏈接成功後,即可以相互發送數據
    6. 套接字相關的系統調用:shell

函數 描述
socket() 建立一個套接字
bind() 綁定IP和端口
listen() 監聽
accept() 接收請求
connect() 請求鏈接創建
write() 發送
read() 接收
close() 關閉鏈接

2 HTTP服務基礎理論

  • HTTP相關術語

    1. http(Hyper Text Transfer Protocol, 80/tcp)
      超文本的傳輸協議

      超文本是由信息結點和表示信息結點間相關性的鏈構成的一個具備必定邏輯結構和語義的網絡,可使單一的信息之間相互交叉「引用」

    2. html(Hyper Text Markup Language )
      http協議傳輸使用的文件大部分爲html(也能夠封裝傳輸其餘類型文件),使用超文本標記語言,編程語言編寫,
      示例:超文本標記語言
           
           
           
           
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      <html> <head> <title>html語言 </title> </head> <body> <img src="http://www.alidns.com/static/img/logo.png" > <h1>標題1</h1> <p><a href=http://www.alidns.com/>linux</a>welcome</p> </body> </html>
      超文本(index.html)顯示效果
      在這裏插入圖片描述
      普通文本顯示效果
      在這裏插入圖片描述
    3. CSS (Cascading Style Sheet )
      層疊樣式表:控制網頁樣式並容許將樣式信息與網頁內容分離的一種標記性語言,至關於定義一個標準,能夠應用於其餘頁面,不須要每一個頁面重複編制
    4. js javascript(與java沒有關係)
      JavaScript:一種直譯式腳本語言,是一種動態類型、弱類型、基於原型的語言,內置支持類型,在網頁上使用時,用來給HTML網頁增長動態功能。
    5. MIME(Multipurpose Internet Mail Extensions)
      多用途互聯網郵件擴展 :服務器將MIME標誌符放入傳送的數據中來告訴瀏覽器使用哪一種插件讀取相關文件
      MIME支持傳輸的類別:/etc/mime.types
      參考站點:http://www.w3school.com.cn/media/media_mimeref.asp
  • HTTP協議歷史
    HTTP 協議不帶有狀態(記不住訪問者是誰),每次請求都必須附上全部信息。請求的不少字段都是重複的,浪費帶寬,影響速度

    1. http/0.9:1991,原型版本
      功能簡陋,只有一個命令GET。GET /index.html ,服務器只能迴應HTML格式字符串,不能迴應別的格式

    2. http/1.0:1996年5月

      1. 支持緩存(cache)

      2. 開始執行MIME,

      3. 引入更多method

        1. GET
          請求服務器發送某個資源
        2. POST
          起初是用來向服務器寫入數據的;實際上,一般會用它來支持HTML的表單。表單中填好的數據一般會被髮送給服務器,而後服務器將其發送到他要去的地方
        3. HEAD
          請求服務器發送某個資源,服務器在響應中只返回首部,不會反回實體的主體部分
      4. 頭信息是 ASCII 碼,後面數據可爲任何格式,服務器迴應時會告訴客戶端,數據是什麼格式,即Content-Type字段的做用。

      5. 缺點
        每一個TCP鏈接只能發送一個請求,發送數據完畢,鏈接就關閉,若是還要請求其餘資源,就必須再新建一個鏈接

    3. http/1.1:1997年1月

      1. 引入了持久鏈接(persistent connection),
        即TCP鏈接默認不關閉,能夠被多個請求複用,不用聲明Connection: keep-alive。對於同一個域名,大多數瀏覽器容許同時創建6個持久鏈接
      2. 引入了管道機制(pipelining),
        即在同一個TCP鏈接裏,客戶端能夠同時發送多個請求,進一步改進了HTTP協議的效率
      3. 新增方法(method)
        1. PUT
          從客戶端發送數據取代指定的文檔內容
        2. TRACE
          用於診斷請求報文在發送給最終目標服務器時,中間HTTP程序組是否以及如何被損壞或者修改過
        3. OPTIONS
          能夠詢問服務器一般支持哪些方法,或者對某些特殊資源支持哪些方法
        4. DELETE
          請服務器刪除請求URL所指定的資源
      4. 缺點
        同一個TCP鏈接裏,全部的數據通訊是按次序進行的。服務器只能順序處理迴應,前面的迴應慢,會有許多請求排隊,形成"隊頭堵塞"(Head-of-line blocking)
        爲避免上述問題,兩種方法
        1. 減小請求數
        2. 同時多開持久鏈接
          網頁優化技巧,如合併腳本和樣式表、將圖片嵌入CSS代碼、域名分片(domain sharding)等
    4. Spdy:2009年
      谷歌研發,解決 HTTP/1.1 效率不高問題

    5. http/2.0:2015年

      1. 頭信息和數據體都是二進制,稱爲頭信息幀和數據幀
      2. 複用TCP鏈接
        在一個鏈接裏,客戶端和瀏覽器均可以同時發送多個請求或迴應,且不用按順序一一對應,避免了「隊頭堵塞「,此雙向的實時通訊稱爲多工(Multiplexing)
      3. 引入頭信息壓縮機制(header compression),
        頭信息使用gzip或compress壓縮後再發送;客戶端和服務器同時維護一張頭信息表,全部字段都會存入這個表,生成一個索引號,不發送一樣字段,只發送索引號,提升速度
      4. 服務器推送(server push)
        HTTP/2 容許服務器未經請求,主動向客戶端發送資源
        HTTP工做機制
  • 工做機制
    一次HTTP操做稱爲一個事務,其工做過程可分爲四步

    1. 首先客戶機與服務器須要創建鏈接
    2. 客戶機發送一個請求給服務器(http request)
      請求方式的格式爲:統一資源標識符(URL)、協議版本號,後邊是MIME信息包括請求修飾符、客戶機信息和可能的內容
    3. 服務器響應請求(http response)
      服務器接到請求後,給予相應的響應信息,其格式爲一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,後邊是MIME信息包括服務器信息、實體信息和可能的內容
    4. 斷開鏈接
      客戶端接收服務器所返回的信息經過瀏覽器顯示在用戶的顯示屏上,而後客戶機與服務器斷開鏈接
  • Web資源:web resource
    一個網頁由多個資源構成,打開一個頁面,會有多個資源展現出來,可是每一個資源都要單獨請求。所以,一個「Web 頁面」一般並非單個資源,而是一組資源的集合

    1. 靜態文件:無需服務端作出額外處理
      文件後綴:.jpg, .html, .txt, .js, .css, .mp3, .avi
    2. 動態文件:服務端執行程序,返回執行的結果
      文件後綴:.asp, .php, .jsp
  • HTTP鏈接方式

    1. 串行鏈接
      訪問網站時,頁面文件可能包含諸多資源,須要將資源從服務器上下載下來,串行鏈接方式爲,每一個資源都要通過鏈接請求(三次握手),下載完成後才能開始下一個鏈接請求,再次(三次握手)
    2. 並行鏈接
      同時發起屢次請求,服務器端口是固定不變的,客戶端要同時打開多個端口分別發起鏈接請求,服務器同時迴應
    3. 持久鏈接(keep-alive)
      也叫長鏈接,重用TCP鏈接,以消除鏈接和關閉的時延,以事務個數和時間來決定是否關閉鏈接;只創建一次鏈接請求(三次握手),獲得第一個資源後,TCP鏈接不會斷開,能夠繼續發送獲取數據請求而不須要通過三次握手,直到將全部資源下載下來,屬因而串行傳輸
    4. 管道化持久鏈接
      經過共享TCP鏈接發起併發的HTTP請求
      在持久鏈接的基礎上,在第一條請求發出後,不須要等待服務器迴應,能夠繼續發送第二條請求、第三條請求,使多條請求處於列隊狀態,
  • URI(Uniform Resource Identifier)
    統一資源標識,分爲URL和URN,URN使用的較少,因此不少時候說URI就是在說URL

    1. URN(Uniform Resource Naming)
      統一資源命名,典型的就是P2P下載使用的磁力連接,將需求資源標識爲名字,而不是指向一個地址,經過搜索資源名,在互聯網上找那些主機上有此資源,而後發起並行鏈接,鏈接到全部有資源的主機上,進行下載
    2. URL(Uniform Resorce Locator)
      1. 概念
        統一資源定位符,用於描述某服務器某特定資源位置
      2. URL組成
               
               
               
               
        • 1
        <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
        1. schame
          方案,訪問服務器以獲取資源時要使用哪一種協議(例如http、ftp、rtsp等)
        2. user
          用戶,某些方案訪問資源時須要的用戶名
        3. password
          密碼,用戶對應的密碼,中間用:分隔
        4. Host
          主機,資源宿主服務器的主機名或IP地址或FQDN
        5. port
          端口,資源宿主服務器正在監聽的端口號,不少方案有默認端口號
        6. path
          路徑,服務器資源的本地名,由一個/將其與前面的URL組件分隔,稱爲短URL
        7. params
          參數,指定輸入的參數,參數爲名/值對,多個參數,用[ ; ]分隔
        8. query
          查詢,傳遞參數給程序,如數據庫,用[?]分隔,多個查詢用[ & ]分隔
        9. frag
          片斷,一小片或一部分資源的名字,此組件在客戶端使用,用[ # ]分隔
      3. 示例
        query查詢
               
               
               
               
        • 1
        https://list.jd.com/list.html?cat=670,671,672&ev=149_2992&sort=sort_totalsales15_desc&trans=1
        片斷
        http://apache.org/index.html#projects-list
    3. 二者區別
      URN如同一我的的名稱,而URL表明一我的的住址。換言之,URN定義某事物的身份,而URL提供查找該事物的方法。URN僅用於命名,而不指定地址
  • 網站訪問量

    1. IP(獨立IP)
      即Internet Protocol,指獨立IP數。一天內來自相同客戶機IP地址只計算一次,記錄遠程客戶機IP地址的計算機訪問網站的次數,是衡量網站流量的重要指標
    2. PV(訪問量)
      即Page View, 頁面瀏覽量或點擊量,用戶每次刷新即被計算一次,PV反映的是瀏覽某網站的頁面數,PV與來訪者的數量成正比,PV並非頁面的來訪者數量,而是網站被訪問的頁面數量
    3. UV(獨立訪客)
      即Unique Visitor,訪問網站的一臺電腦爲一個訪客。一天內相同的客戶端只被計算一次。能夠理解成訪問某網站的電腦的數量。網站判斷來訪電腦的身份是經過來訪電腦的cookies實現的。若是更換了IP後但不清除cookies,再訪問相同網站,該網站的統計中UV數是不變的
      網站統計:http://www.alexa.cn/rank/
    4. QPS(request per second,每秒請求數)
      QPS= PV* 頁面衍生鏈接次數/ 統計時間(86400)
      頁面衍生鏈接數:一個頁面的資源數
    5. 併發鏈接數
      併發鏈接數 =QPS * http平均響應時間
    6. 峯值時間
      天天80%的訪問集中在20%的時間裏,這20%時間爲峯值時間
      峯值時間每秒請求數(QPS)=( 總PV數 *頁⾯衍⽣鏈接次數)*80% ) / ( 天天秒數 * 20% )
    7. 網站訪問統計示例
      甲乙丙三人在同一臺經過ADSL上網的電腦上(中間沒有斷網),分別訪問www.magedu.com網站,而且每人各瀏覽了2個頁面,那麼網站的流量統計是:
      IP: 1 PV:6 UV:1
      若三人都是ADSL從新撥號後,各瀏覽了2個頁面,則
      IP: 3 PV:6 UV:1

3. Web服務請求處理步驟

  • 處理步驟
    在這裏插入圖片描述

    1. DNS解析
      1. 客戶端發出訪問www.taobao.com請求,先從本地host文件解析,不能解析,交給本機DNS緩存
      2. 本機沒有解析記錄的話,發送給本地解析服務器,本地DNS服務器查詢緩存,是否有記錄能夠迴應
      3. 本地DNS服務器緩存沒有記錄,發往DNS根服務器開始尋址,根服務器返回一級域名.com
      4. 本地DNS服務器拿到一級域名後,訪問一級域DNS服務器,返回二級域名taobao.com
      5. 本地DNS服務器訪問二級域名,獲得IP地址www.taobao.com,本地DNS服務器將全稱域名緩存至本地,而後發送給客戶
    2. 創建鏈接
      1. 用戶向淘寶發送一個數據包SYN=1,seq=x
      2. 若是淘寶能夠收到,則發送SYN=1,ACK=1,seq=y,ack=x+1
      3. 客戶收到淘寶的迴應包,再發送ACK=1,seq=x+1,ack=y+1,淘寶收到後,則創建成功
    3. web服務請求迴應
      1. 創建鏈接
        客服向服務器發起請求,此請求包括一些數據報文的頭部,包括(method:GET、POST/PUT/HEAD/DELECT等)

      2. 接收請求(可能會拒絕)
        接收客戶端請求報文中對某資源的一次請求的過程

      3. 處理請求
        服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理

      4. 訪問資源
        服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源

      5. 構建響應報文
        一旦Web服務器識別出了資源,就執行請求方法中描述的動做,並返回響應報文。響應報文中 包含有響應狀態碼、響應首部,若是生成了響應主體的話,還包括響應主體

      6. 發送響應報文
        Web服務器經過鏈接發送數據時也會面臨與接收數據同樣的問題。服務器可能有不少條到各個客戶端的鏈接,有些是空閒的,有些在向服務器發送數據,還有一些在向客戶端回送響應數據。服務器要記錄鏈接的狀態,還要特別注意對持久鏈接的處理。對非持久鏈接而言,服務器應該在發送了整條報文以後,關閉本身這一端的鏈接。對持久鏈接來講,鏈接可能仍保持打開狀態,在這種狀況下,服務器要正確地計算Content-Length首部,否則客戶端就沒法知道響應何時結束了

      7. 記錄日誌
        最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務

  • 元數據:請求報文首部

       
       
       
       
    • 1
    • 2
    • 3
    • 4
    1. 請求行: <method> <URL> <VERSION> 示例:GET /search?hl=zh-CN&source=hp HTTP/1.1 2. 請求頭部: name:value Host: <a>www.baidu.cn</a> 3. 空行: 4. 請求數據: <request body>
  • Web訪問響應模型(Web I/O)

    1. 單進程I/O模型
      啓動一個進程處理用戶請求,並且一次只處理一個,多個請求被串行響應
    2. 多進程I/O模型
      並行啓動多個進程,每一個進程響應一個鏈接請求
    3. 複用I/O結構
      啓動一個進程,同時響應N個鏈接請求
      實現方法:多線程模型和事件驅動
      多線程模型:一個進程生成N個線程,每線程響應一個鏈接請求
      事件驅動:一個進程處理N個請求
    4. 複用的多進程I/O模型
      啓動M個進程,每一個進程響應N個鏈接請求,同時接收M*N個請求
  • http請求報文
    在這裏插入圖片描述

  • http迴應報文
    在這裏插入圖片描述

4. HTTP服務器應用

4.1 http簡介

  • http服務器程序

    1. apche
    2. nginx
    3. lighttpd
  • 應用程序服務器
    提供http服務的應用,能夠提供動態程序

    1. IIS :微軟出品,支持.asp
    2. tomcat:支持 .jsp
    3. jetty:開源的servlet容器,基於Java的web容器
    4. Resin:CAUCHO公司,支持servlets和jsp的引擎
    5. webshpere(IBM), weblogic(BEA), jboss,oc4j(Oracle)
  • 市場統計
    www.netcraft.com

  • 特性
    高度模塊化:core(核心模塊) + modules(輔助模塊)
    模塊管理方式:

    1. DSO: Dynamic Shared Object
      動態加/卸載
    2. MPM:multi-processing module
      多路處理模塊,多種工做模式
  • MPM工做模式

    1. prefork:多進程I/O模型,每一個進程響應一個請求,默認模型
      1. 工做原理
        主進程生成和回收n個子進程,建立套接字,不響應請求;生成多個工做子進程,每一個子進程處理一個請求;系統初始時,預先生成多個空閒進程,等待請求,最大不超過1024個
      2. 限制
        基於linux的管理,程序開啓子進程數不能過多,在prefrok模型下,一般會有C10k(併發鏈接數達到1萬)限制,Apache響應速度會受到很大的影響,解決c10k限制目前是應用nginx
    2. worker:複用的多進程I/O模型,多進程多線程,IIS使用此模型
      1. 工做原理
        主進程生成m個子進程,每一個子進程生成n個線程,每一個線程響應一個請求,併發響應請求m*n,佔用資源少
      2. 缺點
        線程之間會互相影響,沒有prefork模式穩定
    3. event:事件驅動模型(worker模型的變種)
      主進程生成m個子進程,每一個進程直接響應n個請求,併發響應請求m*n個,有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又容許釋放。這樣加強了高併發場景下的請求處理能力
  • httpd功能特性

    1. 虛擬主機
      在一個物理服務器上搭建多個網站
    2. CGI(Common Gateway Interface):通用網關接口
      實現動態程序,須要額外做開發
    3. 反向代理
      (通常不使用Apache充當反向代理,使用nginx或haproxy較多)
      接受internet上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將服務器上的到的結果返回給internet上請求鏈接的客戶端

      正向代理
      一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端;使用緩存特性,能夠減小局域網客戶端帶寬使用率;幫助客戶端訪問遠程服務器

    4. 負載均衡
    5. 路徑別名
    6. 豐富的用戶認證機制
      basic,digest
    7. 支持第三方模塊

4.2 httpd(Apache)安裝

  • 版本:
    CentOS 6: 2.2
    CentOS 7: 2.4

  • 安裝方式:

    1. rpm:centos發行版,穩定,建議使用

           
           
           
           
      • 1
      [root@hai7-6 ~]$yum install httpd
    2. 編譯:定製或特殊需求

  • 相關文件

    1. 配置文件
      1. 主配置文件
        /etc/httpd/conf/httpd.conf
      2. 子配置文件,下降複雜性,分開存放的配置文件
        /etc/httpd/conf.d/*.conf
    2. 服務文件
      /usr/lib/systemd/system/httpd.service
    3. 主程序
      1. CentOS7中,不一樣的工做模型由模塊方式提供,只有一個主程序
        /usr/lib64/httpd
      2. CentOS 6中,三個程序分別對應三種工做模型
        1. prefork默認模式
          /usr/sbin/httpd
        2. event模式
          /usr/sbin/httpd.event
        3. worker模式
          /usr/sbin/httpd.worker
  • 默認http網頁數據存放路徑
    /var/www/html

  • 日誌存放路徑
    軟鏈接:/etc/httpd/logs
    真實路徑:/var/log/httpd

    文件屬主爲root,Apache運行時會開啓子進程,是能夠寫入的

  • 主進程編號文件存放目錄
    /etc/httpd/run/httpd.pid

  • 幫助文檔包
    httpd-manual

       
       
       
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. '安裝文檔包' [root@hai7-6 html]$yum install httpd-manual 2. '從新加載httpd服務' [root@hai7-6 html]$systemctl reload httpd 3. '在瀏覽器中訪問,192.168.50.107爲本機的ip' http://192.168.50.107/manual/
  • 檢查配置語法:

    1. httpd –t
    2. service httpd configtest
    3. 示例:語法檢查時出現00558報錯解決方案
           
           
           
           
      • 1
      • 2
      [root@hai7-6 conf]$httpd -t AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fe81:ee10. Set the 'ServerName' directive globally to suppress this message
      會出現AH00558這個提示,是由於沒有配置ServerName,能夠在配置文件中修改,此名字只有本地意義,須要配置DNS才能夠經過網絡解析
           
           
           
           
      • 1
      • 2
      • 3
      [root@hai7-6 conf]$vim httpd.conf #ServerName www.example.com:80 <==找到ServerName行,去掉註釋,或者新建一行都行 erverName www.moli.com:80

4.3 httpd配置文件格式

  • httpd配置文件的組成

    1. httpd2.2中配置文件的組成:分爲三大塊
      1. 全局配置
        ### Section 1: Global Environment
      2. 主服務器配置
        ### Section 2: 'Main' server configuration
      3. 虛擬主機配置
        ### Section 3: Virtual Hosts
    2. httpd2.4版本中取消了分塊,各類配置仍然支持
  • 配置格式

    1. 格式(相似於鍵值對)
      directive value
    2. 字符書寫要求
      1. directive:
        不區分字符大小寫,推薦按官方格式
      2. value:
        爲路徑時,區分大小寫
    3. 示例
           
           
           
           
      • 1
      • 2
      ServerTokens Prod | directive |value|

4.4 Httpd常見配置項

子配置文件之因此優先權高,是由於子配置文件是在主配置文件最後加載的,至關於變量賦值,後面進行的賦值會覆蓋前面的

  • 顯示服務器版本信息

    1. 配置指令

           
           
           
           
      • 1
      ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
    2. 各類級別顯示效果,建議使用ServerTokens Prod

      1. 設置值:ServerTokens Prod[uctOnly]
        顯示值:Server: Apache
      2. 設置值:ServerTokens Major
        顯示值:Server: Apache/2
      3. 設置值:ServerTokens Minor
        顯示值:Server: Apache/2.0
      4. 設置值:ServerTokens Min[imal]
        顯示值:Server: Apache/2.0.41
      5. 設置值:ServerTokens OS
        顯示值:Server: Apache/2.0.41 (Unix)
      6. 設置值:ServerTokens Full (or not specified)
        顯示值:Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2
    3. 查看顯示效果,能夠經過網站F12查看請求報文,或者在命令行使用curl -I

           
           
           
           
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      [root@hai6 html]$curl -I www.moli.com HTTP/1.1 200 OK Date: Fri, 19 Oct 2018 09:30:22 GMT Server: Apache/2.4.6 (CentOS) <==版本信息 Last-Modified: Fri, 19 Oct 2018 08:21:11 GMT ETag: "6f-5789096068cb7" Accept-Ranges: bytes Content-Length: 111 Content-Type: text/html; charset=UTF-8
  • 修改監聽的IP和Port

    1. 配置指令
      Listen [IP:]PORT
    2. 格式說明
      1. 省略IP表示爲本機全部IP
      2. Listen指令至少一個,可重複出現屢次
    3. 示例
      1. 示例一:在子配置文件中加入一個非默認端口,讓本機的http服務同時存在兩個端口
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        1. '修改配置文件,增長非默認端口' [root@hai7-6 ~]$vim /etc/httpd/conf.d/ listen 10086 <==增長端口10086 2. '從新加載服務' [root@hai7-6 ~]$systemctl reload httpd 3. '查看端口號' [root@hai7-6 ~]$ss -ntl LISTEN 0 128 :::80 :::* <==原端口80 LISTEN 0 128 :::10086 :::* <==增長的端口10086
      2. 示例二:爲主機配置兩個地址1個爲內網192.168.50.107,1個爲外網地址172.20.122.117,外網的80端口不但願別人訪問,內網的80端口能夠正常訪問,能夠經過http端口綁定在內網ip上實現
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        1. '修改主配置文件端口項,格式以下' [root@hai7-6 ~]$vim /etc/httpd/conf/httpd.conf Listen 192.168.50.107:80 2. '重啓服務' [root@hai7-6 ~]$systemctl restart httpd 3. '查看端口信息' [root@hai7-6 ~]$ss -ntl LISTEN 0 128 192.168.50.107:80 *:*
  • 持久鏈接(Persistent Connection)
    鏈接創建,每一個資源獲取完成後不會斷開鏈接,而是繼續等待其它的請求完成,默認關閉持久鏈接

    1. 配置指令
      1. 啓動持久鏈接
        KeepAlive On|Off
      2. 斷開條件
        1. 超時時長,以秒爲單位, httpd-2.4 支持毫秒級
          KeepAliveTimeout 15
        2. 數量限制,發起多少次鏈接就斷開鏈接
          MaxKeepAliveRequests 100
    2. 缺點
      對併發訪問量較大的服務器,持久鏈接會使有些請求得不到響應
    3. 優化
      使用較短的持久鏈接時間
    4. 測試持久鏈接
      使用telnet指令, 鏈接成功後下載資源,若是下載後沒有斷開就是開啓持久鏈接狀態
           
           
           
           
      • 1
      • 2
      • 3
      [root@hai6 html]$telnet 192.168.50.107 80 GET /index.html HTTP/1.1 <==指令,模擬請求報頭寫法 HOST: 3.3.3.3 <==目標IP
  • MPM( Multi-Processing Module)多路處理模塊
    對linux而言,原本就是使用LWP(ligth weight process)機制

    1. httpd2.2版本
      httpd-2.2不支持同時編譯多個模塊,因此只能編譯時選定一個;rpm安裝的包提供三個二進制程序文件,分別用於實現對不一樣MPM機制的支持
      1. 確認方法:ps aux | grep httpd
        /usr/sbin/httpd, 即prefork模式
        /usr/sbin/httpd.worker,即worker模式
        /usr/sbin/httpd.event,即event模式(測試階段,不建議2.2使用)
      2. 更換使用的httpd程序模式
        編輯文件/etc/sysconfig/httpd找到以下行,至關於變量,將值修改成對應模式,重啓生效
        HTTPD=/usr/sbin/httpd.worker
    2. httpd2.4版本中MPM模式管理
      MPM多路處理以動態模塊方式提供
      1. 配置文件
        /etc/httpd/conf.modules.d/00-mpm.conf
      2. 修改示例
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        1. '配置文件中關於模塊文件的說明' [root@hai7-6 html]$grep -v '^[ ]*#' /etc/httpd/conf/httpd.conf Include conf.modules.d/*.conf <==找到此行,說明關於模塊的配置文件放在那裏 2. '編輯上述目錄中mpm模塊,對應的模式以下所示,沒有註釋的爲啓用模式' [root@hai7-6 html]$vim /etc/httpd/conf.modules.d/00-mpm.conf LoadModule mpm_prefork_module modules/mod_mpm_prefork.so #LoadModule mpm_worker_module modules/mod_mpm_worker.so #LoadModule mpm_event_module modules/mod_mpm_event.so
    3. 模塊說明
      在目錄/etc/httpd/conf.modules.d(/usr/lib64/httpd/modules/)加載了大量模塊,httpd支持動態加載卸載模塊,能夠根據我的須要註釋掉對應模塊
      1. 查看當前已加載到內存中的動態模塊
        httpd -M
      2. 查看當前編譯在程序中的靜態模塊
        httpd -l(小L)
    4. 各模式的默認配置
      Httpd 2.2常見配置,在centos7使用的2.4版本中沒有此語句塊,須要修改能夠手動添加
      1. prefork的默認配置:
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        <IfModule prefork.c> StartServers 8 <==默認啓動進程數 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 <==最多進程數,最大20000 MaxClients 256 <==最大併發 MaxRequestsPerChild 4000 <==子進程最多能處理的請求數量(爲0時永遠不釋放) </IfModule>
      2. worker的默認配置:
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        <IfModule worker.c> StartServers 4 MaxClients 300 <==最多爲300個客戶服務 MinSpareThreads 25 <==最小25個空閒線程 MaxSpareThreads 75 ThreadsPerChild 25 <==每一個子進程支持的線程數 MaxRequestsPerChild 0 <==單個子進程在其生命週期內處理的總請求數限制 </IfModule>
    5. 壓力測試
      各模式性能測試,測試命令爲ab全面爲ApacheBench,-c表示併發訪問個數,-n最多訪問次數
           
           
           
           
      • 1
      • 2
      [root@hai7-6 ~]$ab -c 100 -n 2000 192.168.50.107/test.html Requests per second: 59.04 [#/sec] (mean) <==主要看這個參數,每秒請求處理次數
  • DSO(Dynamic Shared Object)動態共享對象

    1. 加載動態模塊配置
      /etc/httpd/conf/httpd.conf
    2. 配置指定實現模塊加載格式:
      LoadModule <mod_name> <mod_path>
    3. 模塊文件路徑可以使用相對路徑:
      相對於ServerRoot(默認/etc/httpd)
    4. 示例
           
           
           
           
      • 1
      LoadModule auth_basic_module modules/mod_auth_basic.so
  • 定義’Main’ server的文檔頁面路徑
    DocumentRoot指向的路徑爲URL路徑的起始位置
    注意:SELinux和iptables的狀態

    1. 配置指令
      1. 2.2版本修改後就能夠生效
        DocumentRoot 「/path」
      2. 2.4版本須要明確受權修改後的路徑
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        DocumentRoot 「/path」 <==定義DocumentRoot路徑 <Directory "/var/www/html"> <==受權目錄,在Directory後寫明須要受權的目錄 Require all granted <==授予的權限 </Directory> <==受權行尾
    2. 默認路徑
      /var/www/html
  • 定義站點主頁面
    主頁面顯示的內容默認值文件index.html,沒有此文件會顯示testing 123

    1. 配置指令
      DirectoryIndex
    2. 示例,能夠添加多個,找不到第一個用第二個
           
           
           
           
      • 1
      DirectoryIndex index.php index.html
  • 站點訪問控制常見機制
    可基於兩種機制指明對哪些資源進行何種訪問控制:源地址,用戶帳號

    1. 訪問控制路徑格式

      1. 對整個目錄受權
               
               
               
               
        • 1
        • 2
        • 3
        <Directory 「/path"> ... </Directory>
      2. 對單個文件受權
               
               
               
               
        • 1
        • 2
        • 3
        <File 「/path/file」> ... </File>
      3. 基於正則表達式訪問控制
               
               
               
               
        • 1
        • 2
        • 3
        <FilesMatch "PATTERN"> ... </FilesMatch>
      4. 基於URL路徑:
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        格式1:'指定URL' <Location ""> ... </Location> 格式2:'匹配模式' <LocationMatch ""> ... </LocationMatch>
      5. 示例
        1. 示例一:正則表達式控制訪問那些文件
                   
                   
                   
                   
          • 1
          <FilesMatch "\.(gif|jpe?g|png)$">
        2. 示例二:通配符寫法
                   
                   
                   
                   
          • 1
          <Files 「?at.*」>
        3. URL寫法,只容許192.168.50.115訪問/status
                   
                   
                   
                   
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          1. '只容許192.168.50.115訪問/status' <Location /status> <RequireAny> Require all denied require ip 192.168.50.115 </RequireAny> </Location> 2. 'URL支持正則表達式寫法,只容許192.168.50.115訪問/(extra|special)/data' <LocationMatch "/(extra|special)/data"> <RequireAny> Require all denied require ip 192.168.50.115 </RequireAny> </LocationMatch>
    2. Options定義行爲

      1. 配置指令
        Options後跟1個或多個以空白字符分隔的選項列表,定義了用戶在某個目錄下的特定行爲,在選項前的+,- 表示增長或刪除指定選項
      2. 常見選項
        1. Indexes
          指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶
        2. FollowSymLinks
          容許訪問符號連接文件所指向的源文件
        3. None
          所有禁用
        4. All
          所有容許
      3. 示例
        1. 示例一:返回索引列表給用戶
          1. 將’Main’ server指向路徑下的index.html文件失效,改變後綴便可
                       
                       
                       
                       
            • 1
            [root@hai7-6 ~]$mv /var/www/html/index.html /var/www/html/index.htm
          2. URL路徑下不存在與定義的主頁面資源相符的資源文件時默認返回的頁面爲testing 123,此頁面是由/etc/httpd/conf.d/welcom.conf定義的,改變此配置文件後綴,讓其失效
          3. 使用Indexes,返回索引列表給用戶(用於提供下載資源網站,例如阿里雲開源鏡像站)
                       
                       
                       
                       
            • 1
            • 2
            [root@hai7-6 html]$vim /etc/httpd/conf.d/text.conf options indexes <==增長此項
          4. 訪問http頁面,返回以下界面
            在這裏插入圖片描述
        2. 示例二:容許訪問符號連接文件所指向的源文件,選項FollowSymLinks
                   
                   
                   
                   
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          1. '編輯配置文件,在options指令後增長Followsymlinks選項' [root@hai7-6 html]$vim /etc/httpd/conf.d/text.conf options indexes Followsymlinks 2. '定義一個軟鏈接,指向 URL路徑' [root@hai7-6 conf.d]$ln -s /etc/passwd /var/www/html/ 3. '重啓生效' [root@hai7-6 conf.d]$systemctl restart httpd
        3. 示例三:取消外部以目錄形式訪問服務器,2.2版本能夠直接刪除,2.4版本apache須要將options設置-Indexes
                   
                   
                   
                   
          • 1
          • 2
          [root@hai7-6 ~]$vim /etc/httpd/conf.d/text.conf Options -Indexes
    3. <Directory>中「基於源地址」實現訪問控制
      與訪問控制相關的指令能夠放在指定目錄下的.htaccess(.htaccess爲默認值,能夠由AccessFileName在配置文件中自定義)文件中,覆蓋以前的配置指令只對<directory>語句有效

      1. 配置指令
        Allow Override
      2. 常見配置
        1. AllowOverride All
          全部指令都有效
        2. AllowOverride None
          .htaccess 文件無效
        3. AllowOverride AuthConfig Indexes
          除了AuthConfig 和Indexes的其它指令都沒法覆蓋
      3. 示例
        編輯.htaccess文件,實現目錄訪問控制,重啓生效
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        1. '在/var/www/html目錄下新建目錄log' [root@hai7-6 html]$mkdir log 2. '在log目錄中編輯`.htaccess`文件' [root@hai7-6 log]$vim .htaccess options indexes <==容許此目錄返回索引 3. '編輯子配置文件受權目錄/var/www/html/log覆蓋權限' [root@hai7-6 html]$vim /etc/httpd/conf.d/text.conf <Directory "/var/www/html/log"> <==受權路徑 allowoverride all <==受權設置生效 </Directory>
    4. httpd2.2用於容許或拒絕的語句

      1. 配置命令
        1. order:定義生效次序;寫在後面的表示優先生效
          Order allow,deny
          Order deny,allow
        2. allow|deny:容許|拒絕
          放在directory, .htaccess
        3. Allow from和Deny from:定義客戶端地址
        4. 客戶端地址:
          1. 具體IP地址
          2. 網絡地址:172.1六、172.16.0.0、172.16.0.0/1六、172.16.0.0/255.255.0.0
      2. 示例
        allow放在後面,表示沒有明確拒絕的都被容許,若是不放心,能夠加上Allow from all
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        <files "*.txt"> order deny,allow deny from 172.16. 100.100 </files>
    5. http2.4基於IP的訪問控制
      無明確受權的目錄,默認拒絕

      1. 容許全部主機訪問
        Require all granted
      2. 拒絕全部主機訪問
        Require all denied
      3. 控制特定的IP訪問:
        1. 受權指定來源的IP訪問
          Require ip IPADDR
        2. 拒絕特定的IP訪問
          Require not ip IPADDR
      4. 控制特定的主機訪問:
        1. 受權特定主機訪問
          Require host HOSTNAME:
        2. 拒絕 HOSTNAME
          Require not host HOSTNAME
      5. 特定主機
        FQDN
      6. 指定域名下的全部主機
        domin.tld
      7. 示例
        1. 拒絕特定主機訪問,先受權全部,再拒絕
                   
                   
                   
                   
          • 1
          • 2
          • 3
          • 4
          <RequireAll> Require all granted Require not ip 172.16.1.1 拒絕特定IP </RequireAll>
        2. 受權特定主機訪問,先拒絕全部,在受權
                   
                   
                   
                   
          • 1
          • 2
          • 3
          • 4
          <RequireAny> Require all denied require ip 172.16.1.1 </RequireAny>
        3. 在2.4版本中只容許192.168.50.115訪問配置文件,重啓生效
                   
                   
                   
                   
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          <FilesMatch ".+\.(conf|ini)$"> <==控制路徑 <RequireAny> <==受權語句 Require all denied require ip 192.168.50.115 </RequireAny> </FilesMatch>
  • 日誌設定
    在hpptd中日誌分爲訪問日誌和錯誤日誌兩類

    1. 錯誤日誌:ErrorLog

      1. 存放路徑
        /var/log/httpd/error_log
      2. 配置命令
        ErrorLog 「logs/error_log」
      3. 定義錯誤級別
        LogLevel warn
級別 描述 示例
emerg 緊急狀況系統沒法使用 「Child cannot open lock file. Exiting」
alert 必須當即處理 「getpwuid: couldn’t determine user name from uid」
crit 關鍵條件,危險狀況 「socket: Failed to get a socket, exiting child」
error 錯誤條件 「Premature end of script headers」
warn 警告信息 「child process 1234 did not exit, sending another SIGHUP」
notice 正常但比較重要的信息 「httpd: caught SIGBUS, attempting to dump core in …」
info 通常信息 "Server seems busy, (you may need to increase StartServers, or
debug 調試級消息 「Opening config file …」
  • 訪問日誌

    1. 參考幫助
      http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

    2. 定義日誌格式:LogFormat format strings

      1. combined格式
              
              
              
              
        • 1
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
      2. common格式
              
              
              
              
        • 1
        LogFormat "%h %l %u %t \"%r\" %>s %b"
      3. 符號描述
  • 符號 描述
    %h 客戶端IP地址
    %l 遠程用戶,啓用mod_ident纔有效,一般爲減號「-」
    %u 驗證(basic,digest)遠程用戶,非登陸訪問時,爲一個減號「-」
    %t 服務器收到請求時的時間,格式爲[18/Sep/2011:19:18:28 -0400]
    %r First line of request,即表示請求報文的首行;記錄了這次請求的「方法」,「URL」以及協議版本
    %>s 響應狀態碼
    %b 響應報文的大小,單位是字節;不包括響應報文http首部
    %{Referer}i 請求報文中首部「referer」的值;即從哪一個頁面中的超連接跳轉至當前頁面的,用於分析是否鏈接被盜用,是否由合做網站跳轉過來
    %{User-Agent}i 請求報文中首部「User-Agent」的值;即發出請求的應用程序,用戶使用的爲那種瀏覽器
  • 在配置文件中定義使用那種日誌格式
    CustomLog logs/access_log combined

  • 修改日誌時間格式
    格式爲%{format}t,設置幫助爲man 3 strftime
    例如:%{%Y-%m-%d %H:%M:%S}t 輸出格式爲[2018-09-30 09:18:32]
    配置文件修改內容

      
      
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    [root@hai7-6 ~]$vim /etc/httpd/conf.d/test.conf `將訪問日子命名爲molilog,時間格式定義爲%{%Y-%m-%d %H:%M:%S}t` LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" molilog `應用定義的日誌格式` CustomLog "logs/access_log" molilog
  • 設定默認字符集
    中文字符集:GBK, GB2312(簡體字), GB18030

    1. 配置命令
      AddDefaultCharset
    2. 示例
          
          
          
          
      • 1
      AddDefaultCharset GB2312
  • 定義路徑別名
    將DocumentRoo以外的目錄,顯示到網站上

    1. 配置指令
      Alias /URL/ "/PATH/"
    2. 示例:
      在DocumentRoot以外的其餘目錄,建立一個文件,使其顯示在網站上,例如服務器的ip地址爲192.168.50.107
          
          
          
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      1. '在/data下建一個目錄app,在app下建立一個index.html文件' [root@hai7-6 ~]$mkdir /data/app [root@hai7-6 ~]$echo shanwuyu >/data/app/index.hmtl 2. '編輯http的子配置文件' [root@hai7-6 ~]$vim /etc/httpd/conf.d/test.conf alias /stu /data/app <==指定/data/app在http中的別名爲/stu <Directory "/data/app"> <==受權目錄權限,否則不能訪問 Require all granted </Directory> 3. 重啓服務,在頁面訪問'192.168.50.107/stu',能夠顯示/data/app下內容
  • 基於用戶的訪問控制

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

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

    3. 認證方式兩種:
      basic:明文
      digest:消息摘要認證,兼容性差

    4. 安全域
      須要用戶認證後方能訪問的路徑;應該經過名稱對其進行標識,以便於告知用戶認證的緣由

    5. 用戶的帳號和密碼
      虛擬帳號:僅用於訪問某服務時用到的認證標識
      帳號存儲:文本文件,SQL數據庫,ldap目錄存儲,nis等

    6. basic認證配置示例:

          
          
          
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      1. '定義安全域' <Directory "/path"> <==針對哪一個目錄須要驗證 Options None AllowOverride None AuthType Basic <==驗證方式 AuthName "String" <==驗證時但願彈出對話框,描述信息 AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE" <==用戶名帳戶密碼放在那裏 Require user username1 username2 ... <==訪問用戶是誰,從上面的文件中挑選 </Directory> 2. '定義能夠訪問用戶' Require valid-user <==容許帳號文件中的全部用戶登陸訪問
    7. 提供帳號和密碼存儲(文本文件)
      使用專用命令完成此類文件的建立及用戶管理

      1. 語法
        htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
      2. 選項
  • 選項 描述
    -c 自動建立文件,僅首次時使用,再次使用會覆蓋
    -p 明文密碼
    -d CRYPT格式加密,默認
    -m md5格式加密
    -s sha格式加密
    D 刪除指定用戶
    1. 示例
      建立用戶,指定存放在/data/passwd文件中
         
         
         
         
      • 1
      [root@hai7-6 app]$htpasswd -D /data/passwd a
      修改密碼,覆蓋現有帳戶便可,輸入兩次密碼
         
         
         
         
      • 1
      [root@hai7-6 app]$htpasswd /data/passwd b
  • 基於用戶的訪問控制示例
    方法一:在配置文件中定義認證範圍

      
      
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. '首先建立2個帳戶' [root@hai7-6 app]$htpasswd -c /data/passwd a [root@hai7-6 app]$htpasswd /data/passwd b 2. '查看生成的帳戶' [root@hai7-6 app]$cat /data/passwd a:$apr1$2JDhlL7o$PE7sXATzsNh9/uESJq31R. b:$apr1$Y/F5MLhN$Xx5g3DVPKLVgyi2AavWHT/ 3. '編輯配置文件定義訪問控制' [root@hai7-6 ~]$vim /etc/httpd/conf.d/test.conf <Directory /data/app> <==定義須要認證訪問的範圍 AuthType Basic <==認證方式 AuthName "key" <==提示用戶須要認證的描述語句 AuthUserFile "/data/passwd" <==用戶來源 Require user b <==定義可訪問用戶,用戶b能夠訪問 </Directory> [root@hai7-6 conf.d]$systemctl restart httpd

    方法2
    在須要認證的目錄下建.htaccess文件,將認證語法寫入此文件,而後在配置文件中受權.htaccess

      
      
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. '在須要認證的目錄下建 .htaccess文件,並添加認證機制' [root@hai7-6 app]$vim /data/app/.htaccess AuthType Basic AuthName "login right name" AuthUserFile "/data/passwd" Require user b 2. '在配置文件中受權目錄能夠運行設置' [root@hai7-6 ~]$vim /etc/httpd/conf.d/text.conf <Directory /data/app> Allowoverride authconfig <受權在 /data/app下的設置運行覆蓋生效 </Directory>
  • 基於組帳號進行認證

    1. 配置命令
      AuthGroupFile:定義組帳號所在路徑
      Require group:受權列表
    2. 定義安全域
          
          
          
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      <Directory "/path"> <==定義受權路徑 AuthType Basic <==認證類型 AuthName "String" <==認證描述信息 AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE" <==帳號列表文件 AuthGroupFile "/PATH/HTTPD_GROUP_FILE" <==分組信息文件 Require group grpname1 grpname2 ... <==受權列表 </Directory>
    3. 建立用戶帳號和組帳號文件
      組文件:每一行定義一個組
      GRP_NAME: username1 username2 …
    4. 示例
          
          
          
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      1. '配置文件配置項' <Directory /data/app> AuthType Basic <==認證類型 AuthName "secret dir" <==訪問目錄提示語 AuthUserFile "/data/passwd" <==用戶文件目錄 AuthGroupFile "/data/group" <==組文件目錄 Require group g1 <==受權g1用戶訪問 </Directory> 2. '建立組文件,帳號建立在基於用戶的訪問控制,這裏已有帳號a/b/c,分爲g1和g2組' [root@hai7-6 data]$cat > /data/group g1:a b g2:b c
  • 遠程客戶端和用戶驗證的控制

    1. 配置命令
      Satisfy ALL|Any
    2. 參數描述
      ALL :客戶機IP和用戶驗證都須要經過才能夠
      Any:客戶機IP和用戶驗證,有一個知足便可
    3. 示例,ip和用戶認證,知足一個便可
          
          
          
          
      • 1
      • 2
      • 3
      • 4
      Require valid-user Require all denied require ip 172.16.1.1 Satisfy Any
  • 實現用戶家目錄的http共享,只是共享其中的某個目錄
    基於模塊’mod_userdir.so’實現
    若是SELinux啓用須要添加: http_enable_homedirs

    1. 相關設置,2.2版本
          
          
          
          
      • 1
      • 2
      • 3
      • 4
      • 5
      [root@hai7-6 conf]$vim /etc/httpd/conf/httpd.conf <IfModule mod_userdir.c> #UserDir disabled UserDir public_html #指定共享目錄的名稱 </IfModule>
    2. 示例:2.4版本
      1. 創建一個測試用戶text,並切換身份
              
              
              
              
        • 1
        • 2
        [root@hai7-6 ~]$useradd test [root@hai7-6~]$su test
      2. 在其家目錄中創建一個用於http共享的文件夾
              
              
              
              
        • 1
        [test@hai7-6 ~]$mkdir public_html
      3. 在文件夾下建立一個index.html文件
              
              
              
              
        • 1
        [test@hai7-6 ~]$echo test homedir > public_html/index.html
      4. 確認依賴模塊是否加載
              
              
              
              
        • 1
        • 2
        [test@hai7-6 ~]$httpd -M | grep user userdir_module (shared) <==此模塊須要加載在內存中
      5. 修改配置文件,在2.4版本中,有獨立的配置文件etc/httpd/conf.d/userdir.conf
              
              
              
              
        • 1
        • 2
        • 3
        • 4
        '進入配置文件,找到以下項,將disabled註釋掉,public_html去掉註釋' [test@hai7-6 ~]$vim /etc/httpd/conf.d/userdir.conf #UserDir disabled UserDir public_html <==public_html此目錄名能夠修改,只要與家目錄下相同就能夠
      6. 要在網頁上顯示,就要要apache最少對目錄有執行權限
              
              
              
              
        • 1
        [test@hai7-6 ~]$setfacl -m u:apache:x /home/test
      7. 若是此目錄只想讓指定用戶查看,能夠配合身份認證,須要註釋掉衝突項
              
              
              
              
        • 1
        • 2
        [test@hai7-6 ~]$vim /etc/httpd/conf.d/userdir.conf AllowOverride FileInfo AuthConfig Limit Indexes <==註釋掉此行,而後配置認證
      8. 設置成功後在瀏覽器訪問(~表示家目錄下的test目錄)
        http://localhost/~test/
  • ServerSignature On | Off | EMail
    當客戶請求的網頁並不存在時,服務器將產生錯誤文檔,缺省狀況下因爲打開了 ServerSignature選項,錯誤文檔的最後一行將包含服務器的名字、Apache的版本等信息

    1. 配置命令
      ServerSignature
    2. 參數
      1. on
        顯示服務器的名字、Apache的版本等信息
      2. off
        默認值,不顯示服務器的名字、Apache的版本等信息
      3. Email
        將顯示ServerAdmin 的Email提示,在網頁上留下郵箱,供用戶聯繫
    3. 示例:設置爲on,會顯示的信息
      在這裏插入圖片描述
  • ServerType inetd | standalone
    設置獨立或非獨立服務,只適用於Unix平臺

    1. 配置命令
      ServerType inetd
    2. 參數
      1. standalone:獨立服務模式
      2. inetd:非獨立服務模式
  • status頁面
    httpd經過內部的處理器Handler在其內部經過模塊status_module來額外提供服務器狀態的頁面

    1. 配置命令
      SetHandler
    2. 參數
      server-status
    3. 示例
      1. 首先確認模塊是否已經加載
              
              
              
              
        • 1
        • 2
        [root@hai7-6 ~]$httpd -M |grep status status_module (shared)
        若是沒有加載須要在配置文件中加入以下配置
              
              
              
              
        • 1
        LoadModule status_module modules/mod_status.so
      2. 啓動模塊後,修改配置文件,加入status激活項
              
              
              
              
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        [root@hai7-6 ~]$vim /etc/httpd/conf.d/text.conf <Location /server-status> <==/server-status能夠自定義,訪問地址 SetHandler server-status <==激活內部的程序server-status Require all granted <==能夠設置訪問權限 </Location> ExtendedStatus On <==加入此項能夠顯示擴展信息,默認爲Off狀態
      3. 訪問網頁,會彈出如下信息
        http://localhost/server-status
              
              
              
              
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        Apache Server Status for 192.168.50.107 (via 192.168.50.107) Server Version: Apache/2.4.6 (CentOS) PHP/5.4.16 <==服務器版本 Server MPM: prefork <==正在使用的MPM類型 Server Built: Apr 20 2018 18:10:38 <==服務器構建時間 Current Time: Monday, 22-Oct-2018 20:38:13 CST <==當前系統時間 Restart Time: Monday, 22-Oct-2018 20:37:32 CST <==服務重啓時間 Parent Server Config. Generation: 1 <==父進程從新生成的版本號 Parent Server MPM Generation: 0 <==MPM版本 Server uptime: 40 seconds <==服務器正常運行時間 Server load: 1.41 1.04 0.55 <==1分鐘、5分鐘、15分鐘的隊列長度 Total accesses: 3 - Total Traffic: 5 kB <==accesses:訪問次數-Traffic訪問流量 CPU Usage: u0 s0 cu0 cs0 <==CPU利用率 .075 requests/sec - 128 B/second - 1706 B/request <==每秒接收的請求數,字節數每秒,每秒請求平均大小 1 requests currently being processed, 5 idle workers ___W__.......................................................... ................................................................ ................................................................ ................................................................ Scoreboard Key: "_" Waiting for Connection, "S" Starting up, "R" Reading Request, "_"表示運行中的空閒進程 , "S"表示正在啓動進程,"R"正在接收請求 "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup, "W"表示發送響應報文, "K"保持鏈接,等待讀取數據,"D"DNS域名查詢 "C" Closing connection, "L" Logging, "G" Gracefully finishing, "C"關閉鏈接,"L"記錄日誌中,"G"優雅的終止,意思是正常斷開 "I" Idle cleanup of worker, "." Open slot with no current process "I"清理空閒中的進程,"."能夠啓用的進程數
  • 虛擬主機
    基於一個主機,運行多個網站

    1. 實現方案:

      1. 基於ip
        爲每一個虛擬主機準備至少一個ip地址
      2. 基於port
        爲每一個虛擬主機使用至少一個獨立的port
      3. 基於FQDN
        爲每一個虛擬主機使用至少一個FQDN
    2. 注意事項
      通常虛擬機不要與main主機混用;所以,要使用虛擬主機,通常先禁用main主機
      禁用方法:註釋中心主機的DocumentRoot指令便可

    3. 虛擬主機的配置方法:

          
          
          
          
      • 1
      • 2
      • 3
      • 4
      <VirtualHost IP:PORT> ServerName FQDN DocumentRoot 「/path" </VirtualHost>
    4. 其它可用指令:
      ServerAlias:虛擬主機的別名;可屢次使用
      ErrorLog: 錯誤日誌
      CustomLog:訪問日誌
      <Directory 「/path"> </Directory>:受權

    5. 示例
      準備工做,設計運行三個網站web1 、web2 、web3
      分別爲其創建html目錄,並建立頁面文件

          
          
          
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      1. '創建目錄' [root@hai7-6 data]$mkdir /data/web{1,2,3} 2. '建立頁面文件' [root@hai7-6 data]$echo /data/web1 > /data/web1/index.html [root@hai7-6 data]$echo /data/web2 > /data/web2/index.html [root@hai7-6 data]$echo /data/web3 > /data/web3/index.html
      1. 基於端口的配置,規劃使用端口分別爲web1:8001,web2:8002,web3:8003
              
              
              
              
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        [root@hai7-6 data]$vim /etc/httpd/conf.d/text.conf listen 8001 <==配置監聽端口,3個端口都要設置 listen 8002 listen 8003 <virtualhost *:8001> <==定義虛擬主機,指定端口號,*表示全部ip documentroot /data/web1 <==指定頁面目錄 servername www.a.com <==訪問 </virtualhost> <==定義虛擬機結尾 <directory /data/web1> <==在2.4中,須要受權目錄 require all granted </directory>
      2. 基於IP的虛擬主機示例,須要的多個公網ip,成本高
              
              
              
              
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        <virtualhost 192.168.50.81:80> <==端口統一爲80,爲每一個網站分配一個ip地址 documentroot /data/web1 servername www.a.com </virtualhost> <directory /data/web1> require all granted </directory>
      3. 基於FQDN(主機頭)實現的虛擬主機
        dns解析ip地址爲同一個,指向的是三個域名,在用戶訪問不一樣域名時,請求報頭裏的HOST會讀取域名,找到配置文件中的ServerName,返回相應頁面;
        若是輸入Ip地址訪問,默認返回配置文件中排在前面的。當同一個網站有多個域名時,可使用別名實現,在DNS解析中將域名添加上便可
        httpd2.2版本須要增長:NameVirtualHost *:80
              
              
              
              
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        <virtualhost *:80> <==設置虛擬機全部Ip能夠訪問80端口 documentroot /data/web2 <==網頁目錄地址 servername www.b.com <==host,指定域名 ServerAlias a.com *.a.com <==支持別名,當一個網站有多個域名時使用 <directory /data/web2> <==受權目錄 require all granted </directory> ErrorLog "logs/b_error_log" <==建獨立的錯誤日誌 CustomLog "logs/b_access_log" combined <==建獨立的訪問日誌 </virtualhost>
  • </div>
    					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
                </div>
    相關文章
    相關標籤/搜索