http:
http協議:伯納斯·李
http/0.9:原型版本;GET,PUT
http/1.0:
MIME:Multipurpose Internet Mail Extensions,多用途互聯網郵件擴展
Cache:緩存
Method:GET、PUT、POST、HEAD、DELETE、TRACE、CONNECT、OPTIONS
GET:請求獲取相關資源;
POST:在資源之後附加某些數據;
HEAD:請求資源的響應消息首部;
PUT:請求服務器存儲一個資源;
DELETE:請求服務器刪除某個資源;
TRACE:請求服務器回送收到的請求信息,主要用於測試或者故障診斷;
CONNECT:保留,待將來使用
OPTIONS:請求查詢服務器的性能,或者查詢與資源相關的選項和請求資源的需求;
W3C
http/1.1:
大大強化了緩存功能;
持久連接的機制:keepalive,長連接;
基於http協議的加速機制:speedy ---> spdy
httpng
http/2.0
http協議:
應用層協議
80/tcp
https協議:
應用層協議
443/tcp
TCP協議的特性:
面向連接:
建立連接(三次握手),維持連接,拆除連接(四次揮手)
數據順序傳輸
將數據打包成段,併爲每段提供CRC校驗和;
確認、重傳和超時;
流量控制:滑動窗口;
擁塞控制:慢啓動及擁塞避免算法;
http:Hyper-Text Transfer Protocol,超文本傳輸協議;
html:Hyper-Text Marked Language,超文本標記語言;
<html>
<head>
<title>xxxx</title>
<meta>
</head>
<body>
</body>
</html>
div
css
js
工作模式:request/response模式;
一次完整的http事務:請求<--->響應
web資源:
一個html文檔
一張圖片
一個MP3片段
一個PHP頁面
一個js腳本
...
客戶端發送的一次請求,只能請求一個web資源;
URI:Universal Resource Identifier,統一資源標識符;
Web上可用的各種資源,如:html文檔,圖片,視頻或音頻片段,應用程序等,都可以使用URI來進行標識;
URI一般包括三個部分:
1.訪問資源的命名機制;
2.存放資源的主機名稱;
3.資源自身的名稱;
URL:Uniform Resource Locator,統一資源定位符;
URL是互聯網上用來描述Web資源的特定格式的一組字符串;
URL一般由三部分組成:
1.協議:資源的提供方式或訪問方式;
2.主機標識:可以是主機名稱(FQDN),也可以是IP地址;
3.資源路徑:使用某種特定方式實現的路徑映射機制,標識資源的具體位置;
URL的通用格式:
scheme://Server[:port]/PATH/TO/SOME_RESOUECE?PARAMETERS=VALUE#FLAGS
http://www.baidu.com/index.html
併發響應模型:
單進程IO模型:只有一個進程,每次只能響應一個用戶請求;串行響應;
多進程IO模型:同時啓動多個進程,每個進程都可以響應一個用戶請求;
複用的IO模型:一個進程響應多個用戶請求;
多線程模型:一個進程可以生成多個線程,每個線程響應一個用戶請求;
事件驅動模型:一個進程直接響應多個用戶請求;
複用的多進程IO模型:啓動M個進程,每個進程生成N個線程,每個線程響應一個用戶請求;
複用的事件驅動IO模型:啓動M個進程,每個進程直接響應多個用戶請求;
web服務器的一次完整的http請求的處理過程:
1.建立連接
2.接收請求:將客戶端發送來的報文經過解封之後放置於服務進程所在的內存空間;
3.處理請求:對於接收到的數據報文進行解析;
4.訪問資源:通過各種IO方式獲取到用戶請求的資源;
5.構建響應報文:
6.發送響應報文:
7.記錄日誌;
資源的種類:
靜態資源:服務器會直接發送給客戶端響應的資源;
html文檔
圖片(.jpg,.png,.gif)
流媒體
文本
js
動態資源:在服務器上需要服務器按照某種方式執行之後生成相應的頁面,再將頁面發送給客戶端響應的資源;
服務器端動態:.php, .jsp, .NET,...
客戶端動態:js
資源路徑映射:
chroot
/mnt/sysroot/html/a.html
chroot /mnt/sysroot
/html/a.html
/var/www/html -- DocumentRoot
http://172.16.72.1/index.html
Web服務器的資源映射方式:
1.DocumentRoot
2.Alias
3.vhost docroot
4.用戶的docroot
...
http的請求處理的連接方式:
持久連接:保持連接,長連接:keepalive;
時間限制:15秒
數量限制:100個請求
非持久連接:短連接;
回顧:
http協議及各個版本的特點:
html的基本架構格式;
http協議的工作模式:request/response
web資源
URI、URL
URL通用格式:
scheme://Server[:port]/PATH/TO/RESOURCES[?PARAMETERS=VLAUE][#FLAGS]
Web服務器的併發響應模型
Web服務器處理用戶請求的過程
Web資源的種類:靜態,動態
Web資源的路徑映射機制
http的請求處理的連接方式:
http(2)
DNS -- BIND
SSH -- OpenSSH dropbear
http協議的實現——簡單的基本http協議的實現:
httpd(Apache)
nginx
Tengine
BWS
SWS
lighttpd
Application Server:應用程序服務器,提供動態服務器技術;
IIS(.NET)
Tomcat(java), jetty, resin
WebLogic(Oracle, java)
WebSphere(IBM, java)
jboss(Redhat, java)
glassfish(Oracle, java)
php(php)
www.netcraft.com
httpd: http daemon
httpd——應用程序名稱,NSA
Apache,A Pathy Server,一個充滿了補丁的服務器;
ASF:Apache Software Foundation,Apache軟件基金會;
httpd的版本:
httpd-1.3:官方已經停止維護;超級穩定
httpd-2.0:
httpd-2.2:
httpd-2.4:
httpd的具體的特性:
高度模塊化:Core + Modules
DSO:Dynamic Shared Object,動態共享對象;實現模塊的動態裝載和卸載;
模塊分爲兩類:
static:編譯到核心中的功能;如果更換靜態模塊,必須更換核心;所以必須重新啓動服務,才能使之生效;
DSO:動態裝載和卸載;重載配置即可使之生效;
MPM:Multipath Processing Modules,多道處理模塊;併發響應模型在httpd應用程序中的專用的稱呼;
prefork:多進程IO模型;一個主進程,多個子進程,一個進程響應一個請求;httpd的默認MPM模塊;
主進程:管理子進程;創建套接字;接收用戶請求,並派發給某個子進程處理...
子進程:處理請求和響應請求;
worker:複用的多進程IO模型(多線程);多進程多線程,一個線程響應一個請求;
主進程:管理子進程;創建套接字;接收用戶請求,並派發給某個子進程處理...
子進程:負責管理線程;
線程:處理請求和響應請求;
event:複用的IO模型(事件驅動);多進程模型;每個進程響應多個請求;
主進程:管理子進程;創建套接字;接收用戶請求,並派發給某個子進程處理...
子進程:處理請求和響應請求;
注意:
1.在httpd2.0之前,不支持event模型;
2.在httpd2.2中,event模型作爲測試模型;
3.在httpd2.4中,event模型作爲建議使用模型;
在CentOS 6中:httpd2.2,event模型是測試模型;不支持DSO機制的MPM;
在CentOS 7中:httpd2.4,event模型爲production ready;支持DSO機制的MPM;
httpd的功能特性:
支持CGI:Common Gateway Interface,通用網關接口;
虛擬主機:
能夠標識虛擬主機的方式:IP + PORT + HOSTNAME;
反向代理:Reverse Proxy
負載均衡:基於流量(bytraffic),基於業務(bybusiness),基於請求(byrequest);
路徑別名的設置;
身份驗證機制:
basic
digest
支持大量的第三方模塊;
...
安裝httpd:
rpm包:本地光盤yum源;
編譯安裝:定製新功能;爲了安全去除帶有bug或漏洞後門的模塊;其他原因;
CentOS 6:httpd-2.2
啓動服務:SysV init腳本,/etc/rc.d/init.d/httpd
/etc/rc.d/init.d/httpd {start|stop|restart|reload|status}
service httpd {start|stop|restart|reload|status}
開機自動啓動服務:
chkconfig [--level 2345] httpd on|off
程序環境:
配置文件:
/etc/httpd/conf/httpd.conf——httpd的主配置文件
/etc/httpd/conf.d/*.conf ——httpd的輔助配置文件
/etc/httpd/conf.d/magic —— 實現MIME功能
/etc/sysconfig/httpd —— httpd服務器啓動腳本的配置文件
程序文件:(二進制文件)
/usr/sbin/httpd:prefork模型;
/usr/sbin/httpd.event:event模型;
/usr/sbin/httpd.worker:worker模型;
/usr/sbin/apachectl:服務控制命令;
日誌文件:
/var/log/httpd/
access_log:訪問日誌;
error_log:錯誤日誌;
默認站點的DocumentRoot:
/var/www/html
模塊文件的路徑:
/etc/httpd/modules --> /usr/lib64/httpd/modules/
CentOS 7:httpd-2.4
啓動服務:Systemd Unit文件,/usr/lib/systemd/system/httpd.service
systemctl {start|stop|restart|reload|status} httpd[.service]
開機自動啓動或停止服務:
systemctl enable|disable httpd.service
程序環境:
配置文件:
/etc/httpd/conf/httpd.conf ——httpd的主配置文件
/etc/httpd/conf.d/*.conf ——httpd的輔助配置文件
/etc/httpd/conf.modules.d —— 額外的模塊專用的配置文件
/etc/httpd/conf.d/magic —— 實現MIME功能
/etc/sysconfig/httpd —— httpd服務器啓動腳本的配置文件
程序文件:(二進制文件)
/usr/sbin/httpd:
在httpd2.4版本中,MPM支持DSO機制,每個MPM模型都有一個對應的模塊;
/usr/lib64/httpd/modules/mod_mpm_event.so
/usr/lib64/httpd/modules/mod_mpm_prefork.so
/usr/lib64/httpd/modules/mod_mpm_worker.so
/usr/sbin/apachectl:服務控制命令;
日誌文件:
/var/log/httpd
access_log:訪問日誌;
error_log:錯誤日誌;
默認站點的DocumentRoot:
/var/www/html
模塊文件的路徑:
/etc/httpd/modules --> /usr/lib64/httpd/modules/
回顧:
httpd版本
httpd特性:
高度模塊化:Core + Modules
MPM:
prefork
worker
event
CentOS 6和CentOS 7中的httpd2.2和httpd2.4
http(3)
安裝httpd:
httpd
httpd-tools
httpd-devel
httpd-manual
httpd-2.2的基礎配置:
/etc/httpd:ServerRoot,服務器根目錄;
conf/httpd.conf, conf.d/*.conf:配置文件及路徑
logs:日誌文件,符號鏈接,鏈接到/var/log/httpd
modules:模塊文件,符號鏈接,鏈接到/usr/lib64/httpd/modules
run:httpd的主進程的PID文件,符號鏈接,鏈接到/var/run/httpd
主配置文件:/etc/httpd/conf/httpd.conf
在此配置文件中,所有的配置項均被稱爲指令(Directive)
指令的格式:
directive value
注意:
1.所有的directive均不區分字符大小寫,但通常寫出駝峯式;
2.value部分,除路徑名稱外,大多數不區分字符大小寫;
在主配置文件中,所有的指令被分別寫到三個配置部分中:
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
在修改了配置文件中的指令之後,可以使用reload的方式使之生效;
CentOS 6:service httpd reload
CentOS 7:systemctl reload httpd.service
在httpd-2.2版本中,如果更改了監聽的IP地址,則必須重啓服務;
1.修改監聽的地址和端口:136行
Listen [IP:]PORT
注意:
1.Listen指令可以定義多次;
2.如果省略了IP地址,代表0.0.0.0,意味着httpd服務進程將監聽本服務器上配置的所有的IP地址;
2.持久連接:76行
persistent connection,持久連接;當服務器與客戶端已經建立起TCP連接之後,在完成一次請求之後,連接不斷開,而是繼續等待用戶發送其他請求;
斷開條件:
數量限制:
時間限制:
相關的指令:
KeepAlive Off|On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
請求測試:
~]# telnet SERV_IP SERV_PORT
GET /PATH/TO/RESOURCE HTTP/1.1
Host: SERV_IP
HTTP/1.1 200 OK
Date: Sun, 06 Aug 2017 00:53:26 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Sun, 06 Aug 2017 00:39:30 GMT
ETag: "100101-13-5560af69d973f"
Accept-Ranges: bytes
Content-Length: 19
Content-Type: text/html; charset=UTF-8
<h1>Test Page</h1>
3.MPM:102行
MPM:multipath processing modules,多道處理模塊;
httpd-2.2的MPM不支持DSO機制,且event爲測試模塊;
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker:指明用哪個模塊
查看httpd或httpd.worker程序的模塊列表:
httpd -M
httpd.worker -M
查看靜態編譯的模塊:
httpd -l
httpd.worker -l
與prefork相關的配置指令:
<IfModule prefork.c>
StartServers 8 在服務剛啓動時,預先fork幾個子進程;
MinSpareServers 5 最小預留的空閒子進程的數量;
MaxSpareServers 20 最多預留的空閒子進程的數量;
ServerLimit 256 爲MaxClients指定的最大值;
MaxClients 256 最大的併發訪問量;
MaxRequestsPerChild 4000
</IfModule>
與worker相關的配置指令:
<IfModule worker.c>
StartServers 4 在服務剛啓動時,預先fork幾個子進程;
MaxClients 300 並行訪問的上限;
MinSpareThreads 25 最小預留的空閒線程數量;
MaxSpareThreads 75 最大預留的空閒線程數量;
ThreadsPerChild 25 每個進程管理的最大線程數量;
MaxRequestsPerChild 0 每個子進程處理的最大請求數量;
</IfModule>
100個資源,500ms,256
512*86400/100=45W PV
UV: User View;
4.DSO機制:150行
LoadModule
LoadModule Module_Name modules/Module_File.so(模塊路徑)
modules目錄是相對於ServerRoot來說的相對路徑;
modules == /etc/httpd/modules
用於指定Apache的運行目錄,服務啓動之後自動將目錄改變爲當前目錄,在後面使用到的所有相對路徑都是想對這個目錄下
5."Main" Server 276行
定義了一個主機的基本指令:
ServerName FQDN[:PORT]
DocumentRoot "/var/www/html"
路徑映射:
http://172.16.69.1/test.html
配置示例:DocumentRoot "/myweb/data"
~]# mkdir -pv /myweb/data
~]# vim /myweb/data/index.html
重載配置文件;
客戶端訪問:http://172.16.69.1/index.html
默認是不需要指定的,服務器通過名字解析過程來獲得自己的名字,但如果解析有問題(如反向解析不正確),或者沒有DNS名字,也可以在這裏指定IP地址,當這項不正確的時候服務器不能正常啓動。前面啓動Apache時候提示正在啓動 httpd:httpd: apr_sockaddr_info_get() failed forjustin httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1forServerName,解決方法就是啓動該項把www.example.com:80修改爲自己的域名或者直接修改爲localhost
6.站點資源的訪問控制 302行
1) 基於文件系統的訪問控制
a.基於指定目錄的訪問控制
<Directory "/PATH/TO/SOME_DIR">
Directive Value
</Directory>
b.基於特定文件的訪問控制
<File "/PATH/TO/SOME_FILE">
Directive Value
</File>
c.基於模式匹配的方式進行文件的訪問控制
<FileMatch "PATTERN">
Directive Value
</FileMatch>
2) 基於URL路徑進行訪問控制
a.基於URL進行
<Location "/PATH/TO/SOME_URL">
Directive Value
</Location>
b.基於模式匹配的方式進行URL路徑訪問控制
<LocationMatch "URL_PATTERN">
Directive Value
</LocationMatch>
常用的目錄中的訪問控制指令:
Options指令:
取值可以是:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All
Indexes:允許索引,當web站點沒有主頁或主頁文件不可訪問時,在瀏覽器上會以索引的方式列表整個DocumentRoot中的資源給用戶選擇;一般用於資源下載站點;對於正常的Web站點來說,應禁用此功能;
None :什麼都沒有,建議選項
FollowSymLinks:跟蹤符號鏈接;
SymLinksifOwnerMatch:只有當子進程的所有者和鏈接文件的所有者爲同一用戶時,纔跟蹤符號鏈接;
ExecCGI:允許執行CGI腳本;
AllowOverride指令:
控制那些允許放置於.htaccess文件中的指令;
httpd允許在網站文檔根目錄及其各級子目錄中使用.htaccess文件進行資源訪問控制;凡是放置於.htaccess文件中的指令,有繼承的特性;建議將該指令的值設置爲None;
/myweb/data/.htaccess
/myweb/data/p_w_picpaths/.htaccess
/myweb/data/admin/.htaccess
Order指令、Allow指令及Deny指令;
Order指令:定義基於IP地址的訪問控制;Order指令規定了訪問控制的檢查順序;另一個執行順序:越是小範圍的限制,越有限執行;
Order allow,deny
Allow From IP/NETWOEK/FQDN/All
Deny From IP/NETWOEK/FQDN/All
NETWORK:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
7.web站點主頁文件名的定義:402行
DirectoryIndex index.html in.html index.html.var
當用戶給出的URL中沒有明確指明要訪問的資源具體的名稱時,服務器會根據此處填寫的文件名,依次去匹配;只要匹配成功,就返回對應資源;如果後面的文件名也存在能夠匹配的文件,也不予考慮;
8.定義路徑別名:551行
Alias /URL/ "/PATH/TO/SOME_DIR/"
注意:Alias指令中,URL右側"/"相當於後面的路由右側的"/",定義一些不在DocumentRoot下的文件,而可以將其映射到網頁根目錄中,這也是訪問其他目錄的一種方法
9.日誌:/var/log/httpd 484行
錯誤日誌:error_log
ErrorLog logs/error_log
LogLevel warn
訪問日誌:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" 統稱爲combined
CustomLog logs/access_log combined
%h Remote host,客戶端的IP地址
%l Remote logname,如果沒有登錄名,則記錄爲"-"
%u Remote user,記錄通過身份驗證之後訪問資源的用戶名稱;
%t Time the request was received (standard english format)
%r First line of request,請求報文的首行
%>s Status. For requests that got internally(內部地)redirected, this is the status of the *original* request --- %>s for the last. 狀態信息
%b Size of response in bytes, excluding HTTP headers. 資源大小
%{Referer}i The contents of Foobar: header line(s) in the request sent to the server. 訪問此頁面之前通過哪個超鏈接跳轉而來
%{User-Agent}i 客戶端程序或客戶端瀏覽器的相關信息
10.離線幫助手冊:
安裝:httpd-manual包
配置文件:/etc/httpd/conf.d/manual.conf
需要重載配置才能使之生效;
http://Server_ip/manual/
回顧:
httpd安裝
CentOS 6和CentOS 7的httpd的差異
httpd的配置:
Listen [IP:]PORT
KeepAlive
MPM:
prefork, worker, event
DSO:
LoadModules mod_name mod_path
httpd -M | httpd -l
Main Server
ServerName FQDN[:80]
DocumentRoot "/PATH/to/docs"
<Directory "/PATH/to/docs">
Options None
AllowOverride None
Order allow,deny
Allow From ...
Deny From ...
</Directory>
DirectoryIndex index.html index.html.varr
ALias /URL/ "/PATH/TO/SOME_DIR/"
ErrorLog logs/error_log
LogLevel warn
LogFormat "%h %l %u ... %{Referer}i" combined
CustomLog logs/access_log combined
httpd-2.2的基本配置(2)
11.基於用戶的訪問控制機制
http協議的認證功能:
認證質詢:
WWW-Authenticate:響應報文的狀態碼:401,拒絕客戶端請求;要求客戶端提供正確的賬戶和密碼,並說明原因;
認證:
Authorization:客戶端填寫賬號和密碼,之後發送該請求報文;認證通過之後,服務器纔會發送之前客戶端請求的資源的響應報文;
http的認證方式:
basic:明文認證
digest:消息摘要認證
虛擬用戶賬號:無法完成系統級訪問;只能用於訪問服務器上的某特定服務的用戶賬戶;
一般來講,虛擬用戶存儲於某特定格式的數據結構中:
文本文件;
SQL數據庫;
LDAP目錄數據庫;
安全域:需要用戶認證後才能訪問的資源的集合;通常會使用名稱對其進行標識;
basic認證的配置示例:
1.定義安全域:
基於虛擬用戶做身份驗證
<Directory "/PATH/TO/SOME_DIR">
Options None
AllowOverride None
Authtype basic
AuthName "說明"
AuthUserFile "/PATH/TO/HTTP_USER_FILE"
Require user user1 user2 ...
</Directory>
基於虛擬組做身份驗證
<Directory "/PATH/TO/SOME_DIR">
Options None
AllowOverride None
Authtype basic
AuthName "SOME_STRING"
AuthUserFile "/PATH/TO/HTTP_USER_FILE"
AuthGroupFile "/PATH/TO/HTTP_GROUP_FILE"
Require group group1 group2 ...
</Directory>
2.創建用戶/組的文件
htpasswd
htpasswd - Manage user files for basic authentication
-c:創建用戶賬戶文件,只是在創建第一個用戶的時候使用;
-m:使用md5加密用戶密碼
-s:使用sha加密用戶密碼
-D:刪除用戶
組文件:手動創建
GROUP_NAME: user1 user2 ...
12.系統狀態數據查詢:server-status
LoadModule status_module modules/mod_status.so
#<Location /server-status>
# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from .example.com
#</Location>
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.16
</Location>
ExtendedStatus On|Off:開啓或關閉更多的額外狀態信息;
13.虛擬主機
同一臺服務器上架構多個web站點的方法;
對於每個web站點,都有一個屬於其獨立的標識;
站點標識:
IP地址、PORT、主機頭(FQDN)
三種典型的虛擬主機實現方式:
基於IP地址的虛擬主機:
每個虛擬主機使用一個獨立的IP地址;
基於PORT的虛擬主機:
每個虛擬主機使用一個獨有的PORT;
基於FQDN的虛擬主機:
每個虛擬主機使用一個獨有的FQDN;
注意:Main Server和虛擬主機,不能同時使用;而且一旦虛擬主機被激活,則Main Server不再生效;
虛擬主機的配置方法:
<VirtualHost IP:80>
DocumentRoot /www/docs/dummy-host.example.com
ServerName dummy-host.example.com
# ErrorLog logs/dummy-host.example.com-error_log
# CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
vhosts-www1.conf
基於IP地址的虛擬主機示例:
/etc/httpd/conf.d/vhosts-www1.conf
<VirtualHost 172.16.69.1:80>
DocumentRoot "/myweb/vhosts/www1"
ServerName www1.qhdlink.com
</VirtualHost>
/etc/httpd/conf.d/vhosts-www2.conf
<VirtualHost 172.16.69.2:80>
DocumentRoot "/myweb/vhosts/www2"
ServerName www2.qhdlink.com
</VirtualHost>
基於PORT的虛擬主機配置示例:
前提:需要讓httpd事先監聽於指定的額外端口;
/etc/httpd/conf.d/vhosts-www3.conf
Listen 60080
<VirtualHost 172.16.69.1:60080>
DocumentRoot "/myweb/vhosts/www3"
ServerName www3.qhdlink.com
</VirtualHost>
基於FQDN的虛擬主機配置示例:
/etc/httpd/conf.d/vhosts-www4.conf
NameVirtualHost 172.16.69.1:80
<VirtualHost 172.16.69.1:80>
DocumentRoot "/myweb/vhosts/www4"
ServerName www4.qhdlink.com
</VirtualHost>
批量生成虛擬主機的配置文件及文檔根目錄:
1.list [vhost_name]
2.add [FQDN]
3.delete [FQDN]
4.modify [FQDN]
回顧:
基於用戶的訪問控制
虛擬主機
http協議的基礎知識
http協議的事務:request/response
http協議:無狀態(stateless)
cookie:
服務器:Set-Cookie
客戶端:Cookie
Session:服務器用於追蹤用戶的特殊數據結構的數據庫;
通常緩存於服務器的內存中;
URL:統一資源定位符:
scheme://host[:port]/<path>;param?query#flag
http協議的報文格式:http首部或http頭;
通用格式:
起始行(Start-Line)
首部(headers)
...
主題(body)
請求報文首部(request headers):
<Method> <request-URL> <Version>
<header: > value
<body>
響應報文首部(response headers):
<Version> <Status-Code> <reason-phrase>
<header: > value
<body>
Method:請求方法:標明客戶端希望服務器端對資源執行的操作;
GET、HEAD、POST
WebDAV(分佈式版本協作):PUT、DELETE
OPTIONS、TRACE
協議查看或分析工具:
Linux:tcpdump、wireshark、tshark
Windows:wireshark、sniffer
request-URL:/test.html
Status-Code:狀態碼,三位十進制整數表示;
作用:標識請求處理過程的結果狀態;
1xx:100-101,信息提示;
2xx:200-206,成功類的響應狀態碼,如:200,OK;
3xx:300-305,重定向類的響應狀態碼,
301:永久重定向
302:臨時重定向
304:資源未被修改
4xx:400-415,客戶端錯誤類的響應狀態碼:
401:認證質詢
403:請求被拒絕,Forbidden;
404:客戶端請求的資源不存在,Not Found;
5xx:500-505,服務器端錯誤類的響應狀態碼;
500:服務器內部錯誤,Server Internal Error;
502:反代服務器與上游服務器之間的通信失敗,或者在有效時間內無法從上游服務器取回資源;
headers:首部內容
格式:
Name: Value
首部分類:
通用首部
請求首部
響應首部
實體首部
擴展首部
通用首部:請求報文和響應報文中都可以使用;
Date:報文創建的時間;
Connection:連接方式;keepalive,closed;
Via:經由,報文傳輸的過程中經由的代理節點的IP地址;
Cache-Control:緩存控制
請求首部:
Accept:可以接受的媒體類型;MIME
媒體格式:即MIME格式
Major/Minor,即主類型/次類型,常用的類型:
text/html
text/plaintext
p_w_picpath/jpeg
p_w_picpath/png
application/X-php
Accept-Charset:可以接受的字符集
ASCII:ANSI,單字節碼;
GBK
GB-2312
GB-18030
BIG-5
Accept-Encoding:可以接受的編碼格式;byte,gzip,deflate
Accept-Language:可以接收的語言;
Client-IP:客戶端IP地址;
Host:請求的服務器的名稱和端口號;也稱爲主機頭;
Referer:包含當前正在請求的資源的上一級資源;
User-Agent:客戶端代理程序;
條件式請求首部:
Expect:期望獲得的內容;
If-Modified-Since:自從某某時間之後資源是否被修改過;
If-Unmodified-Since:自從某某時間之後資源是否未被修改過;
If-Match:本地緩存中存儲的文件的ETag的值是否與服務器中對應資源的ETag值相同;
If-None-Match:本地緩存中存儲的文件的ETag的值是否與服務器中對應資源的ETag值不相同;
安全請求首部:
Authrization:向服務器發生用戶名和密碼;
Cookie:向服務器發生Cookie;
Cookie2:
響應首部:
信息性首部:
Age:響應持續的時長;
Server:服務器端使用的軟件程序的名稱、版本等信息;
Accept-Ranges:服務器端可以接受的請求類型的範圍;可以使用"*"來表示所有請求類型;
Vary:服務器查看的其他首部列表;
安全響應首部:
WWW-Authenticate:質詢握手
Set-Cookie:爲客戶端設定Cookie
Set-Cookie2:
實體首部:
Allow:對此實體可以使用的請求方法;
Location:資源的真正的URL地址;
Content-Encoding:資源內容的編碼格式;
Content-Language:資源內容的語言;
Content-Length:資源內容的長度;不包含首部長度;
Content-Location:真正實體資源的所在位置;
Content-Type:資源內容的類型;
跟緩存相關的實體首部:
ETag:
Expires:實體緩存的過期時間;
Last-Modified:實體的最近一次的修改時間;
擴展首部:X-eXtended
X-Forward-For:
X-Cache-Hit
《HTTP權威指南》前四五章
14.https實現:http over SSL
回顧幾個術語:PKI,CA,CRL,X.509,SSL/TLS
注意:SSL會話是基於IP地址所創建的,所以單IP地址的主機上,僅可以創建一個https虛擬主機;
創建CA:
1.創建CA的私鑰
(umask 077 ; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
2.生成CA的自簽證書:
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3653
3.完善CA所必需的目錄級文件要求和文本文件的要求:
touch /etc/pki/CA/index.txt
echo 01> /etc/pki/CA/serial
爲httpd生成私鑰並簽發證書:
1.生成私鑰及證書請求:
# mkdir /etc/httpd/ssl
# cd /etc/httpd/ssl
# (umask 077; openssl genrsa -out httpd.key 2048)
# openssl req -new -key httpd.key -out httpd.csr -days 3653
# scp httpd.csr 172.16.72.1:/tmp
2.在CA上籤發證書:
CA]# openssl ca -in /tmp/httpd.csr -out certs/httpd.crt -days 3653
CA]# scp certs/httpd.crt 172.16.69.1:/etc/httpd/ssl
3.在httpd服務器上清除證書請求文件:
rm -f httpd.csr
配置httpd支持使用ssl:
mod_ssl模塊已裝載,如果沒有相應模塊,需要安裝mod_ssl:
yum -y install mod_ssl
/usr/lib64/httpd/modules/mod_ssl.so
/etc/httpd/conf.d/ssl.conf
<VirtualHost 172.16.69.1:443>
DocumentRoot "/myweb/vhosts/ssl"
ServerName www.qhdlink.com
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
</VirtualHost>
補充內容:=============================================================
15、user/group
指定以哪個用戶的身份運行httpd服務進程;
User apache
Group apache
SUexec
16、使用mod_deflate模塊壓縮頁面優化傳輸速度
適用場景:
(1) 節約帶寬,額外消耗CPU;同時,可能有些較老瀏覽器不支持;
(2) 壓縮適於壓縮的資源,例如文件文件;
SetOutputFilter DEFLATE
# mod_deflate configuration
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
補充內容:=============================================================
httpd-2.4:
新特性:
1.MPM支持DSO機制,以模塊方式加載和卸載;
2.event MPM已經生產可用;production ready;
3.異步IO機制;異步讀寫機制;
4.支持每模塊及每目錄單獨日誌級別定義;
5.每請求相關的專用配置;
6.增強版的表達式分析器;
7.毫秒級的keepalive超時時長;
8.基於FQDN的虛擬主機無需使用NameVirtualHost指令;
9.支持用戶自定義變量;
10.更低的內在開銷;
新模塊:
mod_proxy_fcgi
mod_proxy_scgi
mod_remoteip
安裝httpd-2.4:
apr:Apache Portable Runtime,apache可移植運行時環境;
httpd-2.4依賴的apr的版本,不低於1.4版本;
在CentOS 6上:
只能編譯安裝httpd-2.4,需要先編譯apr-1.4+及apr-util-1.4+;
在CentOS 7上:
yum install httpd
httpd-2.4的配置環境:
主配置文件:
/etc/httpd/conf/httpd.conf
模塊配置文件:
/etc/httpd/conf.modules.d/*.conf
片段配置文件:
/etc/httdp/conf.d/*.conf
httpd-2.4特有的配置:
1.切換MPM
編輯配置文件/etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so
注意:在啓用某個MPM模塊時,其餘兩個必須被註釋;不能讓多個MPM同時生效;
2.基於IP地址的訪問控制:
不再支持allow,deny指令;而統一改用Require指令完成訪問控制功能;
允許所有主機訪問:Require all granted
拒絕所有主機訪問:Require all denied
注意:
1.默認情況下,只要沒有明確的指明允許,則拒絕所有主機訪問;
2.如果允許和拒絕同時要控制,則所有Require指令必須放在RequireAny容器中:
<RequireAny>
Require all denied
Require ip 172.16.69.1
</RequireAny>
<RequireAny>
Require all granted
Require not ip 172.16.69.1
</RequireAny>
<RequireAny>
Require all denied
Require host qhdlink.com
</RequireAny>
3.虛擬主機:
即便使用基於FQDN方式構建的虛擬主機也無需再使用NameVirtualHost指令;
<VirtualHost 172.16.72.1:80>
DocumentRoot "/myweb/vhosts/www"
ServerName www.qhdlink.com
<Directory "/myweb/vhosts/www"
Options None
AllowOverride None
Require all granted
</Directory>
<VirtualHost>
4.毫秒級的持久連接
需要單獨創建配置文件:/etc/httpd/conf.d/keepalive.conf
KeepAlive On
KeepAliveTimeout 500ms
MaxKeepAliveRequests 100
curl命令
curl是基於URL語法在命令行方式下工作的文件傳輸工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等協議。curl支持HTTPS認證,並且支持HTTP的POST、PUT等方法, FTP上傳, kerberos認證,HTTP上傳,代理服務器, cookies, 用戶名/密碼認證, 下載文件斷點續傳,上載文件斷點續傳, http代理服務器管道( proxy tunneling), 甚至它還支持IPv6, socks5代理服務器,,通過http代理服務器上傳文件到FTP服務器等等,功能十分強大。
curl [options] [URL...]
curl的常用選項:
-A/--user-agent <string> 設置用戶代理髮送給服務器
--basic 使用HTTP基本認證
--tcp-nodelay 使用TCP_NODELAY選項
-e/--referer <URL> 來源網址
--cacert <file> CA證書 (SSL)
--compressed 要求返回是壓縮的格式
-H/--header <line>自定義首部信息傳遞給服務器
-I/--head 只顯示響應報文首部信息
--limit-rate <rate> 設置傳輸速度
-u/--user <user[:password]>設置服務器的用戶和密碼
-0/--http1.0 使用HTTP 1.0
用法:curl [options] [URL...]
另一個工具:elinks
elinks [OPTION]... [URL]...
-dump: 不進入交互式模式,而直接將URL的內容輸出至標準輸出;
ab:Apache Bench,壓力測試工具;
-c:併發連接數
-n:請求總數
-k:使用keepalive