1.資源請求
1.資源與事務
一個網頁中包含很多資源,這些資源包括動態資源和靜態資源,所謂靜態資源就是存儲在http服務器本地,不需要任何操作,http服務器可以直接提供給用戶,當用戶請求靜態資源時,http服務器訪問自己的存儲空間,將用戶請求的靜態資源直接發送給用戶。而所謂的動態資源,則是由服務器運行一段程序,將程序運行的結果發送給用戶。當用戶訪問網站頁面時,這些頁面每一個頁面都有真多資源,每一個資源都會被單獨請求,用戶請求資源,服務器將用戶請求的資源發送給用戶,每個資源的request和response組成了一個http事務。
1.資源請求過程
資源請求過程包含下面7步
1.建立連接:用戶請求建立連接,服務器迴應允許接收請求或者拒絕請求
2.接收請求:接收用戶對某一資源的特定請求
3.處理請求:對用戶的請求報文進行解析,獲得獲取用戶請求資源的方法
4.訪問資源
5.構建響應報文
6.發送響應報文
7.記錄日誌
2.請求報文與響應報文格式
無論是請求報文還是響應報文,都應該由3部分構成,分別是起始行,首部,主體,只是請求報文的主體可以爲空。
1.起始行
method: 請求方法,標明客戶端希望服務器對資源執行的動作
GET:從服務器獲取一個資源;
HEAD:只從服務器獲取文檔的響應首部;
POST:向服務器發送要處理的數據;
PUT:將請求的主體部分存儲在服務器上;
DELETE:請求刪除服務器上指定的文檔;
TRACE:追蹤請求到達服務器中間經過的代理服務器;
OPTIONS:請求服務器返回對指定資源支持使用的請求方法;
version:
HTTP/<major>.<minor>
status:
三位數字,如200,301, 302, 404, 502; 標記請求處理過程中發生的情況;
reason-phrase:
狀態碼所標記的狀態的簡要描述
2.首部
首部分爲下面四種:
通用首部:
Date: 報文的創建時間
Connection:連接狀態,如keep-alive, close
Via:顯示報文經過的中間節點
Cache-Control:控制緩存
Pragma:
請求首部:
Accept:通過服務器自己可接受的媒體類型;
Accept-Charset:
Accept-Encoding:接受編碼格式,如gzip
Accept-Language:接受的語言
Client-IP:
Host: 請求的服務器名稱和端口號
Referer:包含當前正在請求的資源的上一級資源;
User-Agent:客戶端代理
條件式請求首部:
Expect:
If-Modified-Since:自從指定的時間之後,請求的資源是否發生過修改;
If-Unmodified-Since:
If-None-Match:本地緩存中存儲的文檔的ETag標籤是否與服務器文檔的Etag不匹配;
If-Match:
安全請求首部:
Authorization:向服務器發送認證信息,如賬號和密碼;
Cookie: 客戶端向服務器發送cookie
Cookie2:
代理請求首部:
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:主體的對象類型
緩存相關:
ETag:實體的擴展標籤;
Expires:實體的過期時間;
Last-Modified:最後一次修改的時間
3.主體
主體就是請求的內容或者是響應的內容。
3.MIME機制
超文本傳輸協議http只能用來傳輸文本,但是我們日常瀏覽的網頁幾乎沒有是純文本的網頁,我們日常請求的資源還包含圖片,視頻等等,這些都是不能直接傳輸的,需要採用base64進行編碼成二進制之後才能進行傳輸,但是傳輸之後我們不能判斷其格式,這裏就需要用到MIME,採用大格式和小格式組合就是major/minor的方法,例如一個文本格式,text/html,text/txt,圖片格式:image/jpg,這種方法,在我們傳輸之後,個以根據其格式,使用相應的程序來打開,這樣我們的http協議就能傳輸其他非文本格式了。
2.配置httpd
1.安裝httpd
安裝httpd的命令很簡單:
yum -y install httpd
2.配置MPM模塊
MPM的配置文件在/etc/httpd/conf.modules.d/00-mpm.conf中,我們可以看到httpd支持三種MPM:
1.prefork:多進程模型,每個進程響應一個請求;
一個主進程:負責生成子進程及回收子進程;負責創建套接字;負責接收請求,並將其派發給某子進程進行處理;
n個子進程:每個子進程處理一個請求;
工作模型:會預先生成幾個空閒進程,隨時等待用於響應用戶請求;最大空閒和最小空閒;
<IfModule prefork.c>
StartServers 10 啓動服務時開啓幾個子進程
MinSpareServers 5 最少的空閒進程數
MaxSpareServers 10 最多的空閒進程數
MaxRequestWorkers 256 最多的併發請求數
</IfModule>
修改如上,使用下面命令查看:
ps auxf |grep httpd
結果如下:
可以看到啓動了一個主控進程負責生成和回收子進程,重啓生成10個子進程。
2.worker:多進程多線程模型,每線程處理一個用戶請求;
一個主進程:負責生成子進程;負責創建套接字;負責接收請求,並將其派發給某子進程進行處理;
多個子進程:每個子進程負責生成多個線程;
每個線程:負責響應用戶請求;
併發響應數量:m * n
m:子進程數量
n:每個子進程所能創建的最大線程數量;
<IfModule worker.c>
ServerLimit 16 最大的進程數
StartServers 8 啓動服務時開啓幾個子進程
MaxRequestWorkers 150 最多的併發請求數
MinSpareThreads 25 最少空閒的線程數
MaxSpareThreads 300 最多空閒的線程數
ThreadsPerChild 25 每個子進程的線程數
</IfModule>
將prefork配置註釋掉,開啓worker配置,如下:
重啓服務,分別用ps和pstree查看:
可以看到,啓動了一個主控進程,負責生成和回收子進程,一共生成8個子進程,沒個子進程又生成了26個線程,一個用於響應請求,其他25個是空閒的子進程。
3.event:事件驅動模型,多進程模型,每個進程響應多個請求;
一個主進程 :負責生成子進程;負責創建套接字;負責接收請求,並將其派發給某子進程進行處理;
子進程:基於事件驅動機制直接響應多個請求;
併發響應數量:m * n
m:子進程數量
n:每個子進程響應的併發請求;
event以後再說,prefork是http默認的。
3.站點訪問控制常見機制
1.URL
URI是統一資源標識符,包括URN(統一資源命名)和URL(統一資源定位符),URL用於用於描述某服務器某特定資源位置。
2.基於源地址實現訪問控制
httpd的主配置文件的位置是/etc/httpd/conf/httpd.conf,同時還有擴展配置文件,路徑是/etc/httpd/conf.d,這個目錄下的所有文件都是httpd的擴展配置文件。
主配置文件配置如下:
listen 80 表示監聽80端口
Include conf.modules.d/\*.conf 表示子配置文件
User apache
Group apache 用戶和組
ServerAdmin root@localhost 服務器管理員賬號
ServerName www.can.com:80 主機名
DocumentRoot "/var/www/html" 網頁地址切根到此處
我們建新的網頁在子配置文件中寫:
Options Indexes FollowSymlinks
Indexes如果開啓,則訪問的目錄下如果沒有index.html,index.php,則會將目錄下的文件名列出,followsymlinks,如果開啓,可以訪問軟鏈接,這裏開啓。
Require all granted 允許所有訪問
ALlowOverride none
當服務器找到一個.htaccess文件(由其指定AccessFileName)時,它需要知道該文件中聲明的哪些指令可以覆蓋先前的配置指令。這裏關掉
在/var/www/html下創建目錄can,在can下創建henan.html內容如下:
我們用下面命令訪問:
curl http://172.18.250.11
的到的是我們的主頁:
然後訪問我們新建的網頁:
curl http://172.18.250.11/can/henan.html
就是我們剛剛創建的網站:
現在實現訪問控制,只不允許centos6訪問,其地址爲172.18.250.22,需要修改配置文件如下:
分別在centos7和centos6上訪問,結果如下:
centos7:
centos6:
可以看到6被禁止訪問,
也可以使用requieany來進行控制只允許centos7進行訪問,修改配置文件如下:
centos7:
centos6:
centos5:
這是兩種實現基於源地址實現訪問控制,requireall是實現黑名單控制,默認都允許,寫入的都是not ip
requireany是實現白名單控制,寫入的都是被允許的,默認不被允許。
3.基於用戶的訪問控制
基於用戶的訪問控制有兩種方式,basic:明文 digest:消息摘要認證,我們這裏只說一下basic認證
首先修改配置文件如下:
其中項的意思如下:
AuthType Basic 指定訪問類型爲Basic
AuthUserFile "/etc/httpd/conf/.htpasswd" 指定用戶名和密碼的存放位置
Require user can 指定允許哪些用戶訪問
Require valid-user 指定能瀏覽的用戶都能訪問,這裏註釋掉,不用
然後用下面命令創建一些用戶:
htpasswd -b -m -c /etc/httpd/conf/.htpasswd can centos
-b 使用命令行給定的密碼
-m使用MD5sum加密密碼
-c生成用戶名密碼存放文件
然後重啓服務,使用瀏覽器訪問http://172.18.250.11/can/html,會彈出下面的對話框:
使用lzy登陸,發現登陸不成功,依然讓輸入密碼,使用can登陸,發現登陸成功,內容如下:
4.虛擬主機
所謂虛擬主機就是在一臺主機上虛擬化出多臺主機,在每臺虛擬主機都可以部署一個站點,因爲客戶端在請求服務器是是通過socket來連接服務器的,而這種socket文件又分爲三種,一種是基於IPv4的socket文件,一種是基於本機的socket文件,這種基於本機的socket文件用於本機客戶端訪問主機時使用,還有一種是基於ipv6的socket文件,而客戶端和服務器在傳送報文時是基於tcp/ip協議,我們的數據首先被分割成數據段,這些數據段會首先在傳輸層使用tcp協議進行封裝,加上源端口和目的端口以及其他tcp首部信息,而後到網絡層,數據段會被ip協議進行封裝成數據包,在這裏會加上源ip地址以及目的ip地址以及其他的首部信息,隨後數據會到數據鏈路層,在這裏數據會被封裝成數據幀,加上源mac地址以及目的mac地址,還有其他的幀頭幀尾信息,之後數據幀會到物理層,數據變成了比特流,然後傳輸出去,所以在網絡上訪問數據,就要有一個端口,還要有一個ip地址,所以兩種基於ip的socket文件需要有一個ip地址,還要有一個端口號,還要有主機名,這三部分組成了socket文件,但是我們在本機訪問,如果還要進行tcp/ip的封裝與解封裝無疑是在白白浪費內核資源,就有了第三種本地socket文件,但一旦在網絡上訪問,就必須使用兩種基於ip的socket文件。所有構建虛擬主機有三種方式,分別是基於ip的虛擬主機,基於端口的虛擬主機,還有基於域名的虛擬主機,相對而言,基於端口的虛擬主機最廉價但是用戶在訪問時需要記住一個端口號,這是最不可取的,而基於ip的有特別昂貴,相對而言基於主機名的虛擬主機還是很不錯的,下面是三種虛擬主機的具體配置:
1.基於端口的虛擬主機