一、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類型的線程,當接收到真實的請求時,會將請求傳遞給服務線程,執行完畢後,會將對應的服務線程釋放,這樣就能實現線程的異步非阻塞。
[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虛擬主機、站點訪問控制、基於用戶的訪問控制、持久連接等應用配置實例
虛擬主機
一個物理服務器能夠有多個站點,每一個站點可經過一個或者多個虛擬主機來實現; 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