運維架構之httpd
Web Service
傳輸層:提供程序地址
Port number
tcp:傳輸控制協議,面向連線,通訊前需建立虛擬鏈路,結束後拆除;0-65535
udp:使用者資料報協議,無連線;0-65535
IANA
0-1023:眾所周知,永久分配給固定應用使用;22/tcp(ssh)、80/tcp(http)、443/tcp(https)
1024-41951:註冊埠,分配給程式設計師註冊為某服務使用;11211/udp、tcp(memcached)、3306/tcp(mysql)
41952+:客戶端程式隨機使用的埠;動態埠、私有埠;其範圍定義:/proc/sys/net/ipv4/ip_local_port_range
Socket:IPC的一種實現,允許位於不同主機(甚至同一主機)上的不同程序之間進行通訊;資料交換;Socket API
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAM:裸套接字
TCP協議的特性
建立連線,三次握手
將資料打包成段,校驗和(CRC-32)
確認、重傳、超時
排序、邏輯序號
流量控制,滑動視窗演算法
擁塞控制:慢啟動,擁塞避免演算法
Socket Domain(根據其所使用的地址)
AF_INET:Address Family,IPv4
AF_INET6:IPv6
AF_UNIX:同一主機上不同程序通訊時使用
每類套接字都至少提供了兩種Socket,流、資料報
流:可靠地傳遞,面向連線,無邊界
資料報:不可靠地傳遞,有邊界
套接字相關的系統呼叫
socket():建立一個套接字
bind():繫結
listen():監聽
accept():接收請求
connect():請求連線建立
write():傳送資料
read():接收資料
send()、recv()、sendto()、recvfrom()
http:hyper text transfer protocol
html:程式語言,超文字標記語言
CSS:Cascading Style Sheet
js:javascript
MIME:Multipurpose Internet Mail Extension
工作機制
http請求
http響應
Web資源,web resource
靜態檔案:jpg、gif、html、txt、js、css、mp3、avi
動態檔案:php、jsp
媒體
媒體型別(MIME型別):major/minor
text/html
text/plain
image/jpeg
image/gif
URI:Uniform Resource Identifier
URL:Uniform Resource Locator,用於描述某伺服器上某特定資源的位置
Scheme://Server:Port/path/to/resource
URN:Uniform Resource Naming
http協議版本
HTTP/0.9:原型版本,功能簡陋
HTTP/1.0:第一個廣泛使用的版本,支援MIME
HTTP/1.1:增強了快取功能
HTTP/2.0:
一次完整的http請求過程
- 建立或處理連線,接收請求或拒絕請求
-
接收請求
接收來自於網路的請求報文中對某資源的一次請求的過程
併發訪問響應模型(Web I/O)
單程序I/O結構:只啟動一個程序處理使用者請求,且一次只處理一個,多個請求序列響應
多程序I/O結構:並行啟動多個程序,每個程序響應一個請求
複用I/O結構:一個程序響應多個請求
多執行緒模型:一個程序生成多個執行緒,每個執行緒響應一個使用者請求
事件驅動:event-driven
複用的多程序I/O結構:啟動多個程序,每個程序響應多個請求
-
處理請求:對請求報文進行解析,並獲取請求的資源及請求方法等相關資訊
元資料:請求資料首部
<method><URL><VERSION>
Host:請求的主機名稱
Connection
-
訪問資源:獲取請求報文中請求的資源
web伺服器,即存放了web資源的伺服器,負責向請求者提供對方請求的靜態資源,或動態執行後生成的資源,這些資源放置於本地檔案系統某路徑下,稱為DocRoot
web伺服器資源路徑對映方式
docroot
alias
虛擬主機docroot
使用者家目錄docroot
-
構建響應報文
資源的MIME型別
顯式分類
魔法分類
協商分類
URL重定向
web服務構建的響應並非客戶端請求的資源,而是資源另外一個訪問路徑
- 傳送響應報文
- 記錄日誌
http伺服器程式
httpd(apache)
nginx
lighttpd
應用程式伺服器
IIS
tomcat,jetty,jboss,resin
webshpere,weblogic,oc4j
httpd的安裝配置和使用
httpd:apache
httpd的特性
高度模組化,core+modules
DSO:Dynamic Shared Object
MPM:Multipath Processing Modules
prefork:多程序模型,每個程序響應一個請求
一個主程序負責生成多個子程序,子程序稱為工作程序,主程序負責監聽套接字,每個子程序處理一個使用者請求,即便沒有使用者請求,也會預先生成多個空閒程序(≤1024),隨時等待請求到達
worker:多執行緒模型(多程序生成,一個程序生成多個執行緒),一個執行緒響應一個請求
event:事件驅動模型,一個執行緒響應多個請求
安裝方式
rpm
編譯安裝
CentOS6
程式環境
配置檔案
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服務指令碼
/etc/rc.d/init.d/httpd
配置檔案:/etc/sysconfig/httpd
主程式檔案
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
日誌檔案
/var/log/httpd
access_log:訪問日誌
error_log:錯誤日誌
站點文件目錄
/var/www/html
模組檔案路徑
/usr/lib64/httpd/modules
配置檔案的組成
Section 1:Global Environment
Section 2:”Main” server configuration
Section 3:Virtual Hosts
配置格式:directive value
directive:不區分大小寫
value:為路徑時,取決於檔案系統
常用配置
-
修改監聽的IP和埠
Listen [IP:]PORT
省略IP表示監聽本機的所有IP,Listen可重複出現多次
-
持久連線
Persistent Connection:連線建立,每個資源獲取完成後不會斷開連線,而是繼續等待其他的請求完成
如何斷開?
數量限制:100
時間限制:可配置
副作用:對併發訪問量較大的伺服器,持久連線功能會使有些請求得不到響應
折中:使用較短的持久連線時間
httpd-2.4支援ms級持久時間
非持久連線
KeepAlive On|Off
MaxKeepAliveRequests n
KeepAliveTimeout n
測試:telnet HOST PORT
GET /URL HTTP/1.1
Host:HOSTNAME or IP
-
MPM,Multipath Process Modules,多道處理模組
prefork、worker、event
httpd-2.2不支援同時編譯多個模組,所以只能編譯時選定一個,rpm安裝的包提供三個二進位制程式檔案,分別用於實現不同MPM機制的支援
確認方法:ps aux | grep httpd
預設為/usr/sbin/httpd,其使用prefork
檢視模組列表
檢視靜態編譯的模組
httpd -l
檢視靜態編譯及動態裝載的模組
httpd -M
更換使用的httpd程式
/etc/sysconfig/httpd
HTTPD=
重啟服務生效
prefork的配置
<IfModule prefork.c>
StartServers 8
伺服器程序啟動時啟動的程序數MinSpareServers 5
最小空閒程序數MaxSpareServers 20
最大ServerLimit 256
為MaxClients指定的在其生命週期內的最大值MaxClients 256
最大併發請求數MaxRequestsPerChild 4000
一個伺服器程序能響應的最大請求數</IfModule>
worker的配置
<IfModule worker.c>
StartServers 4
伺服器程序啟動時啟動的程序數MaxClients 300
伺服器端最大啟動的執行緒數MinSpareThreads 25
最小空閒執行緒數MaxSpareThreads 75
最大ThreadsPerChild 25
MaxRequestsPerChild 0
一個伺服器程序能響應的最大請求數</IfModule>
PV、UV
PV:Page View
UV:User View
獨立IP量
-
DSO
配置指令實現模組載入
LoadModule <mod_name> <mod_path>
模組路徑可使用相對地址,相對於ServerRoot(/etc/httpd)而言,/etc/httpd/modules
-
定義”Main” server的文件頁面路徑
DocumentRoot
文件路徑對映
DocumentRoot指向的路徑為URL路徑的起始位置
DocumentRoot “/var/www/html”
test/index.html –> http://HOST:PORT/test/index.html
-
站點訪問控制
可基於兩種型別的路徑指明對哪些資源進行訪問控制
檔案系統路徑
<Directory “”> </Directory>
<File “”> </File>
<FileMatch “正則表示式”> </FileMatch>
URL路徑
<Location “”> </Location>
<LocationMatch “”> </Location>
訪問控制機制
基於來源地址
基於使用者賬號密碼
-
Directory中基於來源地址實現訪問控制
-
Options
可用值:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All
Indexes:索引
FollowSymLinks:允許跟蹤符號連結檔案
- AllowOverride
-
基於來源地址的訪問控制機制
Order allow,deny
檢查次序,前為例外,後為預設機制Order deny,allow
Allow from all
Deny from all
來源地址
IP地址
NetAddr
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
-
Options
-
定義預設主頁面
DirectoryIndex index.html index.html.var
-
日誌設定
錯誤日誌
ErrorLog logs/error_log
LogLevel warn
debug, info, notice, warn, error, crit,
alert, emerg.訪問日誌
CustomLog logs/access_log combined
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
%h:客戶端IP地址
%l:Remote logname (from identd, if supplied). -表示為空
%u:Remote user(from auth; may be bogus if return status (%s) is 401)
%t:Time the request was received (standard english format)
%r:First line of request,請求報文的首行資訊
%s:響應狀態碼
%b:響應報文的大小,單位為byte,不包含響應報文首部
%{Referer}i:請求報文中”referer”首部的值,當前資源的訪問入口,及從哪個頁面中的超連結跳轉而來
%{User-Agent}i:請求報文中”User-Agent”首部的值,及發出請求用到的應用程式
詳情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
-
路徑別名
Alias /URL/ “PATH/TO/SOMEDIR/”
Alias /bbs/ “/forum/htdocs”
http: //www.123.com/bbs/index.html
–> /forum/htdocs/bbs/
-
設定預設字符集
AddDefaultCharset UTF-8
GBK、GB2312、GB18030
-
基於使用者的訪問控制
認證質詢
WWW-Authenticate:響應碼為401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼
認證
Authorization:客戶端使用者填入賬號和密碼後再次傳送請求報文,認證通過,則伺服器傳送響應的資源
認證方法
basic:明文
digest:訊息摘要
安全域:需要使用者通過認證後才能訪問的路徑
應該通過名稱對其進行標識,並用於告知使用者認證的原因
使用者的賬號和密碼儲存於何處
虛擬賬號:僅用於訪問某服務時用到的認證標識
儲存
文字檔案
SQL資料庫
ldap
nis
basic認證
-
定義安全域
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName “STRING”
AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”
Require user username1 username2 …
</Directory>
允許賬號檔案中的所有使用者登入訪問
Require valid-user
-
提供賬號和密碼儲存
使用htpasswd命令進行管理
htpasswd [options] passwordfile username
-c:自動建立passwordfile,因此,僅應該在新增第一個使用者時使用
-m:md5加密使用者密碼
-s:sha1加密使用者密碼
-D:刪除指定使用者
-
實現基於組進行認證
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName “STRING”
AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”
AuthGroupFile “/PATH/TO/HTTPD_GROUP_PASSWD_FILE”
Require group group1 group2…
</Directory>
要提供使用者賬號檔案和組檔案
組檔案:每行定義一個組
GRP_NAME:user1 user2…
-
定義安全域
-
虛擬主機
三種實現方案
基於IP
為每個虛擬主機準備至少一個IP地址
基於port
為每個虛擬主機準備至少一個專用port,實踐中少用
基於hostname
為每個虛擬主機準備至少一個專用hostname
可混合使用三種方式中任意方式
一般虛擬主機不要與中心主機混用,要使用虛擬主機,先禁用中心主機
禁用中心主機:註釋DocumentRoot
每個虛擬主機都有專用配置
<VirtualHost “IP:PORT”>
ServerName
DocumentRoot “”
<Directory “”>
</Directory>
</VirtualHost>
ServerAlias:虛擬主機的別名
ErrorLog
CustomLog
-
內建的status頁面
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from .example.com
</Location>
http協議和httpd的配置
URL:Uniform Resource Locator
URL方案:scheme
伺服器地址:ip:port
資源路徑
<Scheme>://<user>:<password>@<Server>:<Port>/<path/to/resource>;<params>?<query>#<frag>
params:引數
query:查詢
frag:錨定符
相對URL
絕對URL
http協議
http/0.9,http/1.0,http/1.1,http/2.0
http協議:stateless
伺服器無法持續追蹤訪問者來源
cookie,session
http事務
請求:request
響應:response
報文語法格式
request報文
<method> <request-URL> <version>
<headers>
<entity-body>
response報文
<version> <status> <reason-phrase>
<headers>
<entity-body>
method:請求方法,標明客戶端希望伺服器對資源執行的動作
GET、HEAD、POST、PUT、DELETE、OPTIONS、TRACE
version
HTTP/<major>.<minor>
status
三位數字:如200、301、302、404、502;標記請求過程中發生的情況
reason-phrase
狀態碼所標記的狀態的簡要描述
headers
每個請求或響應報文可包含任意個首部,每個首部都有首部名稱,後面跟一個冒號,而後跟上一個可選空格,接著是值
entity-body:請求時附加的資料或響應時附加的資料
method(方法)
GET:從伺服器獲取一個資源
HEAD:只從伺服器獲取文件的響應首部
POST:向伺服器傳送伺服器要處理的資料
PUT:將請求的主體部分直接儲存在伺服器上
DELETE:請求刪除伺服器上指定的文件
TRACE:追蹤請求到達伺服器中間經過的代理伺服器
OPTIONS:請求伺服器返回對指定資源支援使用的請求方法
協議檢視或分析工具:tcpdump、tshark、wireshark
status(狀態碼)
1xx:100-101,資訊提示
2xx:200-206,成功類的資訊
3xx:300-305,重定向
4xx:400-415,錯誤類資訊,客戶端錯誤
5xx:500-505,錯誤類資訊,伺服器端錯誤
常用狀態碼
200:成功響應,請求的所有資料通過響應報文的entity-body部分發送,OK
301:請求的URL指向的資源已經被刪除,但在響應報文中通過首部Location指明瞭資源現在所處的新位置;Moved Permanently
302:與301相似,但在響應報文中指定的為資源現在所處的臨時新位置;Found
304:客戶端發出了條件式請求,但伺服器上的資源未曾發生變化,則通過響應此響應狀態碼通知客戶端;Not Modified
401:需要輸入賬號和密碼才能訪問資源,Unauthorized
403:請求被禁止;Forbidden
404:伺服器無法找到客戶端請求的資源;Not Found
500:伺服器內部錯誤;Internal Server Error
502:代理伺服器從後端伺服器收到一條偽響應;Bad Gateway
headers
格式
Name: Value
首部的分類
通用首部
Date:報文的建立時間
Connection:連線狀態,keepalive、close
Via:顯示報文經過的中間節點
Cache-Control:控制快取
Pragma
請求首部
Accept:通知伺服器自己能夠接受的媒體型別
Accept-Charset:接受的字符集
Accept-Encoding:接受的編碼格式
Accept-Language:接受的語言
Client-IP
Host:請求的伺服器名稱和埠號
Referer:包含當前正在請求的資源的上一級資源
User-Agent:客戶端代理,瀏覽器型別
條件式請求首部
Expect
If-Modified-Since:自從指定的時間後,請求的資源是否發生過修改
If-UnModified-Since
If-None-Match:本地快取中儲存的文件的Etag是否與伺服器文件的Etag不匹配
If-Match
安全請求首部
Authorization:向伺服器傳送認證資訊,如賬號密碼
Cookie:客戶端向伺服器傳送cookie
Cookie2
代理請求首部
Proxy-Authorization:向代理伺服器認證
響應首部
資訊性
Age:響應持續時長
Server:伺服器程式軟體名稱和版本
協商首部:某資源有多種表示方法時使用
Accept-Ranges:伺服器可接受的請求範圍型別
Vary:伺服器檢視的其他首部列表
安全響應首部
Set-Cookie:向客戶端設定Cookie
Set-Cookie2
WWW-Authenticate:來自伺服器對客戶端的質詢認證表單
實體首部
Allow:列出對此實體可使用的請求方法
Location:告知客戶端真正的實體位於何處
Content-Encoding
Content-Language
Content-Length:實體的長度
Content-Location:實體真正所處位置
Content-Type:實體的物件型別
快取相關
Etag:實體的擴充套件標籤
Expires:實體的過期時間
Last-Modified:最後一次修改的時間
擴充套件首部
httpd-2.2
curl命令
curl是基於URL語法在命令列方式下工作的檔案傳輸工具,支援FTP、SFTP、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE、LDAP等協議,支援HTTPS認證,支援HTTP的POST、PUT等方法、FTP上傳
kerberos認證,HTTP上傳,代理伺服器,Cookie,使用者名稱/密碼認證
上傳下載斷點續傳,http代理伺服器管道,IPv6
socks5代理伺服器,通過http代理伺服器上傳檔案到FTP伺服器等
curl [option] URL
-A/–user-agent:設定使用者代理髮送給伺服器
–basic:使用http基本認證
-e/–referer URL:來源地址
–cacert FILE:CA證書
–compressed:要求返回的壓縮格式
-H/–header <line>:自定義頭部資訊傳遞給伺服器
-I/–head:只顯示響應報文首部資訊
–limit-rate:設定傳輸速度
-u/–user <user[:password]>:設定伺服器的使用者名稱和密碼
-0/–http1.0:使用HTTP1.0
elinks
elinks [option] URL
-dump:不進入互動模式,而直接將URL的內容輸出至標準輸出
使用mod_deflate模組壓縮頁面優化傳輸速度
適用場景
節約頻寬,額外消耗CPU,較老瀏覽器可能不支援
壓縮適於壓縮的資源,如文字檔案
https
http over ssl = https 443/tcp
SSL會話的簡化過程
- 客戶端傳送可供選擇的加密方式,並向伺服器請求證書
- 伺服器端傳送證書以及選定的加密方式給客戶端
-
客戶端取得證書並進行證書驗證
如果信任給其發證書的CA
a、驗證證書來源的合法性,用CA的公鑰解密證書上的數字簽名
b、驗證證書內容的合法性,完整性校驗
c、檢查證書的有效期限
d、檢查證書是否被吊銷
e、證書擁有者的名字,與訪問的目標主機要一致
- 客戶端生成臨時會話金鑰(對稱金鑰),並使用伺服器端的公鑰加密此資料傳送給伺服器,完成金鑰交換
-
伺服器用此金鑰加密使用者請求的資源,響應給客戶端
SSL會話是基於IP地址建立,所以單IP的主機上,僅可以使用一個https虛擬主機
配置httpd支援https
-
為伺服器申請數字證書
測試:通過私建CA發證書
a、建立私有CA
b、在伺服器建立證書籤署請求
c、CA簽證
-
配置httpd支援使用ssl及使用的證書
yum install mod_ssl
配置檔案:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
-
測試基於https訪問響應的主機
openssl s_client [-connect host:port] [-cert filename] [CApath directory] [-CAfile filename]
httpd自帶的工具程式
htpasswd:basic認證基於檔案實現時,用到的賬號密碼檔案生成工具
apachectl:httpd自帶的服務控制指令碼,支援start、stop
apxs:由httpd-devel包提供的,擴充套件httpd使用第三方模組的工具
rotatelogs:日誌滾動工具
access.log –>
access.log,access.1.log
access.log,access.1.log,access.2.log
suexec:訪問某些有特殊許可權設定的資源時,臨時切換至指定使用者進行
ab:apache benchmark
httpd壓力測試工具
ab
ab [options] URL
-n:總的請求數
-c:模擬的併發數
-k:以持久連線模式測試
ulimit -n:調整當前使用者所同時開啟的檔案數
webbench
http_load
jmeter
loadrunner
tcpcopy
httpd-2.4
新特性
- MPM支援執行DSO機制,以模組形式按需載入
- 支援event MPM
- 支援非同步讀寫
- 支援每模組及每個目錄分別使用各自的日誌級別
- 每請求配置:<If>
- 增強版的表示式分析器
- 支援ms級的keepalive timeout
- 基於FQDN的虛擬主機不再需要NameVirtualHost指令
- 支援使用者自定義變數
新模組
mod_proxy_fcgi
mod_ratelimit
mod_remoteip
修改了一些配置機制
不再支援使用Order,Deny,Allow來做基於IP的訪問控制機制
安裝httpd-2.4
-
CentOS6
httpd依賴於apr,apr-util,[apr-icon]
apr:apache portable runtime
編譯安裝步驟
1.4+版的apr和apr-util
前提:安裝開發環境,安裝pcre-devel
yum groupinstall “Development Tools” “Server Platform Development”
-
apr
./configure –prefix=/usr/local/apr
make && make install
-
apr-util
./configure –prefix=/usr/local/apr-util –with=/usr/local/apr
make && make install
-
groupadd -r apache
useradd -r -g apache apache
./configure –prefix=/usr/local/apache –sysconf=/etc/httpd2.4 –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-modules=most –enable-mpms-shared=all –with-mpm=prefork
make && make install
-
啟動服務
apachectl
-
apr
-
CentOS7
配置檔案
主配置檔案:/etc/httpd/conf/httpd.conf
模組配置檔案:/etc/httpd/conf.modules.d/*.conf
輔助配置檔案:/etc/httpd/conf.d/*.conf
mpm:以DSO機制提供,配置檔案00-mpm.conf
服務控制:systemctl {start|stop|restart|status|reload} httpd.service
配置
-
切換使用MPM
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
NAME:prefork、event、worker
- 修改”Main”Server的DocumentRoot
-
基於IP的訪問控制法則
允許所有主機訪問:Require all granted
拒絕所有主機訪問:Require all deny
控制特定IP訪問
Require ip IPADDR:授權指定來源地址的主機訪問
Require not ip IPADDR:拒絕指定來源地址的主機訪問
IPADDR
IP:192.168.100.100
Net/Mask:192.168.100.0/255.255.255.0
Net/Length:192.168.100.0/24
Net:192.168.100
控制特定主機訪問
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME
FQDN:特定主機
DOMAIN:指定域內的所有主機
<RequireAll>
Require all granted
Require not ip IPADDR
</RequireAll>
-
虛擬主機
基於IP、Port和FQDN都支援
基於FQDN的不再需要NameVirtualHost指令
-
ssl
啟用模組:LoadModule ssl_module modules/mod_ssl.so
-
服務指令碼
/etc/rc.d/init.d/httpd
本文摘自http://www.178linux.com/100298
-
切換使用MPM
有待驗證!