HTTP
web概述
Web是一種超文本信息系統,它的主要概念是超文本鏈接,它使得文本不會再像一本書一樣固定、線性的,而是從可以從一個位置跳到另外一個位置,正是由於可以實現這種多連接性我們才把它稱爲web
Web服務
Web服務通常可以分爲靜態Web服務與動態Web服務兩種
一、靜動之分
1、靜態Web服務是指採用靜態網頁對Web請求給予響應的一種方式
靜態Web服務最直觀的表現是,網站的Web的頁面只能格式化顯示電子文本,一經生成,無法改變其內容,只能更改網頁文件,這樣給網站的維護帶來了極大不便。到了後來也就出現動態網頁。
2、所謂的動態Web服務,是指跟靜態Web服務相對的一種網頁編程技術。相對靜態網頁而言,頁面代碼雖然沒有變,但是顯示的內容卻是可以隨着時間、環境或者數據庫操作的結果而發生改變的。不要將動態網頁和頁面內容是否有動感混爲一談。這裏說的動態網頁,與網頁上的各種動畫、滾動字幕等視覺上的動態效果沒有直接關係,動態網頁也可以是純文字內容的,也可以是包含各種動畫的內容,這些只是網頁具體內容的表現形式,無論網頁是否具有動態效果,只要是採用了動態網站技術生成的網頁都可以稱爲動態網頁。
而請求Web服務響應的對象,則稱爲客戶端,在Web客戶端不斷的增強其信息展現能力和客戶交互能力的同時,Web服務也悄悄的由靜態向動態逐步發展,不斷完善着。但最早的Web服務器只能響應Web客戶端發送的HTTP請求,並將存儲在Web服務器上的文件返回。如果要是能夠根據客戶的不同請求來動態的創建HTML文件,是不是會更好?基於這樣的理論也就產生了CGI(Common Gate Interface,通用網關接口)技術。
二、CGI技術
CGI是用於連接網頁和應用程序的接口,通過CGI的技術,可以實現在Web服務端進行數據庫查詢等複雜操作,並對其進行一系列操作後的數據進行封裝,動態產生HTML文件響應給客戶端,這爲客戶端和服務器端間交互動態信息起了傳輸紐帶的作用。
三、HTTP協議
HTTP(HyperText Transfer Protocol,超文本傳輸協議)是分佈式的Web應用的核心技術協議,該協議基於請求/響應模式,無狀態,在TCP/IP協議棧中屬於應用層,之所以說HTTP是無狀態協議,是因爲此協議一次請求和響應構成一個獨立的事務,各事務間沒有狀態的聯繫。
1、客戶端訪問Web服務器的幾個階段
建立請求
客戶端(瀏覽器)使用HTTP命令(GET或POST方法)向服務器發出Web請求。(在此處需要DNS能夠解析到服務器的IP地址後,通知到客戶端才能知道服務器在那裏)
接收連接
服務器端接收到請求後,服務器響應該請求,並在客戶和服務器之間建立連接。
處理請求
Web服務器查找客戶端所請求的資源,有兩種結果:其一,資源不存在,則服務器發送一個相應的錯誤提示文檔給客戶端。
訪問資源
其二,如果Web服務器查找到所需要的資源。
構建響應
則會將所請求的資源進行整合,並封裝。
發送響應
由服務器端發送響應到客戶端
記錄日誌
服務器端將資源傳輸到客戶端後,會將事務日誌處理過程記錄到日誌之中。
當客戶端瀏覽資源成功後,便會與服務器斷來連接。
三、HTTP各種特性
1、持久連接
KeepAliva {on|off}
MaxkeepAliveRequests 100
KeepAliveTimeout 15
2、MPM參數:prefork、worker、event
<Ifmodule prefork.c>
StartServers 8 啓動多少個進程
MinSpareServer 5 最小空閒進程
MaxSpareServer 20 最大空閒進程
ServerLimit 256最多多少進程
Maxclients 256最多客戶端數量
MaxrepuestsPerChild 4000 每個進程允許在其生命裏處理多少個請求
</IfModule>
3、指定監聽的地址和端口
Listen [IP:] PORT
此指令可以重複指定多次:
4、DSO機制裝載的模塊
顯示:
httpd -D DUMP_MODULES
loadModule Module_Name/path/to/module_file
5、指定站點根目錄
DocumentRoot ”/path/to/somewhere“
6、站點路徑訪問控制
基於本地文件系統路徑:
<Directory ”/path/to/somewhere“>
</Directory>
基於URL訪問路徑做訪問控制:
<Location "/path/to/URL"
</location>
7、於dirctory中可用的訪問控制
(1)Option
Indexes:當訪問的路徑下無默認主頁面時,將所有資源以列表的形式呈現給用戶非常危險,慎用
FollowSymlinks:跟蹤符號鏈接和Indexes一樣
(2) AllowOverride
支持在每個頁面下創建.htaccess用於實現對此目中資源訪問時的訪問控制功能。
8、基於IP做訪問控制
Order allow,deny
Allow from all
deny在前做白名單
allow在前做黑名單
rom後面能接受的地址格式:
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、配置日誌功能
Errorlog ”/path.to.error_log“ 錯誤日誌
loglevel {dedug|info|notice|warn|error|crit|alert|emerg} 日誌級別
logformat
customlog "/path/to/access_log"logformat_Name
%h;客戶端地址
%l:遠程登錄名,通常爲-
%u:認證時輸入用戶名,沒有認證時間爲-
%t:服務器收到用戶請求時間
%r:請求報名的起始行
%>s:響應狀態碼
%b:響應報文的長度,單位是字節
%{HEADER_NAME}i:記錄指定首部對應的值
11、路徑別名
實現URL路徑的映射,從而所訪問的資源不再依賴於站點根目錄
Alias /URL/ ”/path/to/somewhere“
12、設定默認字符集
字符集:GB2312、GB18030、GBK
adddefaultcharset
13、CGI腳本
CGI腳本路徑別名
/var/www/cgi-bin/
httpd://server/cgi-bin/
bash腳本寫CGI
所有文本都使用命令輸出:echo,printf,cat
執行程序:命令引用
fastCGI:協議
14、基於用戶做訪問控制
用戶認證:
基本認證:基於明文發送:basic
摘要認證:digest
虛擬用戶:不是用於登陸操作系統用戶,僅用於訪問某服務或獲取某資源的憑證
文本文件:.htpasswd
存放賬號密碼的地方:
SQL數據庫
dbm:基於文本文件存放的數據庫引擎,提供API
ldap:輕量級目錄訪問協議
authentication provider:賬號和密碼的存儲機制
authn
authorizetionprovider :授權
案例:基於文件做訪問控制
(1)基於用戶進行認證
(2)創建認證文件
Htpasswd
-c:此文件事先不存在,則創建,注意,只能在創建第一個用戶時使用
-m:以md5的格式存儲用戶的密碼信息
-D:刪除指定用戶
(3)組認證
先創建用戶,在創建組
15、虛擬主機
虛擬主機:使用不同的訪問路徑
基於端口
基於IP
基於主機名
(1)使用虛擬主機前提,要取消主服務器
註釋主服務器的站點根路徑指定:Documentroot
(2)定義虛擬主機
NameVirtualhost IP:PORT(2.2纔有2.4沒有)
NameVirtualhost *:PORT(監聽所有)
<Virtualhost IP:PORT>
ServerName
DocumentRoot
ServerAlias
ErrorLog
CustomLog
</Virtualhost>
配置文件語法檢查:
httpd -t
service httpd configtext
測試:elinks 文本遊覽器
-dump:獲取到頁面數據後直接退出進程
16、https協議
ssl(安全的套接字層),tls(傳輸層安全)
http:基於文本編碼(明文)
驗證:使用telnet發請求(http截圖)
http協議:文本編碼
驗正:使用telnet發請求
# telnet 172.16.249.53 80
Trying 172.16.249.53...
Connected to 172.16.249.53
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:51GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 08 Aug 201402: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 foreignhost.
httpd:ssl
ssl模塊
單獨成包
ssl會話基於Ip地址創建,所有,每一個IP僅創建一個ssl會話
ssl握手要完成的工作
交換協議版本號
選擇雙方都支持的加密方式
客戶端對服務器端實現身份驗證
密鑰交換
https協議:基於SSL二進制編碼,443/tcp
openssls_client
客戶端驗證服務器端證書:
有效期檢測:證書是否仍然在有限期內
CA的有效性檢測:是否能解密
證書籤名檢測:
持有者的分支檢測:
配置httpd工作於https模型:
1、安裝mod_ssl模塊
yum install mod_ssl
2、爲服務器生成私鑰,併爲其提供證書
mkdir /etc/httpd/ssl
3、配置實用https的虛擬主機
4、重新裝載配置
5、測試
openssl s_client -connect IP:PORT -cafile /path/to/ca_certificate
配置httpd工作於https:
(1) 安裝mod_ssl模塊
# yum install mod_ssl
(2) 爲服務端生成私鑰,併爲其提供證書;
# mkdir /etc/httpd/ssl && cd/etc/httpd/ssl
# (umask 077; openssl genrsa -outhttpd.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指令
handler:當文件被調用時,apache內部的表示形式:一般每種文件類型都有隱時處理器
18、訪問屬性配置總結
配置文件系統訪問路徑
<directory [~]"">
</directory>
<file [~]"">
</file>
配置URL訪問路徑:
<location [~]"">
</location>
<locationmatch "">
</locationmatch>
19、curl命令
-A/--user-agen<string> 設置用戶代理髮送給服務器
-e/--referer
-I
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 MIMEtypes
AddOutputFilterByType DEFLATEtext/plain
AddOutputFilterByType DEFLATEtext/html
AddOutputFilterByType DEFLATEapplication/xhtml+xml
AddOutputFilterByType DEFLATEtext/xml
AddOutputFilterByType DEFLATEapplication/xml
AddOutputFilterByType DEFLATEapplication/x-javascript
AddOutputFilterByType DEFLATEtext/javascript
AddOutputFilterByType DEFLATEtext/css
# Level of compression (Highest 9 -Lowest 1)
DeflateCompressionLevel 9
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4gzip-only-text/html
# Netscape 4.06-4.08 have some moreproblems
BrowserMatch ^Mozilla/4\.0[678]no-gzip
# MSIE masquerades as Netscape, butit is fine
BrowserMatch \bMSI[E] !no-gzip!gzip-only-text/html
21、httpd程序包自帶的工具介紹
httpd:
Apache服務器程序
-t:測試配置文件
-l:列表靜態模塊
-D DUMP_MODULES:列出DSO模塊
-M:相當於-t
htpasswd:
爲基於文件的basic認證創建和更新用戶認證文件
apachectl:
腳本,httpd服務器控制工具:Apache自帶
ab:Apache benchmark
httpd的基準性能測試工具
apxs:
httpd得以擴展使用第三方模塊的工具
htcacheclean:
磁盤緩存清理工具
htdigest:
爲digest認證創建和更新用戶認證文件
httxt2dbm:
爲rewrite map創建dbm格式的文件
rotatelogs:
不關閉httpd而切換其使用的日誌文件工具
suexec:
User apache
Group apache
當httpd進程需要以另外的用戶的身份去訪問某些資源時,可以以suexex作臨時切換
22、ab工具的初步使用
同類工具:http_load,webbench,seige,TCPcopy
Usage:ab [options] [http[s]://]hostname[:port]/path
-c #:模擬的併發數
-n #:總的請求數
-n的值一定要大於等於-c的值
23、資源限定:(# 代表數字)
ulimit
軟限定:
可臨時超出一定時長的上限
硬限定:
絕對不能超出的上限
管理員可使用ulimit命令臨時性的修改各自資源的軟限制:
ulimit -n # :能同時打開的文件數
-u # :能同時啓動的進程數
永久修改此限定需要修改配置文件:
/etc/security/limits.conf
/etc/security/limits/*.conf
24、編譯安裝httpd-2.4
httpd-2.0
httpd-2.4 C7
httpd-2.2 C6
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的虛擬主機不在需要NameVirtuahome
9、支持用戶自定義變量
新增了一些模塊:
mod_proxy_fcgi,mode_reateinit,mod_request,mod_remoteip
修改了一些配置機制:
不再支持使用order,allow,deny定義基於ip的訪問控制:改爲require
基於IP做訪問控制:
允許所有主機訪問:Require all granted
拒絕所有主機訪問:Require all deny
控制某特定主機的訪問:
require ip IPADDR
require not IPADDR
IPADDR:
單個ip
network/Netmask:
network/length:172.16.0.0/16
net:172.16
require host HOSTNAME
require not HOSTNAME
HOSTNAME:
FQDN:具體主機
DOMAIN:域內的所有主機