1. 程式人生 > >Apache httpd服務

Apache httpd服務

sig delet 獨立 系統 active 計算機 curl 加載 int

一、Web相關概念簡述

  • http:Hyper Text Transfer Protocol 超文本傳輸協議
    • 持久連接:persistent connection 即TCP連接默認在一定時間內不關閉,可以被多個請求復用,在特點場景下可以有效降低資源消耗
    • 管道機制:pipelining 即在同一個TCP連接裏,客戶端可以同時發送多個請求,進一步改進了HTTP協議的效率
    • 復用的連接:交替傳送請求和響應報文
    • 頭信息壓縮機制:header compression 頭信息使用gzip或compress壓縮後再發送
    • HTTP常用請求方式:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
  • html:Hyper Text Markup Language 超文本標記語言
  • CSS:Cascading Style Sheet 層疊樣式表
  • js:javascript
  • MIME:Multipurpose Internet Mail Extensions 多用途互聯網郵件擴展
  • 靜態文件:無需服務端做出額外處理,直接返回給客戶端所請求的頁面,如文件後綴:.jpg, .html, .txt, .js,.css, .mp3, .avi 等
  • 動態文件:服務端執行程序,返回執行的結果,如文件後綴:.asp, .php, .jsp
  • Web資源:web resource 一個網頁由多個資源構成,打開一個頁面,會有多個資源展示出來,但是每個資源都要單獨請求。因此,一個“Web 頁面”通常並不是單個資源,而是一組資源的集合
  • URI: Uniform Resource Identifier 統一資源標識,分為URL和URN
    • URN: Uniform Resource Naming 統一資源命名
    • URL: Uniform Resorce Locator,統一資源定位符,用於描述某服務器某特定資源位置
    • <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
      - schame:方案,訪問服務器以獲取資源時要使用哪種協議
      - user:用戶,某些方案訪問資源時需要的用戶名
      - password:密碼,用戶對應的密碼,中間用:分隔
      - Host:主機,資源宿主服務器的主機名或IP地址
      - port:端口,資源宿主服務器正在監聽的端口號,很多方案有默認端口號
      - path:路徑,服務器資源的本地名,由一個/將其與前面的URL組件分隔
      - params:參數,指定輸入的參數,參數為名/值對,多個參數,用;分隔
      - query:查詢,傳遞參數給程序,如數據庫,用?分隔,多個查詢用&分隔
      - frag:片段,一小片或一部分資源的名字,此組件在客戶端使用,用#分隔
  • IP(獨立IP):即Internet Protocol,指獨立IP數。一天內來自相同客戶機IP地址只計算一次,記錄遠程客戶機IP地址的計算機訪問網站的次數,是衡量網站流量的重要指標
  • pv:page view 即頁面瀏覽量,或點擊量,通常是衡量一個網絡新聞頻道或網站甚至一條網絡新聞的主要指標。PV值的計算:當一個訪問者訪問網站的時候,記錄他所訪問的頁面和對應的IP,然後確定這個IP今天訪問了這個頁面沒有。如果你的網站到了23點,單純IP有60萬條的話,每個訪問者平均訪問了3個頁面,那麽PV表的記錄就要有180(60×3)萬條。
  • uv:user view 指訪問某個站點或點擊某條新聞的不同IP地址的人數。在同一天內,UV只記錄第一次進入網站的具有獨立IP的訪問者,在同一天內再次訪問該網站則不計數。獨立IP訪問者提供了一定時間內不同觀眾數量的統計指標,而沒有反應出網站的全面活動。
  • QPS:request per second,每秒請求數;QPS = PV * 頁?衍?連接次數 / 統計時間(86400),2億pv的網站活動連接大約100W左右,qps大約1-2W
  • active connetion:活動連接數,在負載均衡層上看連接數
  • 並發連接數 = QPS * HTTP平均響應時間
  • 峰值時間:每天80%的訪問集中在20%的時間裏,這20%時間為峰值時間
  • 峰值時間每秒請求數 = ( 總PV數 * 頁?衍?連接次數 * 80% ) / ( 每天秒數 * 20% )

  • 單進程I/O模型:啟動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應
  • 多進程I/O模型:並行啟動多個進程,每個進程響應一個連接請求
  • 復用I/O結構:啟動一個進程,同時響應N個連接請求
  • 復用的多進程I/O模型:啟動M個進程,每個進程響應N個連接請求,同時接收M*N個請求

技術分享圖片

二、HTTP協議

? HTTP協議的版本有:http/0.9, http/1.0, http/1.1, http/2.0;HTTP協議是無狀態的,服務器無法持續追蹤客戶端的來源,解決HTTP協議無狀態的方法有Cookie和Session;一次訪問的過程請求(request)和響應(response)為HTTP事務

  • httpq請求報文

技術分享圖片

  • http響應報文

技術分享圖片

1、http報文

  • request報文
<method> <request-URL> <version> 
<headers> 
<entity-body> 
  • response報文
<version> <status> <reason-phrase> 
<headers> 
<entity-body> 

method: 請求方法,標明客戶端希望服務器對資源執行的動作

GET:從服務器獲取一個資源
HEAD:只從服務器獲取文檔的響應首部
POST:向服務器輸入數據,通常會再由網關程序繼續處理
PUT:將請求的主體部分存儲在服務器中,如上傳文件
DELETE:請求刪除服務器上指定的文檔
TRACE:追蹤請求到達服務器中間經過的代理服務器
OPTIONS:請求服務器返回對指定資源支持使用的請求方法

status:標記請求處理過程中發生的情況,如200,301, 302, 404, 502

200: 成功,請求數據通過響應報文的entity-body部分發送;OK
301: 請求的URL指向的資源已經被刪除;但在響應報文中通過首部Location指明了資源現在所處的新位置;Moved Permanently
302: 響應報文Location指明資源臨時新位置;Moved Temporarily
304: 客戶端發出了條件式請求,但服務器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端;Not Modified
401: 需要輸入賬號和密碼認證方能訪問資源;Unauthorized
403: 請求被禁止;Forbidden
404: 服務器無法找到客戶端請求的資源;Not Found
500: 服務器內部錯誤;Internal Server Error
502: 代理服務器從後端服務器收到了一條偽響應,如無法連接到網關;Bad Gateway
503: 服務不可用,臨時服務器維護或過載,服務器無法處理請求
504: 網關超時

reason-phrase:狀態碼所標記的狀態的簡要描述

headers:每個請求或響應報文可包含任意個首部;每個首部都有首部名稱,後面跟一個冒號,而後跟一個可選空格,接著是一個值

entity-body:請求時附加的數據或響應時附加的數據

2、HTTP 首部字段

  1. HTTP 首部字段包含的信息最為豐富。首部字段同時存在於請求和響應報文內,並涵蓋 HTTP 報文相關的內容信息。使用首部字段是為了給客服端和服務器端提供報文主體大小、所使用的語言、認證信息等內容;
  2. 首部字段結構HTTP 首部字段是由首部字段名和字段值構成的,中間用冒號“:”分隔;
  3. 字段值對應單個 HTTP 首部字段可以有多個值;
  4. 報文首部中出現了兩個或以上具有相同首部字段名的首部字段時,在規範內尚未明確,根據瀏覽器內部處理邏輯的不同,優先處理的順序可能不同,結果可能並不一致。
  • 通用首部:請求報文和響應報文兩方都會使用的首部

Date:報文的創建時間
Connection:連接狀態,如keep-alive, close
Via:顯示報文經過的中間節點(代理,網關)
Cache-Control:控制緩存,如緩存時長
MIME-Version:發送端使用的MIME版本
Warning:錯誤通知

  • 請求首部:從客戶端向服務器端發送請求報文時使用的首部。補充了請求的附加內容、客戶端信息、請求內容相關優先級等信息

請求首部:
Accept:通知服務器自己可接受的媒體類型
Accept-Charset: 客戶端可接受的字符集
Accept-Encoding:客戶端可接受編碼格式,如gzip
Accept-Language:客戶端可接受的語言
Client-IP: 請求的客戶端IP
Host: 請求的服務器名稱和端口號
Referer:跳轉至當前URI的前一個URL
User-Agent:客戶端代理,瀏覽器版本

條件式請求首部:
Expect:允許客戶端列出某請求所要求的服務器行為
If-Modified-Since:自從指定的時間之後,請求的資源是否發生過修改
If-Unmodified-Since:與上面相反
If-None-Match:本地緩存中存儲的文檔的ETag標簽是否與服務器文檔的Etag不匹配
If-Match:與上面相反

安全請求首部:
Authorization:向服務器發送認證信息,如賬號和密碼
Cookie:客戶端向服務器發送cookie
Cookie2:用於說明請求端支持的cookie版本

代理請求首部:
Proxy-Authorization:向代理服務器認證

  • 響應首部:從服務器端向客戶端返回響應報文時使用的首部。補充了響應的附加內容,也會要求客戶端附加額外的內容信息

信息性:
Age:從最初創建開始,響應持續時長
Server:服務器程序軟件名稱和版本
協商首部:某資源有多種表示方法時使用
Accept-Ranges:服務器可接受的請求範圍類型
Vary:服務器查看的其它首部列表
安全響應首部:
Set-Cookie:向客戶端設置cookie
Set-Cookie2: 以上面相似
WWW-Authenticate:來自服務器對客戶端的質詢列表

  • 實體首部:針對請求報文和響應報文的實體部分使用的首部。補充了資源內
    容更新時間等與實體有關的的信息

? Allow: 列出對此資源實體可使用的請求方法
Location:告訴客戶端真正的實體位於何處
Content-Encoding:對主體執行的編碼
Content-Language:理解主體時最適合的語言
Content-Length: 主體的長度
Content-Location: 實體真正所處位置
Content-Type:主體的對象類型,如text
緩存相關:
ETag:實體的擴展標簽
Expires:實體的過期時間
Last-Modified:最後一次修改的時間

  • 擴展首部

? HTTP 是一種無狀態協議。協議自身不對請求和響應之間的通信狀態進行保存。也就是說在 HTTP 這個級別,協議對於發送過的請求或響應都不做持久化處理。這是為了更快地處理大量事務,確保協議的可伸縮性,而特意把 HTTP 協議設計成如此簡單的。可是隨著 Web 的不斷發展,很多業務都需要對通信狀態進行保存。於是引入了 Cookie 技術。使用 Cookie 的狀態管理Cookie 技術通過在請求和響應報文中寫入 Cookie 信息來控制客戶端的狀態。Cookie 會根據從服務器端發送的響應報文內的一個叫做 Set-Cookie 的首部字段信息,通知客戶端保存Cookie。當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入 Cookie 值後發送出去。服務器端發現客戶端發送過來的 Cookie 後,會去檢查究竟是從哪一個客戶端發來的連接請求,然後對比服務器上的記錄,最後得到之前的狀態信息

Set-cookie首部字段示例:

~]# curl -v pan.baidu.com
Set-Cookie: BAIDUID=0D82F2DA4E71EFDE069D8C6BC7D7F22E:FG=1; expires=Fri, 21-Jun-19 03:48:53 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1

NAME=VALUE 賦予 Cookie 的名稱和其值,此為必需項
expires=DATE Cookie 的有效期,若不明確指定則默認為瀏覽器關閉前為止
path=PATH 將服務器上的文件目錄作為Cookie的適用對象,若不指定則默認為文檔所在的文件目錄
domain=域名 作為 Cookie 適用對象的域名,若不指定則默認為創建Cookie的服務器的域名
Secure 僅在 HTTPS 安全通信時才會發送 Cookie
HttpOnly 加以限制使 Cookie 不能被 JavaScript 腳本訪問

示例:查看cookie

~]# yum install httpd php -y
~]# vim /var/www/html/setcookie.php
<?php
setcookie("title","hello world")
?>
~]# vim /var/www/html/index.php
<?php
echo $_COOKIE["title"];
var_dump($_COOKIE);
?>
~]# systemctl start httpd

先訪問:http://192.168.0.7/setcookie.php

再訪問:http://192.168.0.7/index.php

顯示:hello worldarray(1) { ["title"]=> string(11) "hello world" }則說明cookie已經生效

三、一次完整的http請求處理過程

  1. 解析請求:客戶通過FQDN訪問,先由DNS服務器解析為IP地址,返回給客戶端目標IP地址
  2. 建立連接:接收連接請求
  3. 接收請求:接收客戶端請求報文中對某資源的一次請求的過程
  4. 處理請求:服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理
  5. 獲取資源:服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源
  6. 構建響應報文:一旦Web服務器識別除了資源,就執行請求方法中描述的動作,並返回響應報文。響應報文中 包含有響應狀態碼、響應首部,如果生成了響應主體的話,還包括響應主體
  7. 發送響應報文:Web服務器通過連接發送數據時也會面臨與接收數據一樣的問題。服務器可能有很多條到各個客戶端的連接,有些是空閑的,有些在向服務器發送數據,還有一些在向客戶端回送響應數據。服務器要記錄連接的狀態,還要特別註意對持久連接的處理。對非持久連接而言,服務器應該在發送了整條報文之後,關閉自己這一端的連接。對持久連接來說,連接可能仍保持打開狀態,在這種情況下,服務器要正確地計算Content-Length首部,不然客戶端就無法知道響應什麽時候結束了
  8. 記錄日誌:最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務

四、Apache HTTP Server介紹

? 簡稱Apache,是Apache軟件基金會的一個開放源代碼的網頁服務器軟件,可以在大多數計算機操作系統中運行。由於其跨平臺和安全性,被廣泛使用,是最流行的Web服務器軟件之一。它快速、可靠並且可通過簡單的API擴充,將Perl/Python等解釋器編譯到服務器中。

特性:

  • 高度模塊化:core + modules
  • DSO: Dynamic Shared Object 動態加/卸載
  • MPM:multi-processing module多路處理模塊
  • prefork:多進程I/O模型,每個進程響應一個請求,默認模型
    • 一個主進程:生成和回收n個子進程,創建套接字,不響應請求
    • 多個子進程:工作work進程,每個子進程處理一個請求;系統初始時,預先生成多個空閑進程,等待請求,最大不超過1024個
  • worker:復用的多進程I/O模型,多進程多線程,IIS使用此模型
    • 一個主進程:生成m個子進程,每個子進程負責生個n個線程,每個線程響應一個請求,並發響應請求:m*n
  • event:事件驅動模型(worker模型的變種)
    • 一個主進程:生成m個子進程,每個進程直接響應n個請求,並發響應請求:m*n,有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又允許釋放。這樣增強了高並發場景下的請求處理能力
  • 虛擬主機:IP,Port,FQDN
  • CGI:Common Gateway Interface,通用網關接口
  • 反向代理
  • 支持第三方模塊

五、httpd的安裝

1、yum管理器安裝

安裝:yum -y install httpd

配置文件:/etc/httpd/conf/httpd.conf/etc/httpd/conf.d/*.conf 下所有以.conf結尾的文件

服務控制:systemctl start|restart|stop|reload httpd

站點網頁文檔根目錄:/var/www/html

模塊文件路徑:/usr/lib64/httpd/modules

主程序文件:/usr/sbin/httpd

主進程文件:/run/httpd/httpd.pid

日誌文件目錄:/var/log/httpd

離線幫助文檔包:yum -y install httpd-manual ,重啟服務後在瀏覽器中輸入 http://IP/manual/ 即可使用

2、編譯安裝

系統環境:CentOS6.9

arp版本:1.6 # wget http://mirror.bit.edu.cn/apache//apr/apr-1.6.3.tar.gz

arp-util版本:1.6 # wget http://mirror.bit.edu.cn/apache//apr/apr-util-1.6.1.tar.gz

httpd版本:2.4 # wget http://mirrors.shu.edu.cn/apache//httpd/httpd-2.4.33.tar.gz

? 1)安裝需要的包

~]# yum -y groupinstall "Development tools"
~]# yum -y install openssl-devel expat-devel pcre-devel

? 2)配置編譯安裝

~]# tar xf apr-1.6.3.tar.gz
~]# tar xf apr-util-1.6.1.tar.gz
~]# tar xf httpd-2.4.33.tar.gz
~]# cp -a apr-util-1.6.1 httpd-2.4.33/srclib/apr-util
~]# cp -a apr-1.6.3 httpd-2.4.33/srclib/apr
~]# cd httpd-2.4.33
httpd-2.4.33]# ./configure --prefix=/data/httpd24 > --enable-so > --enable-ssl > --enable-cgi > --enable-rewrite > --with-zlib > --with-pcre  > --with-included-apr > --enable-modules=most > --enable-mpms-shared=all > --with-mpm=prefork
httpd-2.4.33]# make -j 4 && make install

? 3)配置環境變量

~]# echo 'export PATH=/data/httpd24/bin:$PATH' > /etc/profile.d/httpd.sh
~]# echo 'MANPATH /data/httpd24/man' >> /etc/man.config

? 4)啟動服務並測試

~]# apachectl start

六、httpd 2.4 常用配置

yum安裝後默認配置文件

~]# cat /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
ServerName www.example.com:80
<Directory />
    AllowOverride none
    Require all denied
</Directory>
DocumentRoot "/var/www/html"
<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf

配置格式:directive value;directive 不區分字符大小寫;value 為路徑時,是否區分大小寫,取決於文件系統。

1、顯示服務器版本信息

ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full

ServerTokens Prod  #建議關閉顯示服務器版本號

2、修改監聽的IP和Port

Listen [ip:]port 省略ip表示本機所有IP都監聽,至少要有一個監聽,此指令可重復出現多次

Listen 80

3、持久連接

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

KeepAlive On  #啟用長連接功能
KeepAliveTimeout 15  #保持連接15秒
MaxKeepAliveRequests 100  #斷開條件

4、MPM多路處理模塊

~]# httpd -M |grep mpm
 mpm_prefork_module (shared)  #默認prefork處理模式
~]# 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

5、DSO加載動態模塊配置

配置指定實現模塊加載格式: LoadModule <mod_name> <mod_path>

示例:

~]# vim /etc/httpd/conf.modules.d/00-base.conf
LoadModule auth_basic_module modules/mod_auth_basic.so

6、定義‘Main‘ Server的文檔頁面路徑

DocumentRoot "/path" 指向的路徑為URL路徑的起始位置

DocumentRoot "/var/www/html"
<Directory "/var/www/html">
    Require all granted  #授權可以訪問
</Directory>

7、定義站點主頁面

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

8、站點訪問控制常見機制

? 基於文件系統路徑:

<Directory  “/path">  #控制文件夾
    ...
</Directory>

<File  “/path/file”>  #控制指定文件
    ...
</File>

<FileMatch  "PATTERN">  #支持正則表達式
    ...
</FileMatch>

? 基於URL路徑:

<Location  "">
    ...
</Location>

<LocationMatch "PATTERN">
    ...
</LocationMatch>

1)Options [+|-]option [[+|-]option] ... :後跟1個或多個以空白字符分隔的選項列表在選項前的 +,- 表示增加或刪除指定選項,默認Options FollowSymlinks

  • Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶
  • FollowSymLinks:允許訪問符號鏈接文件所指向的源文件
  • All:全部允許
  • None:全部禁用

2)AllowOverride All|None|directive-type [directive-type] ... :與訪問控制相關的哪些指令可以放在指定目錄下的.htaccess(由AccessFileName指定)文件中,覆蓋之前的配置指令;只對<directory>語句有效

  • All: 所有指令都有效
  • None:.htaccess 文件無效
  • AuthConfig Indexes 除了AuthConfig 和Indexes的其它指令都無法覆蓋

3)Order Deny,Allow :定義生效次序;寫在後面的表示默認法則,2.4版本不再支持

  • Allow from和Deny from:定義客戶端地址,拒絕或允許

例:拒絕訪問站點下所有以.conf結尾的文件

DocumentRoot "/data/website"
<Directory "/data/website">
    Require all granted
</Directory>
<Files "*.conf">
    Require all denied
</Files>

? 例:允許訪問符號鏈接文件所指向的源文件,但是不允許返回索引列表給用戶

<Directory "/data/website">
    Require all granted
    Options -Indexes +FollowSymLinks
</Directory>

9、<Directory>中“基於源地址”實現訪問控制

? 不允許指定的主機訪問

DocumentRoot "/data/website"
<Directory "/data/website">
    <RequireALL>
        Require all granted
        Require not ip 192.168.0.2  #不允許0.2的主機訪問
    </RequireALL>
</Directory>

? 只允許指定主機訪問

DocumentRoot "/data/website"
<Directory "/data/website">
    <RequireAny>
        Require all denied
        Require ip 192.168.0.2  #只允許0.2主機訪問
    </RequireAny>
</Directory>

10、日誌設定

~]# vim /etc/httpd/conf/httpd.conf
ErrorLog "logs/error_log"  #錯誤日誌記錄文件
LogLevel warn  #默認warn級別的錯誤記錄
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined  #默認日誌記錄方式
</IfModule>

錯誤日誌的 LogLevel 可選:debug, info, notice, warn, error,crit, alert, emerg

訪問日誌:

  • %h 客戶端IP地址
  • %l 遠程用戶,啟用mod_ident才有效,通常為減號“-”
  • %u 驗證(basic,digest)遠程用戶,非登錄訪問時,為一個減號“-”
  • %t 服務器收到請求時的時間
  • %r First line of request,即表示請求報文的首行;記錄了此次請求的“方法”,“URL”以及協議版本
  • %>s 響應狀態碼
  • %b 響應報文的大小,單位是字節;不包括響應報文http首部
  • %{Referer}i 請求報文中首部“referer”的值;即從哪個頁面中的超鏈接跳轉至當前頁面的
  • %{User-Agent}i 請求報文中首部“User-Agent”的值;即發出請求的應用程序

建議:自定義日誌記錄格式

<IfModule log_config_module>
    LogFormat "%h %l %u %{%F %T}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" custlog
    CustomLog "logs/access_log" custlog
</IfModule>

11、設定默認字符集

AddDefaultCharset utf-8  #設置默認字符集為utf-8,默認為AddDefaultCharset Off
<Directory "/data/website">
    Require all granted
    AddDefaultCharset utf-8
</Directory>

12、定義路徑別名

格式: Alias /URL/ "/PATH/"

Alias /web2 /data/website2
<Directory "/data/website2">
    Require all granted
</Directory>

訪問:http://192.168.0.7/web2 則是訪問/data/website 這個目錄下的站點

13、基於用戶的訪問控制

允許賬號文件中的所有用戶登錄訪問:Require valid-user

例:基於單用戶認證

? 1)定義安全域

Alias /admin "/data/admin"
<Directory "/data/admin">
    AuthType Basic
    AuthName "please input your user and password!"
    AuthUserFile "conf.d/.htuser"
    Require user admin
</Directory>

? 2)提供賬號和密碼存儲(文本文件)

~]# htpasswd -mc /etc/httpd/conf.d/.htuser admin
~]# cat /etc/httpd/conf.d/.htuser
admin:$apr1$Yfglmncl$BC1hebCpPjn1Sn.azt/Zu.
~]# systemctl restart httpd

? 3)測試訪問 :http://192.168.0.7/admin/,輸入用戶名密碼即可訪問

例:基於組賬號進行認證

1)定義安全域

Alias /admin "/data/admin"
<Directory "/data/admin">
    AuthType Basic
    AuthName "please input your user and password!"
    AuthUserFile "conf.d/.htuser"
    AuthGroupFile "conf.d/.htgroup"
    Require group gadmin gadmin2
</Directory>

2)提供賬號和密碼存儲(文本文件)

~]# htpasswd -c /etc/httpd/conf.d/.htuser tom
~]# htpasswd /etc/httpd/conf.d/.htuser jerry
~]# htpasswd /etc/httpd/conf.d/.htuser maria
~]# echo 'gadmin: tom jerry' > /etc/httpd/conf.d/.htgroup
~]# echo 'gadmin2: tom maria' >> /etc/httpd/conf.d/.htgroup

3)測試訪問 :http://192.168.0.7/admin/,輸入用戶名密碼即可訪問

14、基於模塊mod_userdir.so實現用戶家目錄的http共享

~]# vim /etc/httpd/conf.d/userdir.conf
<IfModule mod_userdir.c>
    #UserDir disabled
    UserDir public_html
</IfModule>
<Directory "/home/user1/public_html">
    AuthType Basic
    AuthName "user1 home dir"
    AuthUserFile "conf.d/.htuser"
    Require user user1
</Directory>
~]# htpasswd -c /etc/httpd/conf.d/.htuser user1
~]# systemctl restart httpd
~]# su -user1
~]$ mkdir public_html
~]$ echo "user1 home dir" > public_html/index.html
~]$ setfacl -m u:apache:x /home/user1/

訪問:http://192.168.0.7/~user1/ 站點,輸入密碼即可登錄

15、ServerSignature On | Off | EMail

? 當客戶請求的網頁並不存在時,服務器將產生錯誤文檔,如果於打開了ServerSignature選項,錯誤文檔的最後一行將包含服務器的名字、Apache的版本等信息;如果不對外顯示這些信息,就可以將這個參數設置為Off;設置為Email,將顯示ServerAdmin 的Email提示;2.4版本默認值關閉,2.2版本默認開啟

16、status頁面

LoadModule status_module modules/mod_status.so 確認此模塊已加載

httpd]# vim conf.d/myhttp.conf
<Location "/status">
    SetHandler server-status
    Require all granted
</Location>
~]# systemctl restart httpd

訪問http://192.168.0.7/status查看服務器狀態信息

  • "**_**" Waiting for Connection 等待的連接
  • "S" Starting up
  • "R" Reading Request
  • "W" Sending Reply 有回應的連接
  • "K" Keepalive (read)
  • "D" DNS Lookup
  • "C" Closing connection
  • "L" Logging
  • "G" Gracefully finishing
  • "I" Idle cleanup of worker
  • "." Open slot with no current process 空閑sock個數

17、虛擬主機

註意:一般虛擬機不要與main主機混用;因此,要使用虛擬主機,一般先禁用main主機;註釋中心主機的DocumentRoot指令即可。

2.4版本基於FQDN的虛擬主機不再需要NameVirutalHost指令

data]# mkdir website{1..3}
data]# echo '<h1>website 1</h1>' > website1/index.html
data]# echo '<h1>website 2</h1>' > website2/index.html
data]# echo '<h1>website 3</h1>' > website3/index.html
~]# vim /etc/httpd/conf/httpd.conf
#Listen 80
#DocumentRoot "/var/www/html"

三種實現方案:

  • 基於PORT:為每個虛擬主機使用至少一個獨立的PORT
~]# vim /etc/httpd/conf.d/virtualhost.conf
Listen 81
Listen 82
Listen 83
<Directory "/data">
    Require all granted
</Directory>
<VirtualHost *:81>
    DocumentRoot "/data/website1"
    ServerName www.web1.com
    ErrorLog "logs/web1_error_log"
    TransferLog "logs/web1_access_log"
</VirtualHost>
<VirtualHost *:82>
    DocumentRoot "/data/website2"
    ServerName www.web2.com
    ErrorLog "logs/web2_error_log"
    TransferLog "logs/web2_access_log"
</VirtualHost>
<VirtualHost *:83>
    DocumentRoot "/data/website3"
    ServerName www.web3.com
    ErrorLog "logs/web3_error_log"
    TransferLog "logs/web3_access_log"
</VirtualHost>
~]# systemctl restart httpd

分別訪問:http://192.168.0.7:81http://192.168.0.7:82http://192.168.0.7:83

  • 基於IP:為每個虛擬主機準備至少一個IP地址
~]# ip a a 192.168.0.11/24 dev eth0
~]# ip a a 192.168.0.12/24 dev eth0 
~]# ip a a 192.168.0.13/24 dev eth0 
~]# vim /etc/httpd/conf.d/virtualhost.conf
Listen 80
<Directory "/data">
    Require all granted
</Directory>
<VirtualHost 192.168.0.11:80>
    DocumentRoot "/data/website1"
    ServerName www.web1.com
    ErrorLog "logs/web1_error_log"
    TransferLog "logs/web1_access_log"
</VirtualHost>
<VirtualHost 192.168.0.12:80>
    DocumentRoot "/data/website2"
    ServerName www.web2.com
    ErrorLog "logs/web2_error_log"
    TransferLog "logs/web2_access_log"
</VirtualHost>
<VirtualHost 192.168.0.13:80>
    DocumentRoot "/data/website3"
    ServerName www.web3.com
    ErrorLog "logs/web3_error_log"
    TransferLog "logs/web3_access_log"
</VirtualHost>
~]# systemctl restart httpd

分別訪問:192.168.0.11192.168.0.12192.168.0.13

  • 基於FQDN:為每個虛擬主機使用至少一個FQDN
~]# vim /etc/httpd/conf.d/virtualhost.conf
Listen 80
<Directory "/data">
    Require all granted
</Directory>
<VirtualHost *:80>
    DocumentRoot "/data/website1"
    ServerName www.web1.com
    ErrorLog "logs/web1_error_log"
    TransferLog "logs/web1_access_log"
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot "/data/website2"
    ServerName news.web2.com
    ErrorLog "logs/web2_error_log"
    TransferLog "logs/web2_access_log"
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot "/data/website3"
    ServerName bbs.web3.com
    ErrorLog "logs/web3_error_log"
    TransferLog "logs/web3_access_log"
</VirtualHost>
~]# systemctl restart httpd

客戶端測試:

~]# vim /etc/hosts  添加以下內容
192.168.0.7 www.web1.com news.web2.com bbs.web3.com
~]# curl www.web1.com
~]# curl news.web2.com
~]# curl bbs.web3.com

18、使用mod_deflate模塊壓縮頁面優化傳輸速度

LoadModule deflate_module modules/mod_deflate.so 模塊默認已經加載

# httpd -M |grep deflate
 deflate_module (shared)
conf.d]# vim myhttpd.conf
# 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
DeflateCompressionLevel 9  #壓縮比為 9

19、啟用Sendfile功能

~]# vim /etc/httpd/conf/httpd.conf
EnableSendfile On

七、https的實現

? 1)CA服務器端,生成自簽證書

[root@ca ~]# cd /etc/pki/CA/
[root@ca CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
[root@ca CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
[root@ca CA]# touch index.txt
[root@ca CA]# echo 01 > serial

? 2)HTTP服務器端,生成簽署請求

[root@www ~]# mkdir /etc/httpd/conf.d/ssl
[root@www ~]# cd /etc/httpd/conf.d/ssl
[root@www ssl]# (umask 077; openssl genrsa -out httpd.key 1024)
[root@www ssl]# openssl req -new -key httpd.key -out httpd.csr
[root@www ssl]# scp httpd.csr 192.168.0.2:/etc/pki/CA/

? 3)CA服務器端,簽署

[root@ca CA]# openssl ca -in httpd.csr -out certs/httpd.crt -days 350
[root@ca CA]# scp certs/httpd.crt cacert.pem 192.168.0.7:/etc/httpd/conf.d/ssl/

? 4)HTTP服務器端,配置https

[root@www ssl]# ls -1
cacert.pem
httpd.crt
httpd.csr
httpd.key
[root@www ~]# yum install mod_ssl -y
[root@www ~]# vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key
SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem

測試訪問:https://192.168.0.7 ,導入根證書即可信任此網站

? 5)配置http重定向到https,將http請求轉發至https的URL:倆種實現方式,推薦使用HSTS

  • Redirect [status] URL-PATH URL
[root@www ~]# vim /etc/httpd/conf.d/myhttpd.conf
Redirect temp / https://192.168.0.7/
  • HSTS:HTTP Strict Transport Security

? 服務器端配置支持HSTS後,會在給瀏覽器返回的HTTP首部中攜帶HSTS字段。瀏覽器獲取到該信息後,會將所有HTTP訪問請求在內部做307跳轉到HTTPS。而無需任何網絡過程

HSTS preload list:Chrome瀏覽器中的HSTS預載入列表,在該列表中的網站,使用Chrome瀏覽器訪問時,會自動轉換成HTTPS。Firefox、Safari、Edge瀏覽器也會采用這個列表

[root@www ~]# vim /etc/httpd/conf.d/myhttpd.conf
Header always set Strict-Transport-Security "max-age=31536000"
RewriteEngine on
RewriteRule ^(/.*)$  https://%{HTTP_HOST}$1 [redirect=302]

測試訪問http://會自動跳轉到https://

八、http的反向代理功能

不推薦使用

啟用反向代理:

  • ProxyPass "/" "http://www.example.com/"
  • ProxyPassReverse "/" "http://www.example.com/"

特定URL反向代理:

  • ProxyPass "/images" "http://www.example.com/"
  • ProxyPassReverse "/images" "http://www.example.com/"
~]# vim /etc/httpd/conf.d/myhttpd.conf
ProxyPass "/"  "http://192.168.0.7/"
ProxyPassReverse "/"  "http://192.168.0.7/"

九、web相關工具

1、curl命令

? curl是基於URL語法在命令行方式下工作的文件傳輸工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等協議。curl支持HTTPS認證,並且支持HTTP的POST、PUT等方法, FTP上傳, kerberos認證,HTTP上傳,代理服務器,cookies,用戶名/密碼認證, 下載文件斷點續傳,上載文件斷點續傳, http代理服務器管道( proxy tunneling),還支持IPv6,socks5代理服務器,通過http代理服務器上傳文件到FTP服務器等,功能十分強大。

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

選項:

  • -A string 設置用戶代理(瀏覽器)發送給服務器
  • -e URL 偽裝來源網站
  • --cacert file 指定使用ca證書
  • -k 允許忽略證書進行 SSL 連接
  • --compressed 要求返回是壓縮的格式
  • -H 自定義首部信息傳遞給服務器
  • -i 顯示頁面內容,包括報文首部信息
  • -I 只顯示響應報文首部信息
  • -D file 將url的header信息存放在指定文件中
  • --basic 使用HTTP基本認證
  • -u user:password 設置服務器的用戶和密碼
  • -L 如果有3xx響應碼,重新發請求到新位置
  • -O 使用URL中默認的文件名保存文件到本地
  • -o file 將網絡文件保存為指定的文件中
  • --limit-rate 限制傳輸速度
  • -0 數字0,使用HTTP/1.0協議
  • -v 顯示詳細信息
  • -C 選項可對文件使用斷點續傳功能
  • -c 將url中cookie存放在指定文件中
  • -x proxyhost:port 指定代理服務器地址
  • -X COMMAND 向服務器發送指定請求方法
  • -U user:password 代理服務器用戶和密碼
  • -T 選項可將指定的本地文件上傳到FTP服務器上
  • -d 方式指定使用POST方式傳遞數據
  • -b name=data 從服務器響應set-cookie得到值,返回給服務器

2、htpasswd

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

用法:htpasswd [options] /PATH/HTTPD_PASSWD_FILE username

  • -c:自動創建文件,僅應該在文件不存在時使用
  • -p:明文密碼
  • -d:CRYPT格式加密,默認
  • -m:md5格式加密
  • -s: sha格式加密
  • -D:刪除指定用戶
# htpasswd -mc /etc/httpd/conf.d/.htuser admin

3、apachectl

httpd自帶的服務控制腳本,支持start、stop和restart等選項

4、rotatelogs:日誌滾動工具

5、ab命令

httpd的壓力測試工具,來自httpd-tools包

用法:ab [options] URL

  • -n:總請求數
  • -c:模擬並發數
  • -k:以持久連接模式測試

Apache httpd服務