http

http 筆記整理

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

(0)
sunchunjiangsunchunjiang
上一篇 2018-01-30 15:21
下一篇 2018-01-31 21:07

相關推薦

  • linux系統創建主分區、邏輯分區 、設置ext系列分區的參數以及檢測分區

    使用到的命令有:fdisk分區管理命令、partx 強制內核更新分區表(通過查看/procs/partitions文件可知道內核沒有更新新創建的分區)、mkfs格式化分區命令、mke2fs格式化etx專用工具、blkid查看分區屬性、fsck測試分區    linux對不同的磁盤設備的設備文件命名如下:    &nbs…

    Linux干貨 2016-05-16
  • http加速器varnish

    一、web緩存概述       緩存,又稱加速器,用于加速運行速度較快的設備與較慢設備之間的通信。基于程序的運行具有局部性特征其能實現加速的功能:       時間局部性:一個數據被訪問之后,在隨后較短的時間內有可能被訪問。   &nbsp…

    2016-11-18
  • Linux Bash腳本編程練習

    馬哥教育網絡班23期+第九周課堂練習 Linux Bash腳本編程練習 練習 1.寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell (即用戶的shell不是/sbin/nologin) 分別統計這2類用戶的個數,通過字符串比較來實現 腳本: 測試結果:  。。。 2.寫一個腳本 (1)獲取當前主機的主機名 保存于hostname…

    Linux干貨 2016-11-28
  • 正則表達式和文本處理工具grep,egrep

    正則表達式(Regular Expression)是通過一些特殊字符的排列,來表示控制或者通配的功能,用于查找,替換,刪除一行或者多行文字字符串,是用在字符處理上的一項表達式,有時候我們可通過表達式來篩選出我們所需要的信息。 正則表達式分為兩類:基本正則表達式(BRE)和擴展的正則表達式(ERE) 正則表達式基本上是一種“表示法”,只要工具程序支持這種表示法…

    Linux干貨 2016-12-20
  • vim文本操作、例行性工作、腳本編程_第六周練習(01)

    vim文本操作 Q1:復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; [root@promote /]# cp /etc/rc.d/rc.sysinit /tmp/ [root@promote /]# l…

    Linux干貨 2016-12-18
  • Linux文件類型及顏色標識

    查看文件類型:      指令:ll 文件名或目錄名      –  白色 普通文件(可執行文件)      l  擴寫:sysbolic link 淡藍色 符號鏈接文件   &…

    Linux干貨 2016-10-18
欧美性久久久久