Httpd2018.1.25
互聯網,
組成部分:路由器,服務器,計算機,
服務:
tcp/ip 協議
跨Internet的主機間通訊
在建立通信連接的每一端,進程間的傳輸要有兩個標志:
Ip地址和端口號,合稱為套接字地址socket address
客戶機套接字地址定義了一個唯一的客戶進程
服務器套接字地址定義了一個唯一的服務器進程
端口號tcp和utp ?0-65535
特權和root ??0-1024
普通用戶,1024-65536
客戶端端口號是隨機的
套接字
Socket:套接字,進程間通信IPC的一種實現,允許位于不同主機或同一主機上不同進程之間進行通信和數據交換,socketAPI:封裝了內核中所提供的socket通信相關的系統調用
Socket Domain:根據其所使用的地址
Ipv4
Ipv6
同一主機上不同進程之間通訊是使用
Socket type:根據使用的傳輸協層協議
Socket_stream :流,tcp套接字,可靠地傳輸、面向連接
Socket_dgram:數據報,udp套接字,不可靠地傳輸、無連接
Sock_raw:裸套接字,無需tcp或udp,app直接通過ip;包通信
創建———綁定,指定端口,協議——–開啟監聽,監聽才能讓遠程用戶訪問———–客戶端連接,不需要綁定,因為他的端口是隨機的,只需要調用connect函數——–服務器接收請求和處理請求——雙方讀取回應,建立連接,傳輸數據——最后close
http服務同行過程
http相關術語
http:hyper text transfer protocol 80/tcp ?超文本鏈接
Html: hyper text markup language ?超文本標記語言,編程語言
實例
<html>
<head>
<title>html語言</title>
</head>
<body>
<h1>標題1</h1>
<p><a href=http://www.magedu.com>馬哥教育</a>歡迎你</p> <h2>標題2</h2>
</body>
</html>
Css:cascading style sheet ?????層疊樣式表
Js:javascript
Html 標簽語言,類似word,文本后綴,文件格式,表示不同的字體大小,
http:傳輸的時候使用的協議,網絡協議,
MIME:multipurpose Internet mail extensions ?多用途互聯網郵件擴展 /etc/mine.type
格式:major/minor
Text/plain
Text/html
Text/css
Image/jpeg
Image/png
Videl/mp4
Application/javascript
http工作機制
http請求:http request
http響應:http response
一次http事務:請求<—->響應
Web資源:web resourse
一個網頁由多個資源構成,打開一個頁面,會有多個資源展示出來,但是每個資源都要單獨請求。因此,一個“web”頁面,通常并不是單個資源,而是一組資源的集合
靜態文件:無需服務端做出額外處理
動態文件:服務端執行程序,返回執行的結果
http連接請求
串行和并行連接
持久連接
管道化持久連接
URI 統一資源標識
URN:統一資源命名
URL:統一資源定位符,用于描述某服務器某特定資源位置
兩者區別:URN如同一個人的名字,而URL代表一個人的住址。換言之,URN定義某事物的身份,而URL 提供查找該事物的方法。URN僅用于命名,而不指定地址
URL組成
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
Schame:方案,訪問服務器以獲取資源時要使用哪種協議
User:用戶,某些方案訪問資源時需要的用戶名
Password:密碼,用戶對應的密碼,中間用:分隔
Host:主機,資源宿主服務器的主機名或ip地址
Port:端口,資源宿主服務器正在監聽的端口號,很多方案有默認的端口號
Path:路徑,服務器資源的本地名,由一個/將其與前面的 URL組件分隔
Params:參數,指定輸入的參數,參數為名/值對,多個參數,用;分隔
Query:查詢,傳遞參數給程序,如數據庫,用?分隔,多個查詢用&分隔
Frag:片段,一小片或一部分資源的名 字,此組件在客戶端使用,用#分隔
網站訪問量
Ip(獨立ip)即Internetprotocol,指獨立ip數。一天內來自相同客戶機ip地址只計算一次,記錄遠程客戶機ip地址的計算機訪問網站的次數,是衡量網站流量的重要指標
Pv(訪問量):即page view 頁面瀏覽量或點擊量,用戶每次刷新即計算一次,pv反應的是瀏覽某網張的頁面數,pv域來訪者的數量成正比,pv并不是頁面的來訪者數量,而是網站被訪問的頁面數量
Uv(獨立訪客)訪問網站的一臺電腦為一個訪客,一天內相同的客戶端只被計算一次??梢岳斫獬稍L問電腦的cookie實現的。如果更換了ip后但不清除cookies,在訪問相同網站,該網站的統計中uv是不變的
網站統計:http://www.alexa.cn/rank/
Web服務請求處理步驟
1(tcp的三次握手)建立連接:接收或拒絕連接請求
2接收請求:接收客戶端請求報文中對某資源的一次請求的過程
Web訪問響應模型
單進程I/O模型:啟動一個進程處理用戶請求,而且一次只處理一個,多個請求被竄行響應
多進程I/O模型:并行啟動多個進程,每個進程響應一個連接請求
復用I/O結構:啟動一個進程,同時響應N個連接請求
實現方法:多線程模型和時間驅動
多線程模型:一個進程生成N個線程,每線程響應一個連接請求
事件驅動:一個進程處理N個請求
復用的多進程I/O模型:啟動M個進程,每個進程響應N個倆姐請求,同時接收m*n個請求
3處理請求:服務器對請求報文進行解析,并獲取請求的資源及請求方法等相關信息,根據方法
資源,首部和可選的主體部分對請求進行處理
http常用的請求方式,method
Get post head put delete trace options
4訪問資源
服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行后生成的資源
資源放置于本地文件系統特定的路徑:docroot
Docroot—–>/var/www/html
/var/www/html/images/logo.jpg
Web 服務器資源路徑映射方式:
Docroot
Alias
虛擬主機docroot
用戶家目錄docroot
5構建響應報文
一旦web服務器識別出了資源,就執行請求方法中描述的動作,并返回響應報文。響應報文中包含有響應狀態碼、響應首部,如果生成了響應主體的話,還包括響應主體
響應實體:如果事務處理產生了響應主體,就將內容放在響應報文中回送過去。響應報文通常包括:
描述了響應主體MIME類型的content-type首部
描述了響應主體長度的content-length
實際報文的主體內容
URL重定向:web服務構建的響應并非客戶端請求的資源,而是資源另外一個訪問路徑
永久重定向
臨時重定向
MIME類型
Web服務器要負責確定響應主體的MIME類型。多種配置服務器的方法可將MIME類型與資源聯系起來
魔法分類:Apache web服務器可以掃描每一份資源的內容,并將其與一個已知模式表進行匹配,以決定每個文件的MIME類型。這樣做可能比較慢,但很方便,尤其是文件沒有標準擴展名時
顯示分類:可以對web服務器進行配置,使其不考慮文件的擴展名或內容,強制特定文件或目錄內容擁有某個MIME類型
類型協商:有些web服務器經過配置,可以以多種文檔格式來存儲資源。在這種情況下,可以配置web服務器,使其可以通過與用戶的協商來決定使用哪種格式
6發送響應報文
Web服務器通過連接發送數據時也會面臨與接收數據一樣的問題。服務器可能有很多條到各個客戶端的連接,有些事空閑的,有些在向服務器發送數據,還有一些在向客戶端回送響應數據。服務器要記錄這些連接狀態,還要特別注意對持久連接的處理。對非持久連接而言,服務器應該在發送了整條報文之后,關閉自己這一端的連接。對持久來說,連接可能仍保持打開狀態,在這種情況下,服務器要正確地計算content-length首部。
不然客戶端就無法知道響應什么時候結束了
7記錄日志
最后,當事務結束時,web服務器會在日志文件中添加一個條目,來描述已執行的事務
http服務器應用
Httpd Apache
Nginx
Lighttpd
應用程序服務器
Tomcat
Jetty
市場占有率統計
Httpd介紹
Httpd
特性
高度模塊化 ??core + modules
DSO:動態加/卸載
MPM:多路處理模塊
MPM工作模式
Prefork:多進程I/O模型,每個進程響應一個請求,
一個主進程:生成和回收n個子進程,創建套接字,不響應請求
多個子進程:工作work進程,每個子進程處理一個請求;系統初始時預先生成多個空閑進程,等待請求,最大不超過1024個
Worker:復用的多進程I/O模型,多進程多線程,IIS使用此模型
一個主進程:生成m個子進程,每個子進程負責生成n個線程,每個線程響應一個請求,并發響應請求:m*n
Event:事件驅動模型(worker模型的變種)
一個主進程:生成m個子進程,每個進程直接響應n個請求,并發響應請求:m*n,有專門的線程來管理這些keep-alive類型的線程,當有真是請求時,將請求傳遞給服務線程執行完畢后,有允許釋放,這樣增強了高并發場景下的請求的處理能力
進程角
空閑——-監聽—工作
虛擬主機
Ip ??Port ??fqdn全程域名
CGI : 通用網關接口
反向代理:根據用戶的請求調度,
正向代理:
負載均衡:
路徑別名
豐富的用戶認證機制
Basic
Digest
支持第三方模塊
Centos6程序環境 :httpd-2.2
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
檢查配置語法
Httpd -t
Service ?httpd ?configtest
服務腳本:/etc/rc.d/init.d/httpd
腳本配置文件:/etc/sysconfig/httpd
服務控制和啟動
Chkconfig ??httpd ?on|off
Service{start|stop|restart|status|configtest|reload} httpd
站點網頁文檔根目錄:
/Var/www/html
模塊文件路徑
/etc/httpd/modules
/usr/lib64/httpd/modules
主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.worker
/usr/sbin/httpd.event
主進程文件
/etc/httpd/run/httpd.pid
日志文件目錄
/var/log/httpd/
Access_log:訪問日志
Error_log:錯誤日志
幫助文檔包
httpd-manual
Httpd配置文件的組成:
配置格式:directive value
Directive :不區分字符大小寫
Value:為路徑時,是否區分大小寫,取決于文件系統
1顯示服務器版本信息
改版本號
[root@Centos6 html]# vim ?/etc/httpd/conf/httpd.conf
[root@Centos6 html]# service ?httpd reload
[root@centos7 ~]# curl -I http://192.168.27.26/
2修改監聽的IP和Port
Listen [IP:]PORT
(1)省略IP表示為本機所有IP
(2)listen指令至少一個,可重復出現多次
3.持久連接
Persitent connection:連接建立每個資源獲取完成后不會斷開連接,而是繼續等待其它的請求完成,默認關閉持久連接,
斷開條件:數量限制:100
時間限制:以秒為單位
設置:keepAlive ?on|off
keepAlive Timeout ?15
MaxKeepAliveRequests ??100
測試: telnet ?WEB_SERVER_IP PORT
GET ??/URL ????HTTP/1.1
Host: WEB_SERVER_IP
4 MPM(Multi-Processing Module)多路處理模塊
Prefork ?worker ???event
http-2.2 不支持同時編譯多個模塊,所以只能編譯時選定一個;rpm安裝的包提供三個二進制程序文件,分別用于實現對不同MPM機制的支持
- DSO :Dynomic Shaerd Object
加載動態模塊配置
/etc/httpd/conf/httpd.conf
6定義‘Main’server的文檔頁面路徑
DocumentRoot ??“/path”
文檔路徑映射:
DocumentRoot 指向的路徑為URL路徑的起始位置
實例:DocumentRoot “/app/data”
http://HOST:PORT/test/index.html
——> /app/data/test/index.html
7定義站點主頁面
DirectoryIndex ?index.html ???index.html.var
8站點訪問控制常見的機制
可基于兩種機制指明對哪些資源進行何種訪問控制
訪問控制機制有兩種:客戶端來源地址,用戶帳號
文件系統路徑
<Directory “/path”>
……
</Directory>
<File “/path/file”>
……
</File>
<FileMatch “PATTERN”>
……
</FileMtch>
URL路徑:
<Location “”>
……
</Location>
<LocationMatch “”>
……
</LocationMatch>
9<Directory>中“基于源地址”實現訪問控制
- options:后跟一個或多個以空白字符分隔的選項列表
在選項前的+,—表示增加或刪除指定選項
常見選項
Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶
FollowSymLinks:允許訪問符號鏈接文件所指向的源文件
None:全部禁用
All: 全部允許
- allowOverride
- 寫到存放數據的目錄下,
與訪問控制相關的哪些指令可以放在指定目錄下的.htaccess(由AccessFileName指定)文件,覆蓋之前的配置指令
只對<directory>
Allowverride All: ?.htaccess所有指令都有效
Allowverride None ?.htaccess文件無效
Allowverride ?AuthConfig Indexes 除了AuthConfig和indexs 的其他指令都無法覆蓋
找不到文件時顯示的默認頁面存放的地址:vim /etc/httpd/conf.d/welcome.conf
(3)order 和 allow 、deny
放在directory, .htaccess中
Order:定義生效次序;寫在后面的表示默認法則
Order allow,deny
Order deny, allow
Allow from和deny from:定義客戶端地址
客戶端地址:
Ip
網絡:172.16
172.16.0.0
172.16 .0.0/16
172.16..0.0/255.255.0.0
排在后面的優先級高
Allow deny | Deny ??allow | |
Allow ?only | ?允許 | 允許 |
Deny ?only | 拒絕 | 拒絕 |
Allow deny | 拒絕 | 允許 |
none | 拒絕 | 允許 |
- 日志設定
日志類型:
訪問日志,錯誤日志
Errorlog ??logs/error_log
Loglevel ?warn
Loglevel ?可選值:debug ?info ?notice ?warn ??error ?crit ??alert ??amerg
復習,http的服務訪問
1、客戶端發請求,建立連接(服務端接受到請求建立連接) 三次握手和dns
2、接受請求,三種工作模式MPM,多路處理模塊 httpd,worker,event
并行的響應多個用戶,event監控模塊,持久連接,時間到了,接收的請求到了,
3、處理請求,分析請求報文首部,其中有method的方法,get,put,
4、訪問資源,幫你到磁盤上訪問資源get文件或者頁面
5、響應請求,把文件或圖片,從網站上讀取出來了,http要把文件分裝加http響應報文首部 ??完整的http報文
6、發送文件,
7、記入日志,var/log/access_log 文件
物理磁盤——內核—–應用程序http
當用戶遠程發送請求,先到達物理層web服務器,根據封裝解封裝的流程(先解析展開mac地址,網絡接口層處理后到Internet層,Internet層把報文首部去掉,分析報文是不是我的,不是就丟掉,ip層處理過之后,到達傳輸層,tcp層,http服務監聽80端口,應用層http服務收到請求,分析數據包報文的首部,看報文method的方法,假入是get,這時http服務就要替你去訪問文件,把請求發送給內核,因為文件(圖片)在磁盤上a.jpg,應用程序是不能直接訪問硬件的,http程序將請求發送給內核,內核從磁盤上找到圖片a.jpg,找到圖片,先到達內核的緩存區buffer,在到達httpd的緩沖區,httpd就拿到了文件a.jip,開始封裝響應報文首部,依次加,tcp報文首部,ip報文首部,mac地址,然后發出去)
11,設定默認字符集
addDefaultCharset ?UTF-8、
中文字符集:GB2312
格式:Alias ?/URL/ ??“/PATH/”?磁盤路徑
13基于用戶的訪問控制
認證質詢:WWW-Authenticate:響應碼為401,拒絕客戶端請求,并說明要求客戶端提供賬號和密碼
認證:Authorization:客戶端用戶填入賬號和密碼后再次發送請求報文;認證通過時,則服務器發送響應的資源
認證方式的兩種:
Basic:明文
Digest:消息摘要認證,兼容性差
安全域:需要用戶認證后方能訪問的路徑;應該通過名稱對其進行標識,以便于告知用戶認證的原因
用戶的賬號和密碼:
虛擬賬號:僅用于訪問某服務時用到的認證標識
存儲:文件文本,sql數據庫,ldap目錄存儲,nis
2,提供賬號和密碼存儲(文本格式)
使用專用命令完成此類文件的創建及用戶管理
-c:自動創建文件,僅應該在文件不存在時使用
-m:md5格式加密,默認方式
-s:sha格式加密
-D:刪除指定用戶
基于用戶的訪問實驗
[root@Centos6 ~]# cd /etc/httpd/conf.d
[root@Centos6 conf.d]# htpasswd -c .httpusers http1
[root@Centos6 conf.d]# htpasswd -m .httpusers http2
[root@Centos6 conf.d]# htpasswd -m .httpusers http3
[root@Centos6 html]# ?mkdir secret
[root@Centos6 html]# echo /var/www/html/secret/index.html > secret/index
[root@Centos6 conf.d]# vim auth.conf
<directory /var/www/html/secret>
authtype basic
authname “Admin dir”
authuserfile “/etc/httpd/conf.d/.httpusers”
require user http1 http2
</directory>
[root@Centos6 conf.d]# service httpd restart
[root@centos7 ~]# links http://192.168.27.26/secret/
基于組的訪問實驗
[root@Centos6 ~]# cd /etc/httpd/conf.d
[root@Centos6 conf.d]# htpasswd -c .httpusers http1
[root@Centos6 conf.d]# htpasswd -m .httpusers http2
[root@Centos6 conf.d]# htpasswd -m .httpusers http3
[root@Centos6 html]# ?mkdir secret
[root@Centos6 html]# echo /var/www/html/secret/index.html > secret/index
[root@Centos6 conf.d]# vim .httpgroups
admins: http1
users: http2
[root@Centos6 conf.d]# vim auth.conf
<directory /var/www/html/secret>
authtype basic
authname “Admin dir”
authuserfile “/etc/httpd/conf.d/.httpusers”
authgroupfile “/etc/httpd/conf.d/.httpgroups”
require group admins
</directory>
[root@Centos6 conf.d]# service httpd restart
[root@centos7 ~]# links http://192.168.27.26/secret/
遠程客戶端和用戶驗證的控制
Satisfy ALL|ANY
ALL 客戶機IP和用戶驗證都需要通過才可以
ANY客戶機IP和用戶驗證有一個滿足即可
14,實現用戶家目錄的http共享
基于模塊mod_userdir.so實現
SELinux:http_enable_homedirs
相關設置:
[root@Centos6 conf.d]# ?vim ?/etc/httpd/conf/httpd.conf
<IfModule mod_userdir.c>
??UserDir disabled
???UserDir publicweb
</IfModule>
[root@Centos6 conf.d]# mkdir /root/publicweb
[root@Centos6 conf.d]# echo /root/publicweb/index.html > /root/publicweb/index.html
[root@Centos6 conf.d]# setfacl -m u:apache:x /root/
[root@centos7 ~]# links http://192.168.27.26/~root/
[root@centos7 ~]# links http://192.168.27.26/~wang/
[root@Centos6 wang]# setfacl -m u:apache:x ~wang/
- serversignature on|off |mail
當客戶請求的網頁并不存在時,服務器將產生錯誤文檔,缺省情況下由于打開了serversignature選項,錯誤文檔的最后一行將包含服務器的名字、Apache的版本等信息
如果不對外顯示這些信息,就可以講這個參數設置為off
設置為Email,將顯示serveradmin的Email提示
16,server type inetd | standalone
Standalone 獨立服務模式
Inetd ??非獨立服務
只適用于unix平臺
17,status頁面
<Location /server-status>
SetHandler server-status
Order deny,allow
Allow from?.example.com
</Location>
Extended on 更詳細
18,虛擬主機
站點標識:socket
Ip相同,但端口不同
Ip不同,但端口均為默認端口
Fqdn不同
有三種實現方案:
基于ip:為每一個虛擬主機準備至少一個ip地址
基于Port:為每個虛擬主機使用至少一個獨立的Port
基于fqdn:為每一個虛擬主機使用至少一個fqdn
注意:一般虛擬主機不要與main主機混用;因此,要使用虛擬主機,一般先禁用main主機
禁用方法:注釋中心主機的documentroot指令即可
實驗:基于ip的虛擬主機
ip a a 192.168.27.66/24 dev eth3 ?增加一個 ip
[root@Centos6 app]# ls
website ?website2 ?website3 ?創建文件
[root@Centos6 app]# vim /etc/httpd/conf.d/vhosts.conf 配置文件
<virtualhost 192.168.27.26:80>
documentroot /app/website
ErrorLog logs/website1-error_log
CustomLog logs/website1-access_log common
</virtualhost>
<virtualhost 192.168.27.66:80>
documentroot /app/website2
ErrorLog logs/website2-error_log
CustomLog logs/website2-access_log common
</virtualhost>
<virtualhost 172.18.1.26:80>
documentroot /app/website3
ErrorLog logs/website3-error_log
CustomLog logs/website3-access_log common
</virtualhost>
/app/website2
[root@centos7 ~]# curl 192.168.27.26
/app/website1
[root@centos7 ~]# curl 172.18.1.26
/app/website3
基于端口port 的虛擬主機
[root@Centos6 app]# vim /etc/httpd/conf.d/vhosts.conf
<virtualhost *:8001>
documentroot /app/website
ErrorLog logs/website1-error_log
CustomLog logs/website1-access_log common
</virtualhost>
<virtualhost *:8002>
documentroot /app/website2
ErrorLog logs/website2-error_log
CustomLog logs/website2-access_log common
</virtualhost>
<virtualhost *:8003>
documentroot /app/website3
ErrorLog logs/website3-error_log
CustomLog logs/website3-access_log common
</virtualhost>
listen 8001
listen 8002
listen 8003
基于FQDN的虛擬主機
[root@Centos6 app]# vim /etc/httpd/conf.d/vhosts.conf
NameVirtualHost *:80
<virtualhost *:80>
documentroot /app/website
servername www.a.com
ErrorLog logs/website1-error_log
CustomLog logs/website1-access_log common
</virtualhost>
<virtualhost *:80>
documentroot /app/website2
servername www.b.com
ErrorLog logs/website2-error_log
CustomLog logs/website2-access_log common
</virtualhost>
<virtualhost *:80>
documentroot /app/website3
servername www.c.com
ErrorLog logs/website3-error_log
CustomLog logs/website3-access_log common
</virtualhost>
[root@centos7 ~]# vim /etc/hosts ??在該文件中的域名解析
192.168.27.26 www.a.com www.b.com www.
實驗:混合使用ip和fqdn
Listen 8080
serverAlias ?www.aa.com
http協議
http協議:stateless無狀態
服務器無法持續追蹤訪問者來源
解決http協議無狀態方法
Cookie 客戶端存放
Session 服務端存放
http事務:一次訪問的過程
請求:request
響應:response
Cookie技術 文本文件 ?字符竄
用戶登錄第一次連接網站,服務器生成一個cookie文件,發送到你的主機,cookie文件包含了你的個人信息
存放到自己主機的磁盤,標識了該主機的唯一身份,再次訪問時,攜帶該coolie,服務器可以識別
重cookie,包含購物車信息
輕cookie,只放用戶的id,cookie中的購物車信息放到了服務器上,即服務器上session部分
調度器,
Session在多服務器上的共享,session同步,(適合小的網站)
調度器,根據cookie來調度,或者某個網絡地址段的,調度到某臺機器上
Session 專門的session服務器,只是用來調度session
http響應報文
http響應報文
報文語法格式:
Requset報文
<methed><requset-URL><version>
<headers>
<entity-body>
Response報文
<methed><status><reason-phrase>
<headers>
<entity-body>
Method:請求方法,表明客戶端希望服務器對資源執行的動作
GET ?HEAD ??POST 等
Version:HTTP/<major>.<minor>
Status:
三位數字,如200 ??301 ??302 ???404 ????502 ??標記請求處理過程中發生的情況
Reason-phrases
狀態碼所標記的狀態的簡要描述
Header:每個請求或響應報文可包含任意個首部;每個首部都有首部名稱,后面跟一個冒號,而后跟一個可選空格,接著是值
Entity-body:請求時附加的數據或響應時附加的數據
Method:方法
GET:從服務器獲取一個資源
POST:只從服務器獲取文檔的響應首部
PUT:向服務器輸入數據,通常會在由網關程序繼續處理
DELETE:請求刪除服務器上指定的文檔
TEACE:追蹤請求到達服務器中間經過的代理服務器
OPTIONS:請求服務器返回對指定資源支持使用的請求方法
協議查看或分析的工具:
Tcpdump ??wireshark ??tshark
http協議狀態碼分類
Status(狀態碼)
1xx:100-101 信息提示
2xx:200-206 成功
3xx: 300-305 重定向 ?永久重定向和臨時重定向
4xx: 400-415 錯誤類信息,客戶端錯誤
5xx: 500-505 錯誤類信息,服務器端錯誤
http協議常用的狀態碼
200:成功,請求數據通過響應報文的entity-body部分發送;ok
301:請求的URL指向的資源已經被刪除;但在響應報文中通過首部location指明了資源現在所處的新位置;movedpermanently
302:響應報文location指明資源臨時新位置moved temporarily
304:客戶端發出了條件式請求,但服務器上的資源未曾發生改變,則通過響應此狀態碼通知客戶端;not modified
401:需要輸入賬號和密碼認證方能訪問資源,unauthorized
403:請求被禁止;forbidden
404:服務器無法找到客戶端請求的資源,not found
500:服務器內部錯誤:internal server error
502:代理服務器從后端服務器收到了一條偽響應,如無法連接到網關;bad gateway
503-服務不可用,臨時服務器維護或過載,服務器無法處理請求
504:網關超時
http首部字段
http首部字段包含的信息最為豐富。首部字段同時存在于請求和響應報文內,并涵蓋http報文相關的內容信息。使用首部字段是為了給客戶端和服務器端提供報文主體大小、所使用的語言、認證信息等內容
首部字段結構http首部字段是由首部字段名和字段值構成的,中間用冒號分隔
字段值對應單個http首都字段可以有多個值
報文首部中出現了兩個或以上具有相同首部字段名的首部字段時,在規范內尚未明確,根據瀏覽器內部處理邏輯的不同,優先處理的順序可能不同,結果可能并不一致
首部的分類:
通用首部:請求報文和響應報文兩方都會使用的首部
請求首部:從客戶端向服務器端發送請求報文時使用的首部。補充了請求的附加內容、客戶端信息。請求內容相關優先級等信息
響應首部:從服務器端向客戶端返回響應報文時使用的首部。補充了響應的附加內容,也會要求客戶端附加額外的內容信息
實體首部:針對請求報文和響應報文的實體部分使用的首部。補充了資源內容更新時間等與實體有關的信息
擴展首部
通用首部:
data:報文的創建時間
Connection:連接狀態,如keep-alive,close
Via:顯示報文經過的中間節點 ??代理 ?網關
Cache-control:控制緩存,如緩存時常
MIME-version:發送端使用的MIME版本
Warning:錯誤通知
請求首部:
Accept:通知服務器自己可接收的媒體類型
Accept-charset:客戶端可接受的字符集
Accept-encoding:客戶端可接受編碼格式 如gzip
Accept-language:客戶端可接收的語言
Client-ip:請求的客戶端ip
Host:請求的服務器名稱和端口號
Referer:跳轉至當前URI 的前一個URL
User-agent:客戶端代理,瀏覽器版本
curl工具
Curl時基于URL語法在命令行方式下工作的文件傳輸工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET
DICT,FILE及LDAP等協議。Curl支持https認證,并且支持http的post,put等方法,ftp上傳,kerberos認證,http上傳,代理服務器,cookies,用戶名/密碼認證,下載文件斷點續傳,上載文件斷點續傳,http代理服務器管道,還支持ipv6,socks5代理服務器,通過http代理服務器上傳文件到ftp服務器等,功能十分強大
Mod_deflate模塊
使用mod_deflate模塊壓縮頁面優化傳輸速度
適用場景:
節約帶寬,額外消耗cpu;同時,可能有些較老瀏覽器不支持
壓縮適于壓縮的資源,例如文本文件
https:http ?over ?ssl
Ssl會話的簡化過程
- 客戶端發送可供選擇的加密方式,并向服務器請求證書
- 服務器端發送證書以及選定的加密方式給客戶端
- 客戶端取得證書并進行證書驗證
如果信任給其發證書的ca
(a)驗證證書來源的合法性;用ca的公鑰解密證書上數字簽名
(b)驗證證書的內容合法性;完整性檢驗
(c)檢查證書的有效期
(d)檢查證書是否被吊銷
(e)證書中擁有者的名字,與訪問的目標主機要一致
- 客戶端生成臨時會話密鑰(對稱密鑰),并使用服務器端的公鑰加密此數據發送給服務器,完成密鑰交換
- 服務用此密鑰加密用戶請求的資源,響應給客戶端
注意:ssl時基于ip地址實現,單ip的主機僅可以使用一個https虛擬主機
客戶端向服務器發請求(我要和你通訊加密)——-(服務器端事先從ca申請到證書),把證書傳給客戶端——-客戶端拿到證書————把該服務器端的證書帶的公鑰解開(事先拿到ca的公鑰,利用公鑰把ca經過簽名過的證書拆開,得到里面合法的服務器的公鑰)—————自己在客戶端生成一個會話密鑰(對稱密鑰)——–用得到的服務器端公鑰加密—————-拿服務器的公鑰加密,只能拿服務器的私鑰解密,拿到會話密鑰—后續就用會話密鑰,加密解密通訊
做CA
[root@centos7 ~]# cd /etc/pki/CA
[root@centos7 CA]# tree
[root@centos7 CA]# touch index.txt
[root@centos7 CA]# echo 01 ?> serial 序列號
[root@centos7 CA]# (umask 077;openssl genrsa -out private/cakey.pem?2048) ?生成私鑰
[root@centos7 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650 ?生成自簽名證書
申請證書
[root@webserv ~]# mkdir /etc/httpd/conf.d/ssl/
[root@webserv ~]# cd /etc/httpd/conf.d/ssl/
[root@webserv ssl]# (umask 077;openssl genrsa -out?httpd.key?) 生成私鑰
[root@webserv ssl]# openssl req -new -key httpd.key -out httpd.csr ?證書申請
[root@webserv ssl]# scp http.csr 192.168.27.47:/etc/pki/CA/ 拷貝
[root@centos7 CA]# openssl ca -in httpd.csr -out certs/httpd.crt -days 700 簽證書
[root@centos7 CA]# scp certs/httpd.crt 192.168.27.26:/etc/httpd/conf.d/ssl/
[root@webserv ssl]# vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key
[root@webserv ssl]# service httpd restart
[root@centos7 CA]# scp cacert.pem 192.168.27.26:/etc/httpd/conf.d/ssl/
SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert/pem
[root@webserv ssl]# service httpd restart
將http請求轉發至https的URL
重定向
redirect ??[ status] ?URL-path ?URL
Status狀態:
Permanent: (301)永久
temp :(302)臨時
示例:
[root@Centos6 conf.d]# vim test.conf
redirect temp / http://www.baidu.com/
Rewriteengine on
Rewriterule ????^(/.*)$1 ???https://%{HTTP_HOST}$1????[redirect=301]
^(/.*)$1 ????????根下的任意字符竄
HTTP_HOST ????表示前面域名 www.aa.com
$1 ????????????表示(/.*)
你訪問我的根下的任何目錄,我都把他轉到https
HSTS:HTTP strict transport security
服務器端配置支持HSTS后,會在給瀏覽器返回的HTTP首部中攜帶HSTS字段。瀏覽器獲取到該信息后,會將所有HTTP訪問請求在內部307跳轉到HTTPS。而無任何網絡過程
HSTS?preload list
是chrome瀏覽器中的HSTS預載入列表,在該列表中的網站,使用chrome瀏覽器訪問時,會自動轉換成HTTPS.
實現HSTS示例
Vim /etc/httpd/conf/httpd.conf
Header alway set strict-transport-security “max-age=15768000”
Rewriteengine on
Rewriterule ????^(/.*)$1 ???https://%{HTTP_HOST}$1????[redirect=301]
Httpd的壓力測試工具
ab,webbench ,http_load ?seige
Jmeter
Loadrunner 商業,有相關認證
Tcpcopy 網易,復制生產環境中的真實請求,并將之保存
ab [OPTIONS] ?URL
來自httpd-tool包
-n:總請求數
-c:模擬的并行數
-k:以持久連接模式測試
Ulimit -n # 調整能打開的文件數
Sendfile機制
—read(file,tmp_buf, len)
—write(socket, tmp_buf, len)
硬盤>>kernal buffer >>usrer buffer >>kernel socker buffer >> 協議棧
一般網絡應用通過讀硬盤數據,寫數據到socket來完成網絡傳輸,底層執行過程:
- 系統調用read()產生一個上下文切換:從user mode切換到kernel mode,然后DMA執行拷貝,把文件數據從硬盤讀到一個kernel buffer里
- 數據從 kernelbuffer拷貝到user buffer,然后系統調用read()返回,這時又產生一個上下文切換:從kernel buffer切換到usermode
- 系統調用write()產生一個上下文切換:從usermode切換到kernelmode然后把步驟2讀到userbuffer的數據拷貝到kernel buffer(數據第二次拷貝到kernel buffer在、),不過這次是不同的kernel buffer,這個buffer和socket相關聯
- 系統調用write()返回,產生一個上下文切換:從kernel mode切換到user mode(第4次切換),然后DMA從kernelbuffer 拷貝數據到協議棧
在kernel2.0+版本中,系統調用sendfile()就是用來簡化上面步驟提升性能的。
用sendfile()來進行網絡傳輸的過程:
Sendfile(socket file len)
硬盤>> kernel buffer(快速拷貝到kernel socket buffer)>>協議
編譯一般流程
1、./configure 是用來檢測你的安裝平臺的目標特征的。比如它會檢測你是不是有CC或GCC,并不是需要CC或GCC,它是個shell腳本。
2、make?是用來編譯的,它從Makefile中讀取指令,然后編譯。
3、make install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置
實驗:centos6.9編譯安裝httpd2.4.29方法1
[root@Centos6 ~]# mkdir httpd2.4
[root@Centos6 ~]# mv *.bz2 http2.4
[root@Centos6 ~]# cd httpd2.4/
yum groupinstall “development tools” ??安裝必要的工具包
yum install openssl-devel pcre-devel expat-devel 安裝必要的工具包
[root@Centos6 apr-1.6.3]# ./configure –prefix=/app/apr ??檢驗編譯環境,
[root@Centos6 apr-1.6.3]# make -j 2 && make install ???編譯和安裝
[root@Centos6 apr-util-1.6.1]# ./configure –prefix=/app/apr-util –with-apr=/app/apr/?&& make -j 2 && make install
[root@Centos6 httpd-2.4.29]# ./configure –prefix=/app/httpd24 –enable-so –enable-ssl –enable-cgi –enable-rewrite –with-zlib –with-pcre –with-apr=/app/apr/ –with-apr-util=/app/apr-util/ –enable-modules=most –enable-mpms-shared=all –with-mpm=prefork
[root@Centos6 httpd-2.4.29]# make -j 2 && make install
[root@Centos6 httpd-2.4.29]# echo ‘PATH=/app/httpd24/bin/:$PATH’ > /etc/profile.d/httpd24.sh ?生成環境變量
[root@Centos6 httpd-2.4.29]# ?echo /app/httpd24/bin/apachectl start > /etc/rc.d/rc.local ??放在啟動腳本中開機啟動
[root@Centos6 httpd-2.4.29]# cp /etc/init.d/httpd /etc/init.d/httpd24
[root@Centos6 httpd-2.4.29]# ?vim /etc/init.d/httpd24 修改啟動腳本
apachectl=/app/httpd24/bin/apachectl
httpd=${HTTPD-/app/httpd24/bin/httpd}
pidfile=${PIDFILE-/app/httpd24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
[root@Centos6 httpd-2.4.29]# chkconfig –add ?httpd24 ??加入到開機啟動
[root@Centos6 httpd-2.4.29]# chkconfig ?httpd24 ?on ?默認235啟動
老師總結
1包
yum groupinstall “development tools”
yum install openssl-devel pcre-devel expat-devel
tar xvf apr-1.6.3.tar.bz2
tar xvf apr-util-1.6.1.tar.bz2
tar xvf httpd-2.4.29.tar.bz2
2 安裝apr和apr-util
安裝apr-1.4+
cd apr-1.6.2
./configure –prefix=/app/apr
make && make install
?安裝apr-util-1.4+
cd ../apr-util-1.6.0
./configure –prefix=/app/apr-util –with-apr=/app/apr/
make -j 2 && make install
3 編譯安裝httpd2.4
./configure –prefix=/app/httpd24 \
–enable-so \
–enable-ssl \
–enable-cgi \
–enable-rewrite \
–with-zlib \
–with-pcre \
–with-apr=/app/apr/ \
–with-apr-util=/app/apr-util/ \
–enable-modules=most \
–enable-mpms-shared=all \
–with-mpm=prefork
4 環境變量
echo ‘PATH=/app/httpd24/bin/:$PATH’ > /etc/profile.d/httpd24.sh
. /etc/profile.d/httpd24.sh
5 用戶和組
useradd -r -s /sbin/nologin apache
6 配置文件
vim /app/httpd24/conf/httpd.conf
user apache
group apache
7 開機腳本
cp /etc/init.d/httpd /etc/init.d/httpd24
vim /etc/init.d/httpd24
apachectl=/app/httpd24/bin/apachectl
httpd=${HTTPD-/app/httpd24/bin/httpd}
pidfile=${PIDFILE-/app/httpd24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
chkconfig –add httpd24
chkconfig httpd24 on
service httpd24 start
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/91390