Web:是一個由許多互相鏈接的超文本組成的系統,通過互聯網訪問。 在這個系統中,每個有用的事物,稱爲一樣“資源”;並且由一個全局“統一資源標識符”(URI)標識;這些資源通過超文本傳輸協議(Hypertext Transfer Protocol)傳送給用戶,而後者通過點擊鏈接來獲得資源。
DARPA :
IANA:
衆所周知:
0-1023:管理員纔有權限,永久地分配給某應用使用;
註冊端口:
1024-41951:只有一部分被註冊,分配原則上非特別嚴格;
動態端口或私有端口: 內核分配的臨時端口
41952+:
/proc/sys/net//ipv4/ip_local_port_range:定義兩個數字,表示可以做爲臨時端口的起始數字和結束數字;定義哪個範圍內的端口作爲臨時端口
傳輸層協議:TCP,UDP,SCTP,DCCP
套接字類型:
tcp socket
udp socket
raw socket
TCP協議的功能:
連接建立 :建立一個通話
將數據打包成段:
校驗
確認、重傳以及超時
排序
序列號
流量控制:
緩衝區:發送緩衝、接受緩衝
滑動窗口:實現流量控制 去
擁塞控制:
慢啓動
擁塞避免算法
RFC:
IPC: 進程中的通信
socket:IPC的一種實現,用於同一或不同主機上的進程間的通信;
socket通信在domain中實現
識別一個socket的方法(socket地址格式)
domain:
Unix domain:基於socket機制實現同一主機不同進程間通信的一種方式:AF_UNIX,AF_LOCAL;地址是一個路徑名(文件)
IPv4 domain:AF_INET,基於socket機制藉助於ipv4協議實現不同主機(也可以是同一主機)上的進程間通信的機制;地址是32位的ipv4地址+16位的端口號
ipv6 domain:AF_INET6地址是128位的ipv6地址+16位的端口號;
socket的類型:
TCP:流式socket,sock_stream
可靠、雙向、面向字節流
udp:數據報式socket,
相關的系統調用:
socket():創建一個新的socket。
bind():綁定於一個套接字地址上
listen():監聽套接字;
accept():接收連接請求
connect():發起連接請求;
close():關閉連接
recv 接收請求 send 發送請求
read()讀請求
read()和write(): recv(), send(), recvfrom(), sendto()
TCP協議通過TCP狀態來標記當前處於通信過程的那個階段。
CLOSED, LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIME_WAIT, CLOSED
http協議:
http: Hyper Text Transfer Protocol
傳輸文本:HTML
html: Hyper Text Mark Language
html文本框架
<html>
<head>
<title>TITLE</title>
</head>
<body>
<h1>H1</h1>
<p></p>
<h2>H1</h2>
<p> <a href="admin.html">ToGoogle</a> </p>
</body>
</html>
css: Cascading Style Sheet層疊樣式表
html文檔的生成方式:
靜態:
動態:編程語言編寫的程序可輸出html格式的結果
php,jsp,asp .net
依賴腳本解釋器:
php:php解釋器
jsp:jvm
http協議報文:
request:
請求不同html文檔
response:
http協議:
http 0.9
http 1.0
MIME: Multipurpose Internet Mail Extesions多用途互聯網郵件擴展
http 1.1
http 2.0
spdy
web服務器:
理解用戶請求的資源格式不僅僅是純html格式的文檔
靜態資源
動態資源:
application/php
text/html超文本
text/plain文本
web資源:
資源類型:MIME
major/minor
text/html
text/plain
image/jpeg
image/gif
vedio/mpeg4
application/vnd.ms-powerpoint
資源名稱:URI 統一資源標記符
URL:統一資源定位符:描述一個特定服務器上某資源的特定位置。
http://www.magedu.com:80/download/bash-4.3.1-1.rpm
分爲三部分:
scheme(方案):http://
服務器:www.mageedu.com:80
特定服務器上的資源:/download/bash-4.3.1-2.rpm
CGI:Common Gateway Interface通用網關基礎
簡化版的http
http事務:一次請求及對應的響應
http方法:
GET:請求獲取一個資源,需要服務器發送
HEAD:跟GET近似,但其不需要服務響應請求的資源,而返回響應首部
POST:基於HTML表單向服務器提交數據,服務器常需要存儲此數據;(位置,通常爲關係型數據庫)
PUT:與get相反,向服務器發送資源;服務器通常需要存儲此資源;(位置:通常爲文件系統)
DELETE:刪除URL指向資源
options:探測服務器端對請求的URL所支持使用的請求方法
trace:跟一次請求中間所經過的代理服務器、防火牆或網關等
http狀態碼:
1xx:信息性狀態碼
2xx:成功狀態碼
200:OK
201:CRERTED
3xx:重定向類的狀態碼
301:moved permanently永久重定向,
302:found 臨時重定向,會在相應報文中使用”location:新位置”;
304:not modified
4xx:客戶端類錯誤
403:Forbidden請求被拒絕
404:Not Found資源不存在
405:Method Not Allowed方法不對,不允許你使用你的方法。
5xx:服務器類的錯誤
500:Internal Server Error服務器內部錯誤
502:Bad Gateway錯誤的網關,代理服務器從上游服務器收到一條僞相應
503:Service Unavailable服務暫時不可用
http協議:
協議首部:
name:value
例如:content-type:images/gif
分三類:
通用首部
請求首部
響應首部
http請求報文:
<method> <request-URL> <version>
請求方法-請求資源-協議版本
<HEADERS>
<entity-body>
請求實體
http響應報文:
<version> <status> <reason-phrase>
版本-狀態碼-原因短語
<HEADERS>
<entity-body>
相應首部
解釋:
<method>:請求方法
<request-URL>: 請求的資源,可以是相對路徑,如/images/log.jpg,也可以絕對路徑,如http://www.magedu.com/images.banner.jpg
<version>: http協議版本,格式HTTP/<major>.<minor>,例如HTTP/1.0, HTTP/1.1
<headers>:各種所可以使用的首部
<status>: 狀態碼
<reason-phrase>: 原因短語,指狀態碼的易讀信息
注意:http協議無狀態,stateless
cookie:標記信息
set-cookie
http協議版本:
http 0.9: 僅用於傳輸html文檔
http 1.0:引入MIME機制,從而支持多媒體數據;引入keep-alive(持久連接);緩存
http 1.1:更多請求方法,更精細緩存控制;持久連接(persistent);
http協議首部:
通用首部
請求首部
響應首部
實體首部
擴展首部:非標準首部,可由程序員自行創建;X-Forward-For, X-Via
通用首部:
Connection:定義c/s之間關於請求、響應的有關選項
Connection: keep-alive
Cache-Control: 緩存控制
請求首部:
Client-IP:
Host: 請求的主機
Referer: 指明瞭請求當前資源原始資源的URL
User-Agent: 用戶代理
Accept首部:
Accept: 服務端能夠發送的媒體的類型
Accept-Charset:
Accept-Encoding:
Accept-Language:
條件式請求:
跟安全相關請求:
Authorization:授權
Cookie:
響應首部:
Age:
Server: 向客戶說明自己的程序名稱和版本
協商首部:
vary:首部列表,服務器會根據列表中的內容挑一個最適用的版本發給客戶端
跟安全相關:
www-authencation
set-cookie
實體首部:
location:資源的新位置
allow: 允許對此資源使用的請求方法
內容相關的首部;
Content-Encoding: 內容編碼
Content-Language:語言
Content-Length:長度
Content-Location:
Content-Type:類型
緩存相關:
etag
expires
last-modified
一次web資源請求的具體過程(服務器角度):
建立連接
接收請求
處理請求
訪問資源
構建響應
發送響應
記錄日誌
連接:
連接套接字:(client, cport <--> server, sport)
監聽套接字:80端口
web服務器的I/O結構:
單進程模型:串行
多進程模型:每個進程響應一個用戶請求實現併發的效果
複用的I/O機制:一個進程生成多個線程,每個線程響應一個用戶請求
複用的I/O機制:多個線程,每個線程響應多個用戶請求;
web server:
httpd
nginx
lighttpd
gws
App Server:
IIS
tomcat, jetty, resin
weblogic
websphere
httpd:
ASF: Apache Software Fundation
httpd,
a patchy server = apache
httpd,
httpd的特性:
高度模塊化:core + modules
DSO:Dynamic Shared Object支持共享加載機制
MPM:Multipath Processing Module多道處理模塊
統稱,事實上又多個實現;
prefork:每個進程響應一個用戶請求,預先生成多個空閒進程;
select():1024
worker:啓動多個進程,每個進程生成多個線程,每個線程響應一個用戶請求;
event:啓動多個線程,每個線程響應N個請求;
event-driven:事件驅動
httpd的功能特性:
豐富用戶認證:基本認證和摘要認證
CGI:通用網關接口 原生支持perl CGI
虛擬主機:
基於端口、ip、主機名
反向代理:
負載均衡
用戶站點:
路徑別名:
第三方模塊:
安裝方式:
rpm包
源碼編譯
centos 6:httpd
配置文件:
/etc/httpd/conf.d/httpd.conf
/etc/httpd/conf.d/*.conf
服務腳本:
/etc/rc.d/init.d/httpd
腳本配置文件:/etc/sysconfig/httpd
模塊目錄:
/etc/httpd/modules: 鏈接文件
/usr/lib64/httpd/modules
主程序:
/usr/sbin/httpd: prefork
/usr/sbin/httpd.event: event
/usr/sbin/httpd.worker: worker
日誌文件目錄:
/var/log/httpd
access_log: 訪問日誌
error_log: 錯誤日誌
站點文檔根目錄:
/var/www/html/images/a.jpg
http://www.magedu.com/images/a.jpg
httpd的配置文件說明:
# grep "Section" httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
主服務器的配置
虛擬主機配置
主服務器和虛擬主機一般不同時使用,默認僅啓用了主服務器;
指令參數:不區分字符大小寫,但其值有可能會區分大小寫
1、持久連接
KeepAlive {On|Off}
MaxKeepAliveRequests 100
KeepAliveTimeout 15
2、MPM參數:
<IfModule prefork.c> 多進程模式
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
<IfModule worker.c>多線性模式
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
啓動多少空閒進程
所允許最大併發請求用戶
最小空閒線性進程
最大空閒線性進程
每個子進程可以生成多少線性
每個線性可以處理多少個進程
event:事件驅動模型
指定監聽的地址和端口
listen [ip:]ro
listen 80
listen 8080
.....
此指令可重複指定多次
4、dso機制指定裝載的模塊
顯示:
#httpd -D DUMP_MODULES
LoadModule Module_Name /path/to/Module_File
“格式 模塊名稱 模塊路徑名字”
5指定站點跟目錄:網頁存放位置
documentroot “/path/to/somewhere"
6、站點路徑訪問控制
基於本地文件系統路徑
<directoty "/path/to/somewhere">
</directory>
基於URL訪問路徑做訪問控制
<Location "/path/to/URL">
</Location>
7、於Directory中可用的訪問控制
(1)options :定義訪問選項
indexes:當訪問的路徑下無默認的主頁面,將所有資源以列表形式呈現給用戶;危險,慎用;
followsymlinks:跳躍符合鏈接
(2)allowoverride
支持在每個頁面目錄下創建,htaccess用於實現對此目錄中資源訪問時的訪問控制功能
8、order基於ip做訪問控制
order allow,deny(拒絕)
allow from all
deny from172.16.100.17拒絕
allow from172.0.0/16允許訪問
from後面能接受的地址格式
IP, Network Address
網絡地址格式較爲靈活:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
9、定義默認的主頁面
directoryindex
10、配置日誌功能
日誌級別:LogLevel {debug|info|notice|warn|error|crit|alert|emerg}
日誌格式 LogFormat
訪問日誌CustomLog "/path/to/access_log" LogFormat_Name
指定錯誤日誌 ErrorLog "/path/to/error_log"
自定義日誌格式名稱
logformat日誌格式
%h:客戶端地址;
%l:遠程登錄名,
%u:認證時輸入的用戶名,沒有認證時爲-
%t:服務器收到 用戶請求時的時間
%r:請求報名的起始行;
%>s:響應狀態碼;
%b:響應報文的長度,單位是字節
%{header_name}i:記錄指定首部對應的值
11、路徑別名
站點根目錄:/www/html
http://www.magedu.com/images/logo/new.gif
此文件位置:/www/html/images/logo/new.gif
實現URL路徑的映射,從而所訪問的資源不再依賴於站點根目錄;
Alias /URL/ "/path/to/somewhere/"
12、設定默認字符集
字符集:GB2312,GB18030,GBK
13、CGI腳本 通用網關接口
CGI腳本路徑別名
/var/www/cgi-bin
http://server/cgi-bin/
base寫CGI腳本
所有文本都使用命令輸出:echo,printf,cat
執行程序;命令引用
Content-Type: text/html
<pre>
</pre>
fastCGI:快速CGI協議
14、基於用戶訪問控制
用戶認證:
基本認證:basic
摘要認證:digest
虛擬用戶:僅用於訪問某服務或獲取某資源的憑證;
文本文件:.htpasswd賬號是明文,密碼是加密的
sql數據庫中:
dbm:數據庫引擎。提供API。 將用戶賬號密碼
ldap;輕量級服務訪問協議
authentication provider:賬號和密碼存儲機制;
authorization provider: 授權
案例:基於文件做訪問控制
1) 基於用戶進行認證
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "Admin Area."
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
Require valid-user: 文件中所有用戶均可訪問
Require user USERNAME, ...
2)提供認證文件
htpasswd
-C:如果此文件事先不存在,則創建;注意,只能在創建第一個用戶使用。
-m:以md5的格式編碼存儲用戶的密碼信息
-D:刪除指定用戶
3)組認證
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "Admin Area."
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GROUP_NAME
</Directory>
組名:user1 user2 user3
15、虛擬主機
一個站點提供多個
虛擬主機:使用不同訪問路徑
基於端口
基於ip
基於主機名
1) 使用虛擬的前提:取消主服務器
註釋主服務器的站點根路徑指定:documentroot
2)定義虛擬主機
NameVirtualHost IP:PORT
<VirtualHost IP:PORT>
ServerName
DocumentRoot
ServerAlias
ErrorLog
CustomLog
</VirtualHost>
配置文件語法檢查:
httpd -t
service httpd configtest
配置示例:
<VirtualHost 172.16.100.7:80>
ServerName www.mageedu.com
DocumentRoot "/web/hosta"
</VirtualHost>
<VirtualHost 172.16.100.8:80>
ServerName www.mageedu.com
DocumentRoot "/web/hostb"
</VirtualHost>
<VirtualHost 172.16.100.8:8080>
ServerName www.mageedu.com
DocumentRoot "/web/hostc"
</VirtualHost>
測試:elinks
-dump:獲取到頁面數據後直接退出進程
16、https協議
ssl(安全的套接字層),tls(傳輸層安全)
http協議:文本編碼 明文 不安全
驗證:使用telnet發請求
# telnet 172.16.100.7 80
Trying 172.16.100.7...
Connected to 172.16.100.7.
Escape character is '^]'.
GET /index.html HTTP/1.0
Host: www.b.org
HTTP/1.1 200 OK
Date: Fri, 08 Aug 2014 03:03:51 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 08 Aug 2014 02:14:52 GMT
ETag: "e0009-12-50014c53e753f"
Accept-Ranges: bytes
Content-Length: 18
Connection: close
Content-Type: text/html; charset=UTF-8
<h1> Host B </h1>
Connection closed by foreign host.
httpd:ssl
ssl模塊
單獨成包
ssl會話基於IP地址創建,所以,每一個IP僅創建一個SSL會話;
ssl握手要完成的工作;
交換協議版本號
選擇雙方都支持的加密方式
客戶端對服務器端實現身份驗證
祕鑰交換
https協議:基於ssl二進制編碼,443/tcp
openssl s_client
客戶端驗證服務器端證書:
有效性檢測:證書是否仍然在有效期內
ca的可信度檢測
證書的完整性檢查;
持有者的身份檢查
配置httpd工作於https:
1、安裝mod_ssl模塊
# yum install mod_ssl
2、爲服務器端生成私鑰,併爲其提供證書;
# mkdir /etc/httpd/ssl && cd /etc/httpd/ssl
# (umask 077; openssl genrsa -out httpd.key 1024)
# openssl req -new -key httpd.key -out httpd.csr
簽署後的證書爲:/etc/httpd/ssl/httpd.crt
3、配置使用https的虛擬主機;
SSLCertificateFile
SSLCertificateKeyFile
<VirtualHost IP:443>
DocumentRoot
ServerName
</VirtualHost>
4、重新裝載配置
5、測試
# openssl s_client -connect IP:PORT -CAfile /path/to/ca_certificate
17、status頁面
httpd內嵌有handler,其中有一個handler用於輸出當前httpd服務相關狀態信息
handler:server-status
啓用handler要使用sethandler指令
18、訪問屬性配置總結
<Directory [~] "">
</Directory>
<File [~] "">
</File>
配置URL訪問路徑:
<Location [~] "">
</Location>
<LocationMatch "">
</LocationMatch>
/var/www/html/
images/
19、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的常用選項:
-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
20、使用mod_deflate模塊壓縮頁面優化傳輸速度
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
21、httpd程序包自帶的工具介紹
httpd:
Apache服務器程序
-t:測試配置文件
-l:列表靜態模塊
-D:DUMP_MODULES:列出DSO模塊
-M:
-D DUMP_VHOSTS: 列出所有虛擬主機
htpasswd:
爲基於文件的basic認證創建和更新用戶認證文件
apachectl:
腳本,httpd服務控制工具;
ab: apache benchmark
httpd的基準性能測試工具;
apxs:
httpd得以擴展使用第三方模塊的工具;
htcacheclean:
磁盤緩存清理工具;
htdigest:
爲digest認證創建和更新用戶認證文件
httxt2dbm:
爲rewrite map創建dbm格式的文件
rotatelogs:
不關閉httpd而切換其使用日誌文件的工具
access_log, access_log.1, access_log.2,
suexec:
User apache
Group apache
當httpd進程需要以另外的用戶的身份去訪問某些資源時,可以以suexec作臨時切換;
22、ab工具的初步使用
同類工具:http_load, webbench, seige
Usage: ab [options] [http[s]://]hostname[:port]/path
-c #: 模擬的併發數;
-n #: 總的請求數
-n的值一定要大於等於-c的值;
23、資源限定
軟限定:可臨時超出一定時長的上限
硬限定:絕對不可以超出上限
管理員可使用ulimit命令臨時性的修改各種資源的軟限制;
ulimit -n #:能同時打開文件數
-u #:能同時啓動的進程數
配置文件:
/etc/security/limits.conf
/etc/security/limits.d/*.conf
24、編譯安裝httpd-2.4
httpd-2.0, httpd-2.2, httpd-2.4
httpd程序依賴於apr和apr-util
apr: apache portable runtime
httpd-2.4的新特性:
1)MPM支持在運行時裝載;
--enable-mpms-shared=all --with-mpm={prefork|worker|event}
2)支持event mpm
3)異步讀寫
4)在每模塊及每目錄分別使用不同的日誌級別
5)每請求的配置;<If>,<Elseif>
6)增強版的表達式分析器
7)毫秒級的keep alive的timeout
8)基於FQDN的虛擬主機不再需要NameVirtualHost指令;
9)支持用戶使用自定義變量
新增了一些模塊:mod_proxy_fcgi, mode_ratelimit, mod_request, mod_remoteip
修改了一些配置機制:
不再支持使用order, allow, deny定義基於ip的訪問控制;改爲require
編譯安裝httpd-2.4
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-mpms-shared=all --with-mpm=event --enable-modules=most
# make && make install
基於IP做訪問控制:
允許所有主機訪問:Require all granted
拒絕所有主機訪問:Require all deny
控制某特定主機的訪問:
Require ip IPADDR
Require not ip IPADDR
IPADDR:
單個ip
Network/Netmask:
Network/Length: 172.16.0.0/16
Net: 172.16
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME:
FQDN:具體的主機
DOMAIN: 域內的所有主機