httpd

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:
httpd
1.prefork:多進程模型,每個進程響應一個請求;
一個主進程:負責生成子進程及回收子進程;負責創建套接字;負責接收請求,並將其派發給某子進程進行處理;
n個子進程:每個子進程處理一個請求;
工作模型:會預先生成幾個空閒進程,隨時等待用於響應用戶請求;最大空閒和最小空閒;

  <IfModule prefork.c>
    StartServers 10 啓動服務時開啓幾個子進程 
    MinSpareServers 5 最少的空閒進程數
    MaxSpareServers 10 最多的空閒進程數
    MaxRequestWorkers  256 最多的併發請求數
    </IfModule>

修改如上,使用下面命令查看:

ps auxf |grep httpd

結果如下:
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配置,如下:
httpd
重啓服務,分別用ps和pstree查看:
httpd
可以看到,啓動了一個主控進程,負責生成和回收子進程,一共生成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的擴展配置文件。
主配置文件配置如下:
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"    網頁地址切根到此處

我們建新的網頁在子配置文件中寫:
httpd

Options Indexes FollowSymlinks 
Indexes如果開啓,則訪問的目錄下如果沒有index.html,index.php,則會將目錄下的文件名列出,followsymlinks,如果開啓,可以訪問軟鏈接,這裏開啓。
Require all granted 允許所有訪問
ALlowOverride none
當服務器找到一個.htaccess文件(由其指定AccessFileName)時,它需要知道該文件中聲明的哪些指令可以覆蓋先前的配置指令。這裏關掉

在/var/www/html下創建目錄can,在can下創建henan.html內容如下:
httpd
我們用下面命令訪問:

curl http://172.18.250.11

的到的是我們的主頁:
httpd
然後訪問我們新建的網頁:

curl http://172.18.250.11/can/henan.html

就是我們剛剛創建的網站:
httpd
現在實現訪問控制,只不允許centos6訪問,其地址爲172.18.250.22,需要修改配置文件如下:
httpd
分別在centos7和centos6上訪問,結果如下:
centos7:
httpd
centos6:
httpd
可以看到6被禁止訪問,

也可以使用requieany來進行控制只允許centos7進行訪問,修改配置文件如下:
httpd
centos7:
httpd
centos6:
httpd
centos5:
httpd
這是兩種實現基於源地址實現訪問控制,requireall是實現黑名單控制,默認都允許,寫入的都是not ip
requireany是實現白名單控制,寫入的都是被允許的,默認不被允許。
3.基於用戶的訪問控制
基於用戶的訪問控制有兩種方式,basic:明文 digest:消息摘要認證,我們這裏只說一下basic認證
首先修改配置文件如下:
httpd
其中項的意思如下:

AuthType Basic         指定訪問類型爲Basic
AuthUserFile "/etc/httpd/conf/.htpasswd"  指定用戶名和密碼的存放位置
Require user can    指定允許哪些用戶訪問
Require valid-user   指定能瀏覽的用戶都能訪問,這裏註釋掉,不用

然後用下面命令創建一些用戶:
httpd

 htpasswd -b -m -c /etc/httpd/conf/.htpasswd can centos
-b 使用命令行給定的密碼
-m使用MD5sum加密密碼
-c生成用戶名密碼存放文件

然後重啓服務,使用瀏覽器訪問http://172.18.250.11/can/html,會彈出下面的對話框:
httpd
使用lzy登陸,發現登陸不成功,依然讓輸入密碼,使用can登陸,發現登陸成功,內容如下:
httpd

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.基於端口的虛擬主機

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