第十周博客作業

1、Centos系統下實現httpd-2.2的安裝,并分別實現prefork、worker、event等幾種工作方式
2、簡述request報文請求方法和狀態響應碼
3、詳細描述httpd虛擬主機、站點訪問控制、基于用戶的訪問控制、持久鏈接等應用配置實例

1、Centos系統下實現httpd-2.2的安裝,并分別實現prefork、worker、event等幾種工作方式

(1)什么是MPM

Apache HTTP 服務器被設計為一個功能強大,并且靈活的 web 服務器, 可以在很多平臺與環境中工作。不同平臺和不同的環境往往需要不同 的特性,或可能以不同的方式實現相同的特性最有效率。Apache 通過模塊化的設計來適應各種環境。這種設計允許網站管理員通過在 編譯時或運行時,選擇哪些模塊將會加載在服務器中,來選擇服務器特性。

Apache 2.0 擴展此模塊化設計到最基本的 web 服務器功能。 它提供了可以選擇的多處理模塊(MPM),用來綁定到網絡端口上,接受請求, 以及調度子進程處理請求。

擴展到這一級別的服務器模塊化設計,帶來兩個重要的好處:

  • Apache 能更優雅,更高效率的支持不同的平臺。尤其是 Apache 的 Windows 版本現在更有效率了,因為 mpm_winnt 能使用原生網絡特性取代在 Apache 1.3 中使用的 POSIX 層。它也可以擴展到其它平臺 來使用專用的 MPM。
  • Apache 能更好的為有特殊要求的站點定制。例如,要求 更高伸縮性的站點可以選擇使用線程的 MPM,即 workerevent; 需要可靠性或者與舊軟件兼容的站點可以使用 prefork。

在用戶看來,MPM 很像其它 Apache 模塊。主要是區別是,在任何時間, 必須有一個,而且只有一個 MPM 加載到服務器中。

(2)MPM的三個模型:

prefork:多進程模型,一個進程響應一個請求;(兩級進程模型,父進程管理子進程,每一個子進程相應一個請求)。

優點:穩定可靠、執行效率高,任何一個進程的崩潰不會影響其它請求.

缺點:在大并發的時候對服務器資源消耗嚴重.

3

worker:多進程多線程模型,一個線程響應一個請求;(三級進程模型,父進程管理子進程,子進程通過線程響應用戶請求;每個線程處理一個用戶請求);

優點:在高并發的情況下,對服務器的資源消耗相對prefork模型要小很多.

缺點:執行效率、穩定性都不如prefork模型.linux不是個原生支持線程的操作系統,經測試發現worker模型在linux上面的綜合表現不如prefork模型.。

4

event:事件驅動模型,一個進程響應n個請求;(兩級線程模型,父進程管理子進程,子進程通過event-drivern機制直接響應n個請求)。

5

(3)httpd-2.2的安裝

[root@bogon ~]# yum install httpd -y ? ? #CentOS6 yum源安裝httpd-2.2.15

http://www.www58058.com/97967? ? ? ? ? ? ? #參見以前博客CentOS7 編譯安裝httpd-2.4.27

安裝后啟動:

[root@bogon ~]# service iptables stop ? ? ?# CentOS6關閉防火墻

[root@bogon ~]# vim /etc/selinux/config?? #?? CentOS6關閉SELINUX

SELINUX=disabled

[root@bogon ~]# service httpd ?start? ? ? ? #CentOS6啟動httpd服務

[root@localhost ~]# systemctl stop firewalld ? ? ?#CentOS7關閉防火墻 ?

[root@bogon ~]# vim /etc/selinux/config?? #?? CentOS7關閉SELINUX

SELINUX=disabled

[root@localhost ~]# systemctl start httpd ? ? ??? ? # CentOS7啟動httpd服務

 

(4)實現prefork工作方式

CentOS6 :配置方法

安裝完成后,httpd的默認運行模式為prefork,查看其運行模式為:

[root@bogon ~]#httpd -M | grep mpm

10

在查看或修改其對應prefork配置:

[root@bogon ~]# vim /etc/httpd/conf/httpd.conf

12

StartServers:?默認啟動的工作進程數;
MinSpareServers:?最少空閑進程數;
MaxSpareServers:?最大空閑進程數;
ServerLimit:?最大活動進程數;
MaxRequestWorkers:?并發請求的最大數;
MaxConnectionsPerChild:?每個子進程在生命周期內所能夠服務的最多請求個數,然后被殺死??0表示不限定

啟動httpd服務并查看相關的進程狀態:

[root@bogon ~]# ps aux | grep httpd

33

查看其中已經啟動了八個子進程

使用ab工具對相應的URL進行壓力測試并觀察進程的狀況:

[root@bogon ~]# ab -n 100000 -c 10 http://172.16.15.12/index.html

3

 

 

(5)實現worker工作方式

CentOS6 :配置方法

[root@bogon ~]# vim /etc/sysconfig/httpd ?#編輯配置文件

37

 

在查看或修改其對應worker配置:

[root@bogon ~]# vim /etc/httpd/conf/httpd.conf?

38

StartServers:?默認啟動的工作進程數; 
MaxClients:?最大連接數; 
MinSpareThreads:?最小線程數; 
MaxSpareThreads:?最大線程數; 
ThreadsPerChild:每個子進程可生成的線程數;
MaxRequestsPerChild: 單個子進程累計最多處理到少個請求,默認0,不限制的意思,可能會導致內存泄露,超過該值則退出重啟apach

啟動httpd服務并查看相關的進程狀態:

[root@bogon ~]# service httpd restart

[root@bogon ~]# ps aux | grep httpd

6

查看其中已經啟動了3個進程

使用ab工具對相應的URL進行壓力測試并觀察進程的狀況:

[root@localhost ~]# ab -n 100000 -c 10 http://172.16.15.12/index.html
2

(6)實現event工作方式

http-2.2的event模式還處于測試階段,因此不建議在生產環境上運行,httpd-2.4的event模式為正式版可在生產環境上部署。

CentOS6 :配置方法

[root@bogon ~]# vim /etc/sysconfig/httpd ?#編輯配置文件

10

在查看添加其對應event配置:

[root@bogon ~]# vim /etc/httpd/conf/httpd.conf

13

StartServers:?默認啟動的工作進程數;

MinSpareThreads:最小線程數;

MaxSpareThreads:?最大線程數;

ThreadsPerChild:每個子進程可生成的線程數;

MaxRequestsPerChild: 單個子進程累計最多處理到少個請求,默認0,不限制的意思,可能會導致內存泄露,超過該值則退出重啟apach

啟動httpd服務并查看相關的進程狀態:

[root@bogon ~]# service httpd restart

[root@bogon ~]# ps aux | grep httpd

11

查看其中已經啟動了3個進程

使用ab工具對相應的URL進行壓力測試并觀察進程的狀況:

1

(7)在Centos 7上設置mpm三個模式:?
httpd-2.4?修改mpm?
[root@ns1 ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf

31

2、簡述request報文請求方法和狀態響應碼

(1)http事物

http事務有請求(request)和響應(response)

報文語法格式:

 

request報文?? :?<method><request-URL><version>

?????????????????????????????????????????????? <headers>

??????????????????????????????????????????????<entity-body>

 

response報文??:?<version><status><reason-phrase>?????#?版本信息?;??#??三位數字,如200,301, 302, 404, 502; 標記請求處理過程中發生的情況; #狀態碼所標記的狀態的簡要描述;

??????????????????????????? ????????????? < headers>????????????????????????????????????? ?#? 每個請求或響應報文可包含任意個首部;每個首部都有首部名稱,后面跟一個冒號,而后跟上一個可選空格,接著是一個值,即Name:Value;

????????????????????????????????????????? ?<entity-body>?????????????????????????????? ? #請求時附加的數據或響應時附加的數據;

(2)http請求步驟

1)、建立或處理連接,web瀏覽器和web服務器建立相應的TCP連接。
2)、發送請求:web瀏覽器向web服務器發送http請求,如:GET/sample/hello.jsp HTTP/1.1。
3)、處理請求:用于對請求報文進行解析,獲取客戶端請求的資源及請求方法等相關信息;
4)、訪問資源,訪問獲取請求報文中請求的資源;
5)、構建響應報文;
6)、發送響應報文;
7)、記錄請求日志;

?(3)request報文請求方法

method(方法):

GET:從服務器獲取一個資源;

HEAD:只從服務器獲取文檔的響應首部;

POST:向服務器發送要處理的數據;

PUT:將請求的主體部分存儲在服務器上;

DELETE:請求刪除服務器上指定的文檔;

TRACE:追蹤請求到達服務器中間經過的代理服務器;

OPTIONS:請求服務器返回對指定資源支持使用的請求方法;

注意:DELETE非常危險

協議查看或分析的工具:

tcpdump, tshark, wireshark

(4)?狀態響應碼

status(狀態碼):

1xx:100-101, 信息提示;

2xx:200-206, 成功

3xx:300-305, 重定向

4xx:400-415, 錯誤類信息,客戶端錯誤

5xx:500-505, 錯誤類信息,服務器端錯誤

 

常用的狀態響應碼:

200:成功,請求的所有數據通過響應報文的entity-body部分發送;OK

301:請求的URL指向的資源已經被刪除;但在響應報文中通過首部Location指明了資源現在所處的新位置;Moved Permanently

302:與301相似,但在響應報文中通過Location指明資源現在所處臨時新位置; Found

304:客戶端發出了條件式請求,但服務器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端;Not Modified

401:需要輸入賬號和密碼認證方能訪問資源;Unauthorized

403:請求被禁止;Forbidden

404:服務器無法找到客戶端請求的資源;Not Found

500:服務器內部錯誤;Internal Server Error

502:代理服務器從后端服務器收到了一條偽響應;Bad Gateway

3、詳細描述httpd虛擬主機、站點訪問控制、基于用戶的訪問控制、持久鏈接等應用配置實例

(1)http服務器的配置文件

?? httpd服務的主配置文件通常為httpd根目錄下的conf/httpd.conf文件,通過yum安裝的httpd服務的主配置路徑通常如下:

http2.2和http2.4主配置文件路徑:/etc/httpd/conf/httpd.conf

?主配置文件的格式大體分為三部分:?????

??????????????????????????? ### Section 1: Global Environment??????????????? #全局配置段

??????????????????????????? ### Section 2: ‘Main’ server configuration???????????? #主服務器配置

??????????????????????????? ### Section 3: Virtual Hosts?????????? #虛擬主機配置

在httpd-2.4版本中刪除了相應的描述,不過大體與httpd-2.2相同。

另外除了主配置文件之外,也存在著其他的配置目錄路徑,通常在主配置文件中會使用Include conf.d/*.conf、Include conf.modules.d/*.conf(httpd-2.4)類似的語句去調用對應的目錄下的配置文件,其路徑格式為相對路徑,根目錄由主配置文件中的Serverroot決定。

(2)httpd服務的基礎配置

1、修改監聽的IP和PORT

格式:?Listen? [IP:]PORT

1)省略IP表示為0.0.0.0;

2) Listen指令可重復出現多次;例如:? Listen? 80??、? Listen? 8080

3) 修改監聽socket,重啟服務進程方可生效;

4)若限制其必須通過ssl通信時,protocol需定義為https;

編輯配置文件

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf

添加監聽端口

30

重啟服務并查看端口:

[root@localhost ~]# systemctl restart httpd

[root@localhost ~]# ss -tnl

32

2、使用長連接

1)首先http是無狀態的,持久連接是tcp連續建立后,每個資源獲取完成后不全斷開連接,而是繼續等待其它資源請求的進行;

2)?使用數量限制和時間限制來斷開連接控制;

3)?當對并發訪問量較大的服務器,長連接機制會使得后續某些請求無法得到正常響應,較好的解決方案是設置使用較短的持久連接時長,以及較少的請求數量;

創建配置文件:

[root@localhost ~]# vim? /etc/httpd/conf/conf.d/keepalive.conf

??????????? KeepAlive?on??????????????????? #啟用長連接

??????? KeepAliveTimeout 15???????????# 持續時長15秒

??????? MaxKeepAliveRequests 100???????????? #最大請求數量100個資源

1

[root@localhost ~]#? httpd –t?????????????? #? 檢查語法錯誤

 

 

3、定義中心服務器’Main’ server的文檔頁面路徑

文檔路徑映射:? DoucmentRoot指向的路徑為URL路徑的起始位置,其相當于站點URL的根路徑;

???(服務器文件系統路徑) /web/host1/index.html? ——映射——>? (網頁)? /index.html???

在httpd服務的主配置文件中,默認情況下DocumentRoot "/var/www/html"定義了默認web站點目錄的路徑。

如需自定義默認的目錄,需要找如下格式進行添加:

httpd-2.2配置:
<Directory “/PATH/TO/FILE”>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

httpd-2.4配置:
<Directory “/PATH/TO/FILE”>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

???????????????

創建主站數據目錄:[root@ns1 ~]# mkdir /data/web/www -pv

?????????????????????????????????????? mkdir: 已創建目錄 “/data”

?????????????????????????????????????? mkdir: 已創建目錄 “/data/web”

?????????????????????????????????????? mkdir: 已創建目錄 “/data/web/www”???????

?????????????????????????????????? [root@ns1 ~]# vim /data/web/www/test.html??? #編輯測試頁

?????????????????????????????????????????????????????? <html>
???????????????????????????????????????????????????????????????? <head>
?????????????????????????????????????????????????????????????????????????? test.page
???????????????????????????????????????????????????????????????? </head>
?????????????????????????????????????????????????????????? <body>
???????????????????????????????????????????????????????????????? <h1>test.page</h1>

????????????????????????????????????????????????????????? </body>
????????????????????????????????????????????????????? </html>

??????????????????????????? ? [root@ns1 ~]# vim /etc/httpd/conf/httpd.conf?????? #配置文件

5

[root@localhost ~]# httpd -t???????????????????????????????? ?#檢查語法
Syntax OK
[root@localhost ~]# systemctl restart httpd?????? ?#重啟服務

測試網頁:

6

 

 

(3)httpd的訪問控制

1) 可基于兩種機制指明對哪些資源進行何種訪問控制

基于系統路徑控制:

                    <Directory  "/PATH/TO/SOMEDIR">系統路徑
                    ...
                    </Directory>

基于文件使用控制:

                    <File  "">針對某些文件使用
                    ...
                    </File>

                    <FileMatch  "PATTERN">
                    ...
                    </FileMatch>

基于URL路徑控制: <location “”>…

                    <LocationMatch "">模式
                    ...
                    </LocationMatch>

2)基于Directory中的訪問控制

  • options 包括以下可選參數:
Indexes: 允許目錄瀏覽,當客戶僅指定要訪問的目錄,但沒有指定要訪問的文件,且目錄下不存在默認文檔時,顯示該目錄中的文件及子目錄列表索引
MultiViews:允許內容協商的多重視圖,允許返回指定的訪問目錄下的相關聯的文件
All:包含了除MultiViews之外的所有特性,如沒有指定options,默認為All
ExecCG:允許在該目錄下執行CGI腳本
FollowSymLink:允許跟蹤符號鏈接到源文件
Includes:允許服務器端包含功能
IncludesNoExec:允許服務器端包含功能,但禁止執行CGI腳本
None:不調用options參數
  • AllowOverride選項用于定義每個目錄下.htaccess文件中的指令類型,但通常設置None。

基于來源地址的訪問控制

order和allow、deny
order:定義生效次序;寫在后面的表示默認法則;
order Allow Deny:Allow的來源地址允許訪問,其余都拒絕。
order Deny Allow:deny的來源地址拒絕訪問,其余都允許。
Allow from:允許訪問的來源地址(白名單)
Deny from:拒絕訪問的來源地址(黑名單)

來源地址格式:    IP  NetAddr:172.16
                      172.16.0.0
                      172.16.0.0/16
                      172.16.0.0/255.255.0.0

Httpd-2.2控制頁面資源允許所有來源的主機可訪問

<Directory””>   #配置地方
…
Oder allow,deny
Allow from all
<Directory””>

<Directory””>   #配置地方
…
Requlre all granted
<Directory””>

1

只允許172.16.15網段的主機訪問

2

Httpd-2.4控制頁面資源拒絕所有來源的主機可訪問

<Directory””>   #配置地方
…
Oder allow,deny
Deny from all
<Directory””>
<Directory””>   #配置地方
…
Requlre all denied
<Directory””>

基于ip可控制:

Require Ip IP地址或網絡地址

Require not Ip IP地址或網絡地址

基于主機名控制

Require host 主機名或域名地址

Require not host 主機名或域名

(4)基于用戶的訪問控制

            認證質詢:WWW-Authenticate:響應碼為401,拒絕客戶端請求,并說明要求客戶端提供賬號和密碼;

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

                認證方式有兩種:
                    basic:明文
                    digest:消息摘要認證

            安全域:需要用戶認證后方能訪問的路徑;應該通過名稱對其進行標識,以便于告知用戶認證的原因;

            用戶的賬號和密碼存放于何處?
                虛擬賬號:僅用于訪問某服務時用到的認證標識

                存儲:
                    文本文件;
                    SQL數據庫;
                    ldap目錄存儲;

            basic認證配置示例:
                <1> 定義安全域
                    <Directory "">
                        Options None
                        AllowOverride None
                        AuthType Basic
                        AuthName "String“
                        AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
                        Require  user  username1  username2 ...
                    </Directory>

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

                <2> 提供賬號和密碼存儲(文本文件)
                    使用專用命令完成此類文件的創建及用戶管理
                        htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username 
                            -c:自動創建此處指定的文件,因此,僅應該在此文件不存在時使用;
                            -m:md5格式加密
                            -s: sha格式加密
                            -D:刪除指定用戶
                            -b 批模式添加用戶

                另外:基于組賬號進行認證;
                    <1> 定義安全域
                        <Directory "">
                            Options None
                            AllowOverride None
                            AuthType Basic
                            AuthName "String“
                            AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
                            AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
                            Require  group  grpname1  grpname2 ...
                        </Directory>

                    <2> 創建用戶賬號和組賬號文件;

                        組文件:每一行定義一個組
                            GRP_NAME: username1  username2  

(5)虛擬主機

            站點標識: socket
                IP相同,但端口不同;
                IP不同,但端口均為默認端口;
                FQDN不同;請求報文中首部
                    Host: www.baidu.com 

            有三種實現方案:

            基于ip:
                    為每個虛擬主機準備至少一個ip地址;

            基于port:
                    為每個虛擬主機使用至少一個獨立的port;

            基于FQDN:
                    為每個虛擬主機使用至少一個FQDN;

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

            虛擬主機的配置方法:

基于IP的虛擬主機示例:

                <VirtualHost 172.16.100.7:80>
                    ServerName www.b.net
                    DocumentRoot "/www/b.net/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.8:80>
                    ServerName www.c.org
                    DocumentRoot "/www/c.org/htdocs"
                </VirtualHost>

                基于端口的虛擬主機:
                <VirtualHost 172.16.100.6:80>
                    ServerName www.a.com
                    DocumentRoot "/www/a.com/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.6:808>
                    ServerName www.b.net
                    DocumentRoot "/www/b.net/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.6:8080>
                    ServerName www.c.org
                    DocumentRoot "/www/c.org/htdocs"
                </VirtualHost>

                基于FQDN的虛擬主機:
                NameVirtualHost 172.16.100.6:80

                <VirtualHost 172.16.100.6:80>
                    ServerName www.a.com
                    DocumentRoot "/www/a.com/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.6:80>
                    ServerName www.b.net
                    DocumentRoot "/www/b.net/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.6:80>
                    ServerName www.c.org
                    DocumentRoot "/www/c.org/htdocs"
                </VirtualHost>                                            
                
注意:如果是http-2.2 則使用基于FQDN的虛擬主機時,需要事先使用如下指令:NameVirtusalHost Ip:port        
?

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99402

(0)
任總任總
上一篇 2018-05-26
下一篇 2018-05-26

相關推薦

  • vim

    vim

    Linux筆記 2018-05-08
  • 運維自動化之ansible

    ansible的基本架構 ? host inventory主機清單 ? playbook相當于腳本, ? modules模塊 ansible工作原理 ? 通過執行命令,或ansible playbook,cmdb ansible配置文件 ? /etc/ansible/ansible.cfg主配置文件,配置ansible工作特性 ? /etc/ansible/…

    Linux筆記 2018-06-03
  • 兩臺主機之間搭建路由通信

    搭建路由通信

    2018-04-29
  • 二進制安裝MySQL(MariaDB)

    在CentOS上部署MySQL有多種方式,如yum安裝、編譯安裝、二進制安裝。其中后二者可以有更多自定義特性,但安裝過程略繁瑣,本文簡單介紹二進制安裝方式。(請根據自己的情況調整目錄)

    Linux筆記 2018-06-12
  • 馬哥的第一節課

    雄關漫到
    跋山涉水

    Linux筆記 2018-07-22
  • at和crontab命令簡述

      at用于計劃任務的執行,不過只能執行一次: 1 確定時間 at time 2 確定時刻想要執行的內容 command …     crontab 也用于執行計劃任務,可以設定確定的時間多次執行計劃任務,時間精確的分鐘,可將計劃任務按照規定的格式寫入配置文件內,配置文件分為六個字段,分別是:分 時 日 月 周 要執…

    Linux筆記 2018-04-08
欧美性久久久久