一、http介紹
web服務是一種應用層的服務,是一種超文本標記語言。HTML是一種純文本的文本信息,通過所謂的標籤來規範所要顯示的內容格式,在客戶端通過瀏覽器可以對HTML及多媒體資源進行解析,然後呈現在各個終端上。HTML的格式如下:
<html> <head> <title>title</title> </head> <body> <h1>內容</h1> <h2>內容</h2> </body> </html>
http協議是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分佈式超媒體信息系統。
二、http的請求處理過程
1、建立連接:接收或拒絕連接請求
2、接收請求:接收客戶端請求報文中對某資源的一次請求的過程
Web訪問響應模型(Web I/O)
(1)單進程I/O模型:啓動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應
(2)多進程I/O模型:並行啓動多個進程,每個進程響應一個連接請求
(3)複用I/O結構:啓動一個進程,同時響應N個連接請求
實現方法:多線程模型和事件驅動
多線程模型:一個進程生成N個線程,每線程響應一個連接請求
事件驅動:一個進程處理N個請求
(4)複用的多進程I/O模型:啓動M個進程,每個進程響應N個連接請求,同時接收M*N個請求
3、處理請求:服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理
元數據:請求報文首部,格式如下:
<method> <URL> <VERSION>
4、訪問資源:服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源
資源放置於本地文件系統特定的路徑:DocRoot
DocRoot /var/www/html
web服務器資源路徑映射方式:
(a) docroot
(b) alias
(c) 虛擬主機docroot
(d) 用戶家目錄docroot
5、構建響應報文:一旦Web服務器識別除了資源,就執行請求方法中描述的動作,並返回響應報文。響應報文中 包含有響應狀態碼、響應首部,如果生成了響應主體
的話,還包括響應主體。
(1)響應實體:如果事務處理產生了響應主體,就將內容放在響應報文中回送過去。響應報文中通常包括:
描述了響應主體MIME類型的Content-Type首部
描述了響應主體長度的Content-Length實際報文的主體內容
(2)URL重定向:web服務構建的響應並非客戶端請求的資源,而是資源另外一個訪問路徑
永久重定向:http://www.360buy.com
臨時重定向:http://www.taobao.com
(3)MIME類型:
Web服務器要負責確定響應主體的MIME類型。多種配置服務器的方法可將MIME類型與資源管理起來
魔法分類:Apache web服務器可以掃描每個資源的內容,並將其與一個已知模式表(被稱爲魔法文件)進行匹配,以決定每個文件的MIME類型。這樣做可能比較
慢,但很方便,尤其是文件沒有標準擴展名時。
顯式分類:可以對Web服務器進行配置,使其不考慮文件的擴展名或內容,強制特定文件或目錄內容擁有某個MIME類型。
類型協商: 有些Web服務器經過配置,可以以多種文檔格式來存儲資源。在這種情況下,可以配置Web服務器,使其可以通過與用戶的協商來決定使用哪種格式
(及相關的MIME類型)"最好"。
6、發送響應報文
Web服務器通過連接發送數據時也會面臨與接收數據一樣的問題。服務器可能有很多條到各個客戶端的連接,有些是空閒的,有些在向服務器發送數據,還有一些在
向客戶端回送響應數據。服務器要記錄連接的狀態,還要特別注意對持久連接的處理。對非持久連接而言,服務器應該在發送了整條報文之後,關閉自己這一端的連
接。對持久連接來說,連接可能仍保持打開狀態,在這種情況下,服務器要正確地計算ContentLength首部,不然客戶端就無法知道響應什麼時候結束了。
7、記錄日誌
最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務
三、http的功能特性
1、虛擬主機:基於IP、Port、FQDN的虛擬主機
2、CGI:Common Gateway Interface,通用網關接口
3、反向代理
4、負載均衡
5、路徑別名
6、豐富的用戶認證機制,如basic和digest
7、支持第三方模塊
四、http的配置文件
配置文件:
主配置文件:/etc/httpd/conf/httpd.conf
分段配置文件:/etc/httpd/conf.d/*.conf
服務腳本:
/etc/rc.d/init.d/httpd
腳本配置文件:
/etc/sysconfig/httpd
站點網頁文檔根目錄:
/var/www/html
模塊文件路徑:
/etc/httpd/modules
/usr/lib64/httpd/modules
主程序文件:
/usr/sbin/httpd(prefork)
/usr/sbin/httpd.worker(worker)
/usr/sbin/httpd.event(event)
主進程文件:
/etc/httpd/run/httpd.pid
日誌文件目錄:
/var/log/httpd
access_log: 訪問日誌
error_log:錯誤日誌
幫助文檔包:
httpd-manual
五、實驗
實驗1:在centos7安裝rpm包的httpd並測試
1、使用yum安裝httpd
yum -y install httpd
2、啓動httpd
systemctl start httpd
3、編輯主頁文件並使用 curl 測試
vim /var/www/html/index.html <html> <head> <title>Hello MuMu</title> </head> <body> <h1>Welcome to mumu.com</h1> </body> </html>
curl http://172.18.254.192/
注:測試前一定要關閉防火牆和selinux,否則會出現以下錯誤。
實驗2:實現基於ip的訪問控制
實現白名單
1、編輯配置文件
vim /etc/httpd/conf/httpd.conf <Directory "/var/www/html"> <RequireAll> Require all granted Require not ip 172.18.254.191 </RequireAll> </Directory>
注:把/etc/httpd/conf/httpd.conf文件中<Directory "/var/www/html">以下這一行註釋掉,這句話意思是允許所有訪問。
2、測試
注:別忘了把/etc/httpd/conf.d目錄下的welcome.conf修改名字,否則會顯示如下內容,不顯示403錯誤。修改完成後,重啓服務。
實現黑名單
1、編輯配置文件
vim /etc/httpd/conf/httpd.conf <Directory "/var/www/html"> <RequireAny> Require ip 172.18.254.191 </RequireAny> </Directory>
2、檢查語法是否有錯誤,並重啓服務
httpd -t systemctl restart httpd
3、本機IP測試
curl http://172.18.254.192/
4、測試機ip測試
實驗3:基於用戶的訪問控制
質詢:(WWW-Authenticate)服務器用401狀態拒絕客戶端請求,說明需要用戶提供用戶名和密碼,彈出對話框。
認證:(Authorization)客戶端用戶填入賬號和密碼後再次發請求至服務器;認證通過,則請求授權。
http 協議支持的認證方式:basic 基本認證和digest 摘要認證。
basic 認證機制的實現
(1)定義安全域
vim /etc/httpd/conf/httpd.conf <Directory "/var/www/html/admin"> AllowOverride none .htaccess 文件無效 AuthType Basic http協議認證機制 AuthName "Please login" 用戶登錄標題內容 AuthUserfile "/etc/httpd/conf/.htpasswd" 用戶存放目錄位置 Require user mumu wuwu </Directory>
創建測試文件和路徑
創建用戶文件
使用火狐進行測試
使用谷歌進行測試
Require valid-user:所有位於AuthUserFile文件中定義的用戶都允許登錄;
Require user1 user2 user3 ...:僅允許user1,user2 等出現AuthUserFile文件中定義的特定幾個用戶登錄,這些用戶爲虛擬用戶,即非系統用戶。
(2)提供用戶的賬號文件
htpasswd 命令用於維護此文件
htpasswd [-c] [-m] [-D] passwdfile username
-c:添加第一用戶時創建此文件;
-m:以md5格式加密用戶密碼存放;
-s:以sha格式加密用戶密碼存放;
-D:刪除指定用戶
htpasswd -b -c -m /etc/httpd/conf/.htpasswd mumu centos htpasswd -b -m /etc/httpd/conf/.htpasswd wuwu centos
(3)組認證
<Directory "/var/www/html/admin"> Options indexes 只允許index認證訪問 AllowOverride none 允許對應的配置網頁路徑訪問 AuthType Basic 認證類型是basic AuthName "Please login" 認證名稱:Please login AuthUserfile "/etc/httpd/conf/.htpasswd" 保存用戶密碼文件路徑 AuthGroupfile "/etc/httpd/conf/.htgroup" 保存組文件路徑 Require group mumuzhijia 允許組mumuzhijia認證訪問 </Directory>
創建組文件
組文件:每行定義一個組,格式
Grp_Name:User1 User2 ...
測試
一個物理器可以服務於多個站點,每個站點可通過一個或多個虛擬主機來實現。
httpd 三種類型的虛擬主機:基於IP、基於port、基於域名(fqdn)。
注:開啓虛擬主機需要首先關閉 'Main' server 即中心主機,方法:註釋 DocumentRoot 指令即可。
定義虛擬主機的方法:
虛擬主機的配置方法:
<VirtualHost IP:PORT> ServerName FQDN DocumentRoot “/path" </VirtualHost>
實驗4:基於端口的訪問控制
vim /etc/httpd/conf.d/vhost.conf Listen 8080 Listen 9090 <VirtualHost *:8080> 允許訪問本機的所有8080端口 DocumentRoot "/app/website1" 網頁位置 <Directory "/app/website1"> 授權目錄下的內容 Require all granted </Directory> 封裝 定義 </VirtualHost> <VirtualHost *:9090> DocumentRoot "/app/website2" <Directory "/app/website2"> Require all granted </Directory> </VirtualHost>
創建測試文件
使用httpd -M 是否有一下內容:
測試
實驗5:基於ip地址訪問
添加IP地址
編輯配置文件
vim /etc/httpd/conf.d/vhost.conf <VirtualHost 172.18.254.193:80> DocumentRoot "/app/website1" <Directory "/app/website1"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 172.18.254.194:80> DocumentRoot "/app/website2" <Directory "/app/website2"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
添加IP地址
ifconfig ens34:0 192.168.153.17/24 ifconfig ens34:1 192.168.153.27/24
檢查語法是否有錯誤,並重啓服務
測試
實驗6:基於port的訪問控制
vim /etc/httpd/conf.d/vhost.conf listen 8080 listen 9090 <VirtualHost *:8080> DocumentRoot "/app/website1" <Directory "/app/website1"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost *:9090> DocumentRoot "/app/website2" <Directory "/app/website2"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
測試
注:httpd要監聽這裏指明的所有端口
實驗7:混用IP和port的訪問控制
vim /etc/httpd/conf.d/vhost.conf
<VirtualHost 172.18.254.195:80>
DocumentRoot "/app/website1"
<Directory "/app/website1">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 172.18.254.196:80>
DocumentRoot "/app/website2"
<Directory "/app/website2">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
測試
實驗8:基於域名的訪問
vim /etc/httpd/conf.d/vhost.conf <VirtualHost *:80> ServerName www.mumu.com DocumentRoot "/app/website1" CustomLog "logs/www.mumu.com_access_log" combined <Directory "/app/website1"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 172.18.254.196:80> ServerName bbs.mumu.com DocumentRoot "/app/website2" CustomLog "logs/bbs.mumu.com_access_log" combined <Directory "/app/website2"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
修改
修改Windows的hosts文件
測試
注:任意目錄下的頁面只有顯式授權才能被訪問
實驗9:實現https
1、安裝mod_ssl
yum -y install mod_ssl
2、創建證書所需的文件
cd /etc/pki/CA touch index.txt echo 00 > serial
3、生成私鑰,私鑰的文件名與存放位置都要和配置文件的設置相匹配
(umask 066;openssl genrsa -out private/cakey.pem 4096)
4、生成對應的公鑰
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
注:如果不相同,則根CA無法完成對其簽名。
5、創建所需的目錄
mkdir /etc/httpd/conf.d/ssl cd /etc/httpd/conf.d/ssl
6、生成httpd的私鑰
(umask 066;openssl genrsa -out httpd.key 1024)
7、生成httpd公鑰
openssl req -new -key httpd.key -out httpd.csr
8、簽名httpd公鑰,期限設一年
openssl ca -in httpd.csr -out httpd.crt -days 365
注:之後選擇yes或no的直接yes回車
9、複製CA到指定目錄
cp /etc/pki/CA/cacert.pem .
10、編輯CA配置文件
vim /etc/httpd/conf.d/ssl.conf SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem
11、配置httpd配置文件
vim /etc/httpd/conf.d/vhost.conf <VirtualHost *:443> ServerName www.mumu.com DocumentRoot "/app/website1" CustomLog "logs/www.mumu.com_access_log" combined <Directory "/app/website1"> Require all granted </Directory> </VirtualHost>
12、測試
實驗:基於lamp搭建WordPress blog
1、安裝
yum -y install httpd php mariadb-server php-mysql
2、關閉防火牆和selinux
systemctl stop firewalld setenforce 0
3、編輯httpd配置文件
vim /etc/httpd/conf.d/vhost.conf <VirtualHost *:80> ServerName blog.mumu.com DocumentRoot "/app/blog/htdocs" CustomLog "logs/blog.mumu.com_access_log" combined <Directory "/app/blog/htdocs"> Require all granted </Directory> </VirtualHost>
4、啓動httpd服務
systemctl restart httpd
5、編輯/etc/my.cnf文件
vim /etc/my.cnf [mysqld] ……skip_name_resolve
6、啓動mariadb服務
systemctl restart mariadb mkdir -pv /app/blog
7、解壓並創建軟鏈接
tar xvf wordpress-4.9.4-zh_CN.tar.gz -C /app/blog/ mv wordpress wordpress-4.9.4 ln -sv wordpress-4.9.4 htdocs
8、添加特殊權限
cd /app/blog/ setfacl -m u:apache:rwx htdocs/
9、在數據庫創建wpdb數據庫,並給予所有權限
MariaDB [(none)]> create database wpdb; MariaDB [(none)]> grant all on wpdb.* to 'wpuser'@'192.168.153.%' identified by 'wppass';
10、編輯windows的hosts
win+r 打開運行:notepad C:\Windows\System32\drivers\etc\hosts 172.18.254.192 www.mumu.com bbs.mumu.com blog.mumu.com
11、編輯Linux的hosts
vim /etc/hosts 172.18.254.192 www.mumu.com bbs.mumu.com blog.mumu.com
12、在瀏覽器輸入域名blog.mumu.com開始安裝。
1
2
3
4
5
登錄成功之後,WordPress blog搭建成功。