前言這篇主要介紹HTTP服務程式環境可能有一些介紹不到,博主能力有限,歡迎大神來糾正改進HTTP協議從http/0.9到如今的http/2.0中間發生了很大的改變,現在主流的事http/1.1在很多面試當主就會問起http協議各個版本的不同之處,這裡就不介紹它們之間的區別了,有想要瞭解的可以百度下,... ...
前言
這篇主要介紹HTTP服務程式環境
可能有一些介紹不到,博主能力有限,歡迎大神來糾正改進
HTTP協議從http/0.9到如今的http/2.0中間發生了很大的改變,現在主流的事http/1.1
在很多面試當主就會問起http協議各個版本的不同之處,這裡就不介紹它們之間的區別了,有想要瞭解的可以百度下,面試的時候看下
HTTP工作機制:
http請求:http request
http響應:http response
一次http事務:請求<-->響應
在上篇中基本簡單說了下https://www.cnblogs.com/xsuid/p/9451811.html
http伺服器程式:
httpd apache
nginx
lighttpd
Httpd介紹
httpd:
20世紀90年代初,國家超級電腦應用中心NCSA開發
特性:
高度模塊化:core + modules
DSO: Dynamic Shared Object 動態加/卸載
MPM:multi-processing module多路處理模塊
MPM工作模式
prefork:
1、多進程I/O模型,每個進程響應一個請求,預設模型
2、個主進程:生成和回收n個子進程,創建套接字,不響應請求
3、多個子進程:工作work進程,每個子進程處理一個請求;系統初始時,預先生成多個空閑進程,等待請求,最大不超過1024個
如圖:
worker:
1、復用的多進程I/O模型,多進程多線程,IIS使用此模型
2、一個主進程:生成m個子進程,每個子進程負責生個n個線程,每個線程響應一個請求,併發響應請求:m*n
如圖:
event:
1、事件驅動模型(worker模型的變種)
2、一個主進程:生成m個子進程,每個進程直接響應n個請求,併發響應請求:m*n,有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又允許釋放。這樣增強了高併發場景下的請求處理能力
如圖:
備註:MPM模式也是面試中常問的問題
HTTP安裝
版本
CentOS 6:預設2.2版本(官方以停止支持)
CentOS 7:預設2.4版本
安裝方式
rpm:centos發行版,穩定,建議使用
編譯:定製或特殊需求
備註:後面會介紹編譯安裝----
HTTP-CentOS 7程式環境
新版本2.4特性
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
systemd unit file:
/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
Httpd 2.4常見配置
備註:在這我用兩台主機進行實驗,分別是:192.168.43.57、192.168.43.67,57當http伺服器,67當客戶端,首先yum安裝HTTP伺服器
1、版本號修改
備註:要是別人查詢到你的網站事用http那個版本,是不是不好,容易利用版本漏洞進行攻擊,所以讓他不顯示版本號
1、首先得有個主頁,在這我就隨便創建個index.httml
echo /var/www/html/index.html > /var/www/html/index.html
2、我們先來看一下沒有進行版本設置時候得情況,在67主機上
curl -I 192.168.43.57
版本信息一目瞭然
3、在伺服器端(57)隱藏版本信息設置
cd /etc/httpd/conf.d/ vim texe.conf
備註:寫在主配置文件里也可,推薦寫在以上目錄下,方便來管理,主配置文件中標記了/conf.d/目錄,寫在/conf.d/目錄下得配置優先生效
ServerTokens Prod # 寫入
systemctl restart httpd
systemctl reload httpd
#重啟服務最好用reload
4、再次測試驗證
OK
2、修改監聽的IP和Port
1) 省略IP表示為本機所有IP
2) Listen指令至少一個,可重覆出現多次
示例:
Listen 192.168.1.100:8080
Lsten 80
3、持久連接
Persistent Connection:連接建立,每個資源獲取完成後不會斷開連接,而是繼續等待其它的請求完成,預設關閉持久連接
斷開條件:數量限制:100
時間限制:以秒為單位, httpd-2.4 支持毫秒級
副作用:對併發訪問量較大的伺服器,持久連接功能會使用有些請求得不到響應
折衷:使用較短的持久連接時間
設置:
KeepAlive On|Off KeepAliveTimeout 15 MaxKeepAliveRequests 100
測試:
telnet 192.168.43.57 80
4、切換使用的MPM-開啟100個線程
1、編輯
vim /etc/httpd/conf.modules.d/00-mpm.conf
2、重讀配置文件或重啟服務
systemctl reload httpd systemctl restart httpd
3、查看確認
httpd –M |grep mpm 重啟服務生效 pstree -p|grep httpd 查看進程和線程
備註:
1)設置進程為100個,在我們
StartServers 100
2)重啟服務並查看
systemctl reload httpd ps aux
5、定義HTTP主目錄
1、預設得主目錄在
/var/www/html/
2、更改主目錄
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的狀態
6、定義站點主頁面
預設是找index.html文件最為主頁得,也可更改把以下代碼加入texe.conf配置文件就可
DirectoryIndex index.php # 值可以是多個。找步到第一個找第二個
7、基於IP的訪問控制:
1、conf結尾的文件只能特定IP才能訪問(如只允許192.168.43.67)
<FilesMatch ".+\.(conf|ini)$"> <RequireAny> Require all denied ##拒絕所有 require ip 192.168.43.67 ##只允許 </RequireAny> </FilesMatch>
2、重啟服務
備註:
加上這項
options indexes
說明要是這個網站主頁面訪問不了就顯示目錄下所有文件列表
也可限定目錄只對特定用戶訪問
<location /admin> ##URL路徑 <RequireAny> Require all denied require ip 192.168.31.6 </RequireAny> </location>
8、自定義日誌格式
日誌類型:
訪問日誌
錯誤日誌
錯誤日誌:
路徑:ErrorLog logs/error_log(這是相對路徑基於/etc/httpd/)
推薦設置為:LogLevel warn(級別,從警報級別開始記錄)
LogLevel 可選值:
debug, info, notice, warn,error
crit, alert, emerg
備註:最往後嚴重性越高
訪問日誌
1、定義日誌格式:
LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" testlog
備註:根據環境需求來定義
2、使用日誌格式:
CustomLog "logs/access_log" testlog
參考幫助:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
或
man 3 strftime
9、設定預設字元集
AddDefaultCharset UTF-8 中文字元集:GBK, GB2312, GB18030
10、定義路徑別名
意思是說:
當用戶訪問192.168.43.57/data目錄時,出現的數據不在website/data目錄下,其實是在/website/app/stud目錄下
實現方式:
Alias /data /app/stud
備註:別忘了授權文件夾
<Directory "/app/stud"> Require all granted </Directory>
重啟服務
11、實現身份驗證
說明:只有經過驗證的用戶才能訪問某個目錄
認證方式兩種:
basic:明文
digest:消息摘要認證,相容性差
安全域:
需要用戶認證後方能訪問的路徑;應該通過名稱對其進行標識,以便於告知用戶認證的原因
用戶的賬號和密碼
虛擬賬號:僅用於訪問某服務時用到的認證標識
存儲:文本文件,SQL資料庫,ldap目錄存儲,nis等
備註:用虛擬用戶來訪問特定的目錄,虛擬賬號可以放到文件里或資料庫里
方法一
說明:我們針對admin目錄來訪問
1、修改配置文件:
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>
2、創建用戶
htpasswd -c /etc/httpd/conf.d/.htpasswd alice htpasswd /etc/httpd/conf.d/.htpasswd bob htpasswd /etc/httpd/conf.d/.htpasswd jack
備註:第一次創建用戶必須加“-c”之後就不需要加了
3、重啟服務
方法二
1、在要設置許可權的目錄下創建一個文件存放驗證信息
vim /data/website/admin/.htaccess
AuthType Basic AuthName "Secure login" AuthUserFile "/etc/httpd/conf.d/.htpasswd" Require user bob
2、編輯配置文件
vim /etc/httpd/conf.d/test.conf
<Directory /data/website/admin> AllowOverride authconfig #允許覆蓋 </Directory>
3、重啟服務
基於組驗證
示例: <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和用戶驗證,有一個滿足即可
12、ServerSignature On | Off | EMail
說明:
當客戶請求的網頁並不存在時,伺服器將產生錯誤文檔,預設情況下由於打開了 ServerSignature選項,錯誤文檔的最後一行將包含伺服器的名字、Apache的版本等信息
如果不對外顯示這些信息,就可以將這個參數設置為Off
設置為Email,將顯示ServerAdmin 的Email提示
13、status頁面
說明:
用來判斷伺服器的狀態
依賴於這個模塊
httpd -M |grep status_module
1、編輯配置文件
<Location /status> SetHandler server-status Order allow,deny Allow from 172.18 </Location>
2、重啟服務
3、測試
192.168.43.57/status
14、虛擬主機
說明:在一臺物理機上實現多個網站
有三種實現方式:
基於ip:為每個虛擬主機準備至少一個ip地址
基於port:為每個虛擬主機使用至少一個獨立的port
基於FQDN:為每個虛擬主機使用至少一個FQDN
備註:假如有三台虛擬主機分別是“www.a.com、www.b.com、www.c.com” 分別在web1、web2、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
基於埠實現
分別對應8001、8002、8003
1、編輯配置文件
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>
2、重啟服務
3、測試
基於IP地址實現
1、在物理機上增加三個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
2、修改配置文件
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>
3、重啟服務並測試
基於FQDN(主機頭)實現
說明:想要主機名訪問必須使用DNS解析或hosts文件解析
在這我們寫到hosts文件中
vim /etc/hosts
1、編輯配置文件
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>
2、重啟服務並測試
備註:如果用IP地址訪問,那麼配置文件中誰靠前誰就是預設地址
15、實現https加密訪問
說明:要是你的網站涉及到“¥”那麼就必須加https加密訪問
生產中是向CA機構花錢申請的,在這裡我們自己搭建一個CA伺服器,我們用67當CA伺服器
1、CA伺服器端(67)安裝yum包
yum install mod_ssl
2、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)重啟服務測試
16、http跳轉到https
說明:當我們輸入 “www.a.com” 自動跳轉到”https://www.a.com”
1、修改配置文件
[root@centos7_05 conf.d]# vim texe.conf
RewriteEngine on #啟動這個引擎 rewritecond %{SERVER_PORT} !^443 #條件跳轉--如果不是443的時候我就進行跳轉 RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301] #這是跳轉規則
2、重啟測試
17、使用mod_deflate模塊壓縮頁面優化傳輸速度
適用場景:
(1) 節約帶寬,額外消耗CPU;同時,可能有些較老瀏覽器不支持
(2) 壓縮適於壓縮的資源,例如文本文件
1、編輯配置文件
vim /etc/httpd/conf.d/texe2.conf
AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html DeflateCompressionLevel 9 SetOutputFilter DEFLATE
2、重啟測試
http協議常用的狀態碼
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 – 網關超時