Httpd安裝,request報文以及相關訪問控制

一、Centos7系統下實現httpd-2.2的安裝,並分別實現prefork、worker、event等幾種工做方式html

  • preforkapache

    prefork是一個兩級進程模型,非線程的模式,其實經過由父進程管理建立子進程,子進程響應的相應的請求的方式來運行的。以prefork模式運行的httpd,在啓動之際就預派生fork了一些子進程,而後等待請求。每一個子進程只有一個線程,在一個時間點內只能處理一個請求。
    優勢:成熟、穩定、兼容全部新老模塊。進程之間徹底獨立,無須擔憂線程安全的問題。
    缺點:一個進程相對會佔用更多的系統資源,消耗更多的內存。不適合處理高併發請求,因其會把請求放進隊列中,一直等到有可用進程纔會處理相應的請求。
  • workervim

    worker是一個三級結構、多進程多線程的模式,其在啓動時也預先fork了幾個子進程,每一個子進程可以生產若干個服務線程和若干個監聽線程,每一個服務線程處理一個請求,監聽線程負責接入請求並將其傳遞給服務線程處理和應答。線程比起進程會更輕量,由於線程一般會共享父進程的內存空間,所以內存的佔用會減小些,在高併發的場景下表現比prefork模式好。
    優勢:佔用內存少,高併發性能更優秀。
    缺點:當一個線程出現問題的時候會致使同一進程下的線程也會出現問題。在keep-alive長鏈接的方式下,某個線程會被一直佔用,即便中間沒有請求,也須要等待到超時纔會被釋放。
  • event安全

    event模式是最新的運行模式,在httpd-2.4中已是穩定可用的模式。其運行原理與worker相似,區別在於,event模式解決了在keep-alive模式下,線程被長期佔用直到超時,從而致使資源浪費的問題。
    在event模塊中,有一個專門的線程來管理這些keep-alive類型的線程,當接收到真實的請求時,會將請求傳遞給服務線程,執行完畢後,會將對應的服務線程釋放,這樣就能實現線程的異步非阻塞。
  • httpd-2.2安裝
    調整服務器環境(關閉防火牆)
    [root@silassu ~]#systemctl stop firewalld.service
    [root@silassu ~]#setenforce 0

    準備安裝環境服務器

    [root@silassu ~]# yum groupinstall "Development Tools" "ServerPlatform Development" -y

    下載並解壓安裝包網絡

    [root@silassu ~]#wget http://archive.apache.org/dist/httpd/httpd-2.2.34.tar.gz
    [root@silassu ~]# tar xf httpd-2.2.34.tar.gz
    [root@silassu ~]# ls
    httpd-2.2.34  httpd-2.2.34.tar.gz

    進入對應的解壓縮目錄開始編譯安裝多線程

    [root@silassu httpd-2.2.34]#./configure --prefix=/usr/local/httpd-2.2.34 -with-mpm=prefork
    [root@silassu httpd-2.2.34]# make && make install

    軟連接到對應的目錄中併發

    [root@silassu ~]# ln -sv /usr/local/httpd-2.2.34/ /usr/local/httpd
    ‘/usr/local/httpd’ -> ‘/usr/local/httpd-2.2.34/’

    設定環境變量dom

    [root@silassu ~]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/httpd/bin
    [root@silassu ~]# PATH="$PATH:/usr/local/httpd/bin"
    [root@silassu ~]# vim /etc/profile.d/httpd.sh
    [root@silasszl conf]# cat  /etc/profile.d/httpd.sh
    export PATH="$PATH:/usr/local/httpd/bin"
    [root@silassu ~]# source /etc/profile.d/httpd.sh

    調整權限curl

    [root@silassu ~]# useradd -M -s /sbin/nologin httpd
    [root@silassu ~]# chown -R httpd.httpd /usr/local/httpd
    [root@silassu ~]# chown -R httpd.httpd /usr/local/httpd-2.2.34/

    編輯unit文件使用systemctl 管理啓動httpd

    [root@silassu conf]# vim /usr/lib/systemd/system/httpd.service
    [root@silassu conf]# cat  /usr/lib/systemd/system/httpd.service
    [Unit]
    Description=The httpd service
    After=network.target
    [Service]
    Type=forking
    ExecStart=/usr/local/httpd-2.2.34/bin/apachectl start
    ExecStop=/usr/local/httpd-2.2.34/bin/apachectl stop
    ExecRestart=/usr/local/httpd-2.2.34/bin/apachectl restart
    PrivateTmp=true
    [Install]
    WantedBy=multi-user.target

    啓動服務

    [root@silassu conf]# systemctl daemon-reload 
    [root@silassu conf]# systemctl start httpd.service
    [root@silassu conf]# ps aux |grep httpd
    root     10938  0.0  0.1  49292  1928 ?        Ss   15:28   0:00 /usr/local/httpd-2.2.34/bin/httpd -k start
    daemon   10939  0.0  0.0  49428  1300 ?        S    15:28   0:00 /usr/local/httpd-2.2.34/bin/httpd -k start
    daemon   10940  0.0  0.0  49428  1300 ?        S    15:28   0:00 /usr/local/httpd-2.2.34/bin/httpd -k start
    daemon   10941  0.0  0.0  49428  1300 ?        S    15:28   0:00 /usr/local/httpd-2.2.34/bin/httpd -k start
    daemon   10942  0.0  0.0  49428  1300 ?        S    15:28   0:00 /usr/local/httpd-2.2.34/bin/httpd -k start
    daemon   10943  0.0  0.0  49428  1300 ?        S    15:28   0:00 /usr/local/httpd-2.2.34/bin/httpd -k start
    root     10949  0.0  0.0 112660   964 pts/0    R+   15:28   0:00 grep --color=auto httpd

    在編譯安裝的時候對應作模式變動便可,當前爲prefork模式

    ./configure -prefix=/usr/local/httpd -with-mpm=worker
    ./configure -prefix=/usr/local/httpd -with-mpm=event

二、簡述request報文請求方法和狀態響應碼
request報文的請求方法:
Httpd安裝,request報文以及相關訪問控制
狀態響應碼:
Httpd安裝,request報文以及相關訪問控制
經常使用的狀態響應碼:
Httpd安裝,request報文以及相關訪問控制


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

  • 虛擬主機

    一個物理服務器能夠有多個站點,每一個站點可經過一個或者多個虛擬主機來實現;
    httpd有三種類型的虛擬主機
    基於IP:爲每一個虛擬主機準備至少一個IP地址;
    基於PORT:爲每一個虛擬主機使用至少一個獨立的PORT;
    基於FQDN(ServerName):爲每一個虛擬主機使用至少一個FQDN;
    注意:
    1.通常虛擬主機不要與中心主機混用;要使用虛擬主機,得先禁用"main"主機,禁用方法: 註釋中心主機的DocumentRoot指令便可.
    2.配置VirtualHost,在httpd2.2中,NameVirtualHost這一項需啓用,2.2以上版本不須要.

實例
1)基於IP地址
增長兩個ip地址,確保網絡能ping通

[root@silassu ~]#ip addr add 192.168.2.103/24 dev ens33
[root@silassu ~]#ip addr add 192.168.2.104/24 dev ens33

建立兩個虛擬主機的數據目錄並輸入數據

[root@silassu html]#mkdir -p /var/www/html/103
[root@silassu html]#mkdir -p /var/www/html/204
[root@silassu html]#echo "hello,ip address is "192.168.2.103"" > /var/www/html/103/index.html
[root@silassu html]#echo "hello,ip address is "192.168.2.104"" > /var/www/html/104/index.html

編輯配置文件,修改虛擬主機和權限

[root@silassu ~]# vim /etc/httpd/conf.d/virtualhost.conf
[root@silassu ~]# cat /etc/httpd/conf.d/virtualhost.conf
<VirtualHost 192.168.2.103:80>
DocumentRoot "/var/www/html/103"
ServerName www.EAPDomain103.com
<Directory "/var/www/html/103">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.2.104:80>
DocumentRoot "/var/www/html/104"
ServerName www.EAPDomain104.com
<Directory "/var/www/html/104">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

測試語法並重啓httpd服務,而後測試對應結果

[root@silassu ~]#httpd -t
Syntax OK
[root@silassu ~]#systemctl restart httpd.service
[root@silassu ~]#curl 192.168.2.103
hello,ip address is 192.168.2.103
[root@silassu ~]#curl 192.168.2.104
hello,ip address is 192.168.2.104

2)基於端口號
建立基於端口的目錄和索引文件

[root@silassu ~]#mkdir -p /var/www/html/8086
[root@silassu ~]#mkdir -p /var/www/html/8088
[root@silassu ~]#echo "hi,the ip Port is '8086'" >/var/www/html/8086/index.html
[root@silassu ~]#echo "hi,the ip Port is '8088'" >/var/www/html/8088/index.html

修改配置文件端口號及相關配置

[root@silassu ~]# vim /etc/httpd/conf.d/virtualhost.conf
[root@silassu ~]# cat /etc/httpd/conf.d/virtualhost.conf
Listen 8086
Listen 8088

<VirtualHost 192.168.2.100:8086>
DocumentRoot "/var/www/html/8086"
ServerName "www.EAPDomain.com"
<Directory "/var/www/html/8086">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.2.100:8088>
DocumentRoot "/var/www/html/8088"
ServerName "www.EAPDomain.com"
<Directory "/var/www/html/8088">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

測試語法並重啓httpd服務,而後測試對應結果

[root@silassu ~]#httpd -t
Syntax OK
[root@silassu ~]#systemctl restart httpd.service
[root@silassu ~]#curl 192.168.2.100:8086
hi,the ip Port is '8086'
[root@silassu ~]#curl 192.168.2.100:8088
hi,the ip Port is '8088'

3)基於主機域名
建立基於主機域名的目錄和索引文件

[root@silassu ~]#mkdir -p /var/www/html/EAPDomain
[root@silassu ~]#mkdir -p /var/www/html/EDomain
[root@silassu ~]#echo "domain name is 'www.EAPDomain.com'" >/var/www/html/EAPDomain/index.html
[root@silassu ~]#echo "domain name is 'www.EDomain.com'" >/var/www/html/EDomain/index.html

修改主配置文件相關配置

[root@silassu ~]# vim /etc/httpd/conf.d/virtualhost.conf
[root@silassu ~]# cat /etc/httpd/conf.d/virtualhost.conf
<VirtualHost 192.168.2.100:80>
DocumentRoot "/var/www/html/EAPDomain"
ServerName www.EAPDomain.com
<Directory "/var/www/html/EAPDomain">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.2.100:80>
DocumentRoot "/var/www/html/EDomain"
ServerName www.EDomain.com
<Directory "/var/www/html/EDomain">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

更改本地hosts文件對應關係或自建DNS作對應修改

[root@silassu named]#vim /etc/hosts
[root@silassu named]#cat /etc/hosts
192.168.2.100 www.EAPDomain.com www.EDomain.com

測試語法並重啓httpd服務,而後測試對應結果

[root@silassu ~]#httpd -t
Syntax OK
[root@silassu ~]#systemctl restart httpd.service
[root@silassu named]#curl www.EAPDomain.com
domain name is 'www.EAPDomain.com'
[root@silassu named]#curl www.EDomain.com
domain name is 'www.EDomain.com'
  • 站點訪問控制

    可基於來源地址或者基於帳號兩種訪問控制機制;定義的方式有兩種:
    文件系統路徑:<Directory ""> ... </Directory>
    URL路徑:<Location ""> ... </Location>
    <Directory>中「基於源地址」實現訪問控制:
    (1) Options後跟1個或多個以空白字符分隔的「選項」列表;
    Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶;做爲下載站點時才使用;不然,不使用此選項;
    FollowSymLinks:容許跟蹤符號連接文件所指向的源文件;
    None:都禁止;
    All:都容許;
    Includes:容許啓用服務器包含;
    SymLinksifOwnerMatch:比FollowSymLinks在限制上更爲嚴格的機制;表示只有原文件的屬主和連接文件的屬主相同時,才容許跟蹤;
    ExecCGI:容許執行cgi腳本;
    MultiViews:容許執行內容協商;很是消耗資源且不×××全;
    (2)  AllowOverride:與訪問控制相關的哪些指令能夠放在.htaccess文件(每一個目錄即網站目錄下均可以有一個,指令放在此文件中表示當前目錄下的配置文件都無效,所在目錄下的這個隱藏文件生效)中;
    All: 全部指令均可放在這個隱藏文件中;
    None:這個隱藏文件中什麼指令都不放;或給個指定列表,文件信息、根認證相關的信息,限制可放進這個隱藏文件中;會使網站資源解析時性能影響很是大;
    (3) http-2.2中基於IP地址的訪問控制是利用Allow和Deny來實現的;order:定義生效次序;寫在後面的表示默認法則;

實例
禁止ip:192.168.2.33訪問
修改虛擬主機配置文件

[root@silassu ~]#vim /etc/httpd/conf.d/virtualhost.conf
[root@silassu ~]#cat /etc/httpd/conf.d/virtualhost.conf
<VirtualHost 192.168.2.103:80>
 Servername www.EAPDomain.io
 DocumentRoot "/var/www/html/EAPDomain"
 <Directory "/var/www/html/EAPDomain">
 Options None
 AllowOverride None
 Require all granted
 </Directory>
 Customlog "logs/EAPDomain_access_log" combined
</VirtualHost>
LISTEN 8080
<VirtualHost 192.168.2.104:8080>
 Servername www.EDomain.io
 DocumentRoot "/var/www/html/EDomain"
 <Directory "/var/www/html/EDomain">
 Options None
 AllowOverride None
 <RequireAll>
 require all granted
 require not ip 192.168.2.33
 </RequireAll>
 </Directory>
 Customlog "logs/EDomain_access_log" combined
</VirtualHost>

重啓httpd服務,而後在主機192.168.2.33上檢測結果

[root@silassu ~]# systemctl restart httpd.service
[root@silassu ~]# curl http://192.168.2.103
<h1>EAPDomain</h1>
[root@silassu ~]# curl http://192.168.2.104:8080
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
 <title>Apache HTTP Server Test Page powered by CentOS</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  • 基於用戶的訪問控制

    對於網站中的一些資源,須要只對特定的用戶開放,能夠經過用戶的訪問控制來實現.有質詢和認證兩種方式.
    質詢:服務器用401響應碼拒絕客戶端請求,並說明要求客戶端提供帳號和密碼
    認證:客戶端用戶填入帳號和密碼後再次發送請求報文,認證經過時,則服務器發送響應的資源.有basic基本認證和digest摘要認證兩種.這裏以basic認證作實驗.
    登錄使用的帳號爲虛擬帳號而非系統的帳號,並且httpd是明文傳輸的,因此使用htpasswd命令來建立帳號文件格式以下:
    htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username 
        -c:自動建立此處指定的文件,所以,僅應該在此文件不存在時使用
        -m:md5格式加密
        -s: sha格式加密
        -D:刪除指定用戶

實例
建立密碼帳戶和容許訪問的用戶

[root@silassu ~]#htpasswd -c /tmp/test.users tom
[root@silassu ~]#htpasswd -m /tmp/test.users jerry
[root@silassu ~]#htpasswd -m /tmp/test.users obama

把存放密碼的文件移動到httpd目錄下,且保存爲隱藏文件

[root@silassu ~]#mv /tmp/test.users /etc/httpd/conf.d/.htpasswd

建立測試主頁面

[root@silassu conf.d]#mkdir -p /var/www/html/testusers
[root@silassu conf.d]#echo "Testusers Area" > /var/www/html/testusers/index.html

建立模塊化文件而且作對應配置

[root@silassu conf.d]#vim /etc/httpd/conf.d/testusers.conf
<Directory "/var/www/html/testusers">
        Options None
        AllowOverride None
        AuthType basic
        AuthName "Test Area,pls enter your username and password"
        AuthUserFile "/etc/httpd/conf.d/.htpasswd"
        Require user tom jerry obama
        #Require valid-user
</Directory>

編輯配置文件

[root@silassu ~]# vim /etc/httpd/conf.d/text.conf
[root@silassu ~]# cat /etc/httpd/conf.d/text.conf
DocumentRoot "/var/www/html/testusers"
<Directory "/var/www/html/testusers">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

測試語法並重啓httpd服務,而後測試

[root@silassu conf.d]#httpd -t
Syntax OK
[root@silassu conf.d]#systemctl restart httpd.service
  • 持久鏈接

    Persistent Connection:tcp鏈接創建後,每一個資源獲取完成後不全斷開鏈接,而是繼續等待其餘資源請求的進行;可是總歸要斷開,如何斷開?能夠經過對鏈接數量和時間限制來控制;好比:限制100個鏈接,超過100個後會斷開最早的鏈接;限制鏈接60秒後沒有進行任何操做則斷開;
    反作用:對併發訪問量較大的服務器,長鏈接機制會使得後續某些請求沒法獲得正常響應;
    折衷的改進辦法:使用較短的持久鏈接時長,以及較少的請求數量;
    持久鏈接的相關參數:
    KeepAlive Off|On                           #關閉或打開持久鏈接
    MaxKeepAliveRequserts 100         #最大持久鏈接請求數量
    KeepAliveTimeout 15                    #鏈接時長,單位秒;httpd-2.4支持毫秒

實例
建立模塊化進行對應設置

[root@silassu ~]#vim /etc/httpd/conf.d/keepalive.conf
[root@silassu ~]#cat /etc/httpd/conf.d/keepalive.conf
KeepAlive On
KeepAliveTimeout 35
MaxKeepAliveRequests 100

測試語法並重啓httpd服務,而後測試

[root@silassu conf.d]#httpd -t
Syntax OK
[root@silassu conf.d]#systemctl restart httpd.service
相關文章
相關標籤/搜索