這篇主要介紹HTTP服務程序環境php
可能有一些介紹不到,博主能力有限,歡迎大神來糾正改進html
HTTP協議從http/0.9到現在的http/2.0中間發生了很大的改變,如今主流的事http/1.1nginx
在不少面試當主就會問起http協議各個版本的不一樣之處,這裏就不介紹它們之間的區別了,有想要了解的能夠百度下,面試的時候看下web
HTTP工做機制:
http請求:http request
http響應:http response
一次http事務:請求<-->響應面試
在上篇中基本簡單說了下http://www.javashuo.com/article/p-oqtmhmoh-bm.html數據庫
http服務器程序:
httpd apache
nginx
lighttpdapache
20世紀90年代初,國家超級計算機應用中心NCSA開發vim
高度模塊化:core + modules後端
DSO: Dynamic Shared Object 動態加/卸載centos
MPM:multi-processing module多路處理模塊
一、多進程I/O模型,每一個進程響應一個請求,默認模型
二、個主進程:生成和回收n個子進程,建立套接字,不響應請求
三、多個子進程:工做work進程,每一個子進程處理一個請求;系統初始時,預先生成多個空閒進程,等待請求,最大不超過1024個
如圖:
一、複用的多進程I/O模型,多進程多線程,IIS使用此模型
二、一個主進程:生成m個子進程,每一個子進程負責生個n個線程,每一個線程響應一個請求,併發響應請求:m*n
如圖:
一、事件驅動模型(worker模型的變種)
二、一個主進程:生成m個子進程,每一個進程直接響應n個請求,併發響應請求:m*n,有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又容許釋放。這樣加強了高併發場景下的請求處理能力
如圖:
備註:MPM模式也是面試中常問的問題
CentOS 6:默認2.2版本(官方以中止支持)
CentOS 7:默認2.4版本
rpm:centos發行版,穩定,建議使用
編譯:定製或特殊需求
備註:後面會介紹編譯安裝----
MPM支持運行爲DSO機制;以模塊形式按需加載
event MPM生產環境可用
異步讀寫機制
支持每模塊及每目錄的單獨日誌級別定義
每請求相關的專用配置
加強版的表達式分析式
毫秒級持久鏈接時長定義
基於FQDN的虛擬主機不須要NameVirutalHost指令
新指令,AllowOverrideList
支持用戶自定義變量
更低的內存消耗
/etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
httpd –t service httpd configtest
/etc/httpd/conf.modules.d/*.conf
/usr/lib/systemd/system/httpd.service
/usr/sbin/httpd httpd-2.4支持MPM的動態切換
/var/log/httpd access_log:訪問日誌 error_log:錯誤日誌
/var/www/html
/usr/lib64/httpd/modules
systemctl enable|disable httpd.service systemctl {start|stop|restart|status} httpd.service
httpd -l
httpd –M
動態模塊路徑 /usr/lib64/httpd/modules
備註:在這我用兩臺主機進行實驗,分別是:192.168.43.5七、192.168.43.67,57當http服務器,67當客戶端,首先yum安裝HTTP服務器
備註:要是別人查詢到你的網站事用http那個版本,是否是很差,容易利用版本漏洞進行攻擊,因此讓他不顯示版本號
一、首先得有個主頁,在這我就隨便建立個index.httml
echo /var/www/html/index.html > /var/www/html/index.html
二、咱們先來看一下沒有進行版本設置時候得狀況,在67主機上
curl -I 192.168.43.57
版本信息一目瞭然
三、在服務器端(57)隱藏版本信息設置
cd /etc/httpd/conf.d/ vim texe.conf
備註:寫在主配置文件裏也可,推薦寫在以上目錄下,方便來管理,主配置文件中標記了/conf.d/目錄,寫在/conf.d/目錄下得配置優先生效
ServerTokens Prod # 寫入
systemctl restart httpd
systemctl reload httpd
#重啓服務最好用reload
四、再次測試驗證
OK
1) 省略IP表示爲本機全部IP
2) Listen指令至少一個,可重複出現屢次
示例:
Listen 192.168.1.100:8080
Lsten 80
Persistent Connection:鏈接創建,每一個資源獲取完成後不會斷開鏈接,而是繼續等待其它的請求完成,默認關閉持久鏈接
斷開條件:數量限制:100
時間限制:以秒爲單位, httpd-2.4 支持毫秒級
反作用:對併發訪問量較大的服務器,持久鏈接功能會使用有些請求得不到響應
折衷:使用較短的持久鏈接時間
KeepAlive On|Off KeepAliveTimeout 15 MaxKeepAliveRequests 100
telnet 192.168.43.57 80
一、編輯
vim /etc/httpd/conf.modules.d/00-mpm.conf
二、重讀配置文件或重啓服務
systemctl reload httpd systemctl restart httpd
三、查看確認
httpd –M |grep mpm 重啓服務生效 pstree -p|grep httpd 查看進程和線程
備註:
1)設置進程爲100個,在咱們
StartServers 100
2)重啓服務並查看
systemctl reload httpd ps aux
/var/www/html/
1)首先建立目錄
mkdir /data/website -pv
2)建立index.html首頁
echo /data/website/index.html > /data/website/index.html
3)設置配置文件
vim /etc/httpd/conf.d/texe.conf
DocumentRoot "/data/website" <Directory "/data/website"> Require all granted </Directory>
4)重啓服務
5)測試
注意:SELinux和iptables的狀態
默認是找index.html文件最爲主頁得,也可更改把如下代碼加入texe.conf配置文件就可
DirectoryIndex index.php # 值能夠是多個。找步到第一個找第二個
一、conf結尾的文件只能特定IP才能訪問(如只容許192.168.43.67)
<FilesMatch ".+\.(conf|ini)$"> <RequireAny> Require all denied ##拒絕全部 require ip 192.168.43.67 ##只容許 </RequireAny> </FilesMatch>
二、重啓服務
備註:
加上這項
options indexes
說明要是這個網站主頁面訪問不了就顯示目錄下全部文件列表
也可限定目錄只對特定用戶訪問
<location /admin> ##URL路徑 <RequireAny> Require all denied require ip 192.168.31.6 </RequireAny> </location>
訪問日誌
錯誤日誌
路徑:ErrorLog logs/error_log(這是相對路徑基於/etc/httpd/)
推薦設置爲:LogLevel warn(級別,從警報級別開始記錄)
LogLevel 可選值:
debug, info, notice, warn,error
crit, alert, emerg
備註:最日後嚴重性越高
一、定義日誌格式:
LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" testlog
備註:根據環境需求來定義
二、使用日誌格式:
CustomLog "logs/access_log" testlog
參考幫助:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
或
man 3 strftime
AddDefaultCharset UTF-8 中文字符集:GBK, GB2312, GB18030
意思是說:
當用戶訪問192.168.43.57/data目錄時,出現的數據不在website/data目錄下,實際上是在/website/app/stud目錄下
實現方式:
Alias /data /app/stud
備註:別忘了受權文件夾
<Directory "/app/stud"> Require all granted </Directory>
重啓服務
說明:只有通過驗證的用戶才能訪問某個目錄
basic:明文
digest:消息摘要認證,兼容性差
須要用戶認證後方能訪問的路徑;應該經過名稱對其進行標識,以便於告知用戶認證的緣由
虛擬帳號:僅用於訪問某服務時用到的認證標識
存儲:文本文件,SQL數據庫,ldap目錄存儲,nis等
備註:用虛擬用戶來訪問特定的目錄,虛擬帳號能夠放到文件裏或數據庫裏
說明:咱們針對admin目錄來訪問
一、修改配置文件:
vim /etc/httpd/conf.d/test.conf
<Directory /data/website/admin> AuthType Basic ##驗證方式 AuthName "Secure login" ##加的一段話,只要通過驗證的用戶才能訪問 AuthUserFile "/etc/httpd/conf.d/.htpasswd" ##存放位置加‘.’是隱藏改目錄,要是目錄不存在,就建立出來 Require user bob ##但願所訪問的用戶 </Directory>
二、建立用戶
htpasswd -c /etc/httpd/conf.d/.htpasswd alice htpasswd /etc/httpd/conf.d/.htpasswd bob htpasswd /etc/httpd/conf.d/.htpasswd jack
備註:第一次建立用戶必須加「-c」以後就不須要加了
三、重啓服務
一、在要設置權限的目錄下建立一個文件存放驗證信息
vim /data/website/admin/.htaccess
AuthType Basic AuthName "Secure login" AuthUserFile "/etc/httpd/conf.d/.htpasswd" Require user bob
二、編輯配置文件
vim /etc/httpd/conf.d/test.conf
<Directory /data/website/admin> AllowOverride authconfig #容許覆蓋 </Directory>
三、重啓服務
示例: <Directory "/www/htdocs/admin"> Options None AllowOverride None AuthType Basic AuthName "Administator private" AuthUserFile "/etc/httpd/conf.d/.htpasswd" AuthGroupFile "/etc/httpd/conf.d/.htgroup" Require group g1 </Directory>
建立用戶
和上面建立方法同樣
給用戶分組
備註:
在/etc/httpd/conf.d目錄下建立
ctrl+D結束
備註:
遠程客戶端和用戶驗證的控制
Satisfy ALL|Any
ALL 客戶機IP和用戶驗證都須要經過才能夠
Any客戶機IP和用戶驗證,有一個知足便可
說明:
當客戶請求的網頁並不存在時,服務器將產生錯誤文檔,缺省狀況下因爲打開了 ServerSignature選項,錯誤文檔的最後一行將包含服務器的名字、Apache的版本等信息
若是不對外顯示這些信息,就能夠將這個參數設置爲Off
設置爲Email,將顯示ServerAdmin 的Email提示
說明:
用來判斷服務器的狀態
依賴於這個模塊
httpd -M |grep status_module
一、編輯配置文件
<Location /status> SetHandler server-status Order allow,deny Allow from 172.18 </Location>
二、重啓服務
三、測試
192.168.43.57/status
說明:在一臺物理機上實現多個網站
有三種實現方式:
基於ip:爲每一個虛擬主機準備至少一個ip地址
基於port:爲每一個虛擬主機使用至少一個獨立的port
基於FQDN:爲每一個虛擬主機使用至少一個FQDN
備註:假若有三臺虛擬主機分別是「www.a.com、www.b.com、www.c.com」 分別在web一、web二、web3文件夾中
1)首先建立三個文件夾
mkdir /data/web{1,2,3}
2)建立三個主頁
echo /data/web1 > /data/web1/index.html echo /data/web2 > /data/web2/index.html echo /data/web3 > /data/web3/index.html
分別對應800一、800二、8003
一、編輯配置文件
vim /etc/httpd/conf.d/texe.conf
listen 8001 #端口 listen 8002 # listen 8003 # <virtualhost *:8001> #定義 documentroot /data/web1 #主站點 servername www.a.com <directory /data/web1> #定義受權 require all granted # 都受權 </directory> </virtualhost> <virtualhost *:8002> documentroot /data/web2 servername www.b.com <directory /data/web2> require all granted </directory> </virtualhost> <virtualhost *:8003> documentroot /data/web3 servername www.c.com <directory /data/web3> require all granted </directory> </virtualhost>
二、重啓服務
三、測試
一、在物理機上增長三個IP地址
ip a a 192.168.43.101/24 dev ens33 ip a a 192.168.43.102/24 dev ens33 ip a a 192.168.43.103/24 dev ens33
二、修改配置文件
vim /etc/httpd/conf.d/texe.conf
<virtualhost 192.168.31.101:80> documentroot /data/web1 servername www.a.com <directory /data/web1> require all granted </directory> </virtualhost> <virtualhost 192.168.31.102:80> documentroot /data/web2 servername www.b.com <directory /data/web2> require all granted </directory> </virtualhost> <virtualhost 192.168.31.103:80> documentroot /data/web3 servername www.c.com <directory /data/web3> require all granted </directory> </virtualhost>
三、重啓服務並測試
說明:想要主機名訪問必須使用DNS解析或hosts文件解析
在這咱們寫到hosts文件中
vim /etc/hosts
一、編輯配置文件
vim /etc/httpd/conf.d/texe.conf
<virtualhost *:80> documentroot /data/web2 servername www.b.com <directory /data/web2> require all granted </directory> ErrorLog "logs/b_error_log" #錯誤日誌分開 CustomLog "logs/b_access_log" combined #訪問日誌分開 </virtualhost> <virtualhost *:80> documentroot /data/web3 servername www.c.com <directory /data/web3> require all granted </directory> ErrorLog "logs/c_error_log" CustomLog "logs/c_access_log" combined </virtualhost> <virtualhost *:80> documentroot /data/web1 servername www.a.com ServerAlias a.com *.a.com #別名也就是泛域名 <directory /data/web1> require all granted </directory> ErrorLog "logs/a_error_log" CustomLog "logs/a_access_log" combined </virtualhost>
二、重啓服務並測試
備註:若是用IP地址訪問,那麼配置文件中誰靠前誰就是默認地址
說明:要是你的網站涉及到「¥」那麼就必須加https加密訪問
生產中是向CA機構花錢申請的,在這裏咱們本身搭建一個CA服務器,咱們用67當CA服務器
一、CA服務器端(67)安裝yum包
yum install mod_ssl
二、httpd服務器申請證書
cd /etc/pki/CA
1)生成私鑰
(umask 077;openssl genrsa -out private/cakey.pem 2048)
2)自簽名
openssl req -new -x509 -key private/cakey.pem -out cacert.pem
3)CA主機建立目錄
touch index.txt echo 01 > serial #存放序列號
4)在57HTTP服務器主機建立目錄來存放證書與私鑰並生產本身的私鑰
cd /etc/httpd/conf.d/ # 在這個目錄下建立存放目錄 mkdir ssl
[root@centos7_05 ssl]# (umask 077;openssl genrsa -out heepd.key 2048)
5)57HTTP主機生成請求
openssl req -new -key heepd.key -out httpd.csr
6)CA服務器給HTTP頒發證書
備註:把57主機生成的申請文件scp傳送給CA主機
scp httpd.csr 192.168.43.67:/etc/pki/CA/
CA給HTTP簽名
openssl ca -in httpd.csr -out certs/httpd.csr #頒發證書
7)把HTTP的證書和CA的證書傳送到(57)HTTP服務器
scp certs/httpd.csr cacert.pem 192.168.43.57:/etc/httpd/conf.d/ssl/
8)修改ssl.cof配置文件
[root@centos7_05 conf.d]# vim ssl.conf
9)重啓服務測試
說明:當咱們輸入 「www.a.com」 自動跳轉到」https://www.a.com」
一、修改配置文件
[root@centos7_05 conf.d]# vim texe.conf
RewriteEngine on #啓動這個引擎 rewritecond %{SERVER_PORT} !^443 #條件跳轉--若是不是443的時候我就進行跳轉 RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301] #這是跳轉規則
二、重啓測試
適用場景:
(1) 節約帶寬,額外消耗CPU;同時,可能有些較老瀏覽器不支持
(2) 壓縮適於壓縮的資源,例如文本文件
一、編輯配置文件
vim /etc/httpd/conf.d/texe2.conf
AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html DeflateCompressionLevel 9 SetOutputFilter DEFLATE
二、重啓測試
200: 成功,請求數據經過響應報文的entity-body部分發送;OK
301: 請求的URL指向的資源已經被刪除;但在響應報文中經過首部Location指明瞭資源如今所處的新位置;Moved Permanently
302: 響應報文Location指明資源臨時新位置 Moved Temporarily
304: 客戶端發出了條件式請求,但服務器上的資源不曾發生改變,則經過響應此響應狀態碼通知客戶端;Not Modified
401: 須要輸入帳號和密碼認證方能訪問資源;Unauthorized
403: 請求被禁止;Forbidden
404: 服務器沒法找到客戶端請求的資源;Not Found
500: 服務器內部錯誤;Internal Server Error
502: 代理服務器從後端服務器收到了一條僞響應,如沒法鏈接到網關;Bad Gateway
503 – 服務不可用,臨時服務器維護或過載,服務器沒法處理請求
504 – 網關超時