Apache httpd服務
一、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:用戶,某些方案訪問資源時需要的用戶名
- 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 首部字段
- HTTP 首部字段包含的信息最為豐富。首部字段同時存在於請求和響應報文內,並涵蓋 HTTP 報文相關的內容信息。使用首部字段是為了給客服端和服務器端提供報文主體大小、所使用的語言、認證信息等內容;
- 首部字段結構HTTP 首部字段是由首部字段名和字段值構成的,中間用冒號“:”分隔;
- 字段值對應單個 HTTP 首部字段可以有多個值;
- 報文首部中出現了兩個或以上具有相同首部字段名的首部字段時,在規範內尚未明確,根據瀏覽器內部處理邏輯的不同,優先處理的順序可能不同,結果可能並不一致。
- 通用首部:請求報文和響應報文兩方都會使用的首部
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:最後一次修改的時間
- 擴展首部
3、Cookie
? 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請求處理過程
- 解析請求:客戶通過FQDN訪問,先由DNS服務器解析為IP地址,返回給客戶端目標IP地址
- 建立連接:接收連接請求
- 接收請求:接收客戶端請求報文中對某資源的一次請求的過程
- 處理請求:服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理
- 獲取資源:服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源
- 構建響應報文:一旦Web服務器識別除了資源,就執行請求方法中描述的動作,並返回響應報文。響應報文中 包含有響應狀態碼、響應首部,如果生成了響應主體的話,還包括響應主體
- 發送響應報文:Web服務器通過連接發送數據時也會面臨與接收數據一樣的問題。服務器可能有很多條到各個客戶端的連接,有些是空閑的,有些在向服務器發送數據,還有一些在向客戶端回送響應數據。服務器要記錄連接的狀態,還要特別註意對持久連接的處理。對非持久連接而言,服務器應該在發送了整條報文之後,關閉自己這一端的連接。對持久連接來說,連接可能仍保持打開狀態,在這種情況下,服務器要正確地計算Content-Length首部,不然客戶端就無法知道響應什麽時候結束了
- 記錄日誌:最後,當事務結束時,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:81
和http://192.168.0.7:82
和http://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.11
和192.168.0.12
和192.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服務