1. 程式人生 > >運維架構之httpd

運維架構之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請求過程

  1. 建立或處理連線,接收請求或拒絕請求
  2. 接收請求

    接收來自於網路的請求報文中對某資源的一次請求的過程

    併發訪問響應模型(Web I/O)

    單程序I/O結構:只啟動一個程序處理使用者請求,且一次只處理一個,多個請求序列響應

    多程序I/O結構:並行啟動多個程序,每個程序響應一個請求

    複用I/O結構:一個程序響應多個請求

    多執行緒模型:一個程序生成多個執行緒,每個執行緒響應一個使用者請求

    事件驅動:event-driven

    複用的多程序I/O結構:啟動多個程序,每個程序響應多個請求

  3. 處理請求:對請求報文進行解析,並獲取請求的資源及請求方法等相關資訊

    元資料:請求資料首部

    <method><URL><VERSION>

    Host:請求的主機名稱

    Connection

  4. 訪問資源:獲取請求報文中請求的資源

    web伺服器,即存放了web資源的伺服器,負責向請求者提供對方請求的靜態資源,或動態執行後生成的資源,這些資源放置於本地檔案系統某路徑下,稱為DocRoot

    web伺服器資源路徑對映方式

    docroot

    alias

    虛擬主機docroot

    使用者家目錄docroot

  5. 構建響應報文

    資源的MIME型別

    顯式分類

    魔法分類

    協商分類

    URL重定向

    web服務構建的響應並非客戶端請求的資源,而是資源另外一個訪問路徑

  6. 傳送響應報文
  7. 記錄日誌

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:為路徑時,取決於檔案系統

常用配置

  1. 修改監聽的IP和埠

    Listen [IP:]PORT

    省略IP表示監聽本機的所有IP,Listen可重複出現多次

  2. 持久連線

    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

  3. 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量

  4. DSO

    配置指令實現模組載入

    LoadModule <mod_name> <mod_path>

    模組路徑可使用相對地址,相對於ServerRoot(/etc/httpd)而言,/etc/httpd/modules

  5. 定義”Main” server的文件頁面路徑

    DocumentRoot

    文件路徑對映

    DocumentRoot指向的路徑為URL路徑的起始位置

    DocumentRoot “/var/www/html”

    test/index.html –> http://HOST:PORT/test/index.html

  6. 站點訪問控制

    可基於兩種型別的路徑指明對哪些資源進行訪問控制

    檔案系統路徑

    <Directory “”> </Directory>

    <File “”> </File>

    <FileMatch “正則表示式”> </FileMatch>

    URL路徑

    <Location “”> </Location>

    <LocationMatch “”> </Location>

    訪問控制機制

    基於來源地址

    基於使用者賬號密碼

  7. Directory中基於來源地址實現訪問控制
    1. Options

      可用值:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All

      Indexes:索引

      FollowSymLinks:允許跟蹤符號連結檔案

    2. AllowOverride
    3. 基於來源地址的訪問控制機制

      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

  8. 定義預設主頁面

    DirectoryIndex index.html index.html.var

  9. 日誌設定

    錯誤日誌

    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

  10. 路徑別名

    Alias /URL/ “PATH/TO/SOMEDIR/”

    Alias /bbs/ “/forum/htdocs”

    http: //www.123.com/bbs/index.html

    –> /forum/htdocs/bbs/

  11. 設定預設字符集

    AddDefaultCharset UTF-8

    GBK、GB2312、GB18030

  12. 基於使用者的訪問控制

    認證質詢

    WWW-Authenticate:響應碼為401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼

    認證

    Authorization:客戶端使用者填入賬號和密碼後再次傳送請求報文,認證通過,則伺服器傳送響應的資源

    認證方法

    basic:明文

    digest:訊息摘要

    安全域:需要使用者通過認證後才能訪問的路徑

    應該通過名稱對其進行標識,並用於告知使用者認證的原因

    使用者的賬號和密碼儲存於何處

    虛擬賬號:僅用於訪問某服務時用到的認證標識

    儲存

    文字檔案

    SQL資料庫

    ldap

    nis

    basic認證

    1. 定義安全域

      <Directory “”>

      Options None

      AllowOverride None

      AuthType Basic

      AuthName “STRING”

      AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”

      Require user username1 username2 …

      </Directory>

      允許賬號檔案中的所有使用者登入訪問

      Require valid-user

    2. 提供賬號和密碼儲存

      使用htpasswd命令進行管理

      htpasswd [options] passwordfile username

      -c:自動建立passwordfile,因此,僅應該在新增第一個使用者時使用

      -m:md5加密使用者密碼

      -s:sha1加密使用者密碼

      -D:刪除指定使用者

    3. 實現基於組進行認證

      <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…

       
       

  13. 虛擬主機

    三種實現方案

    基於IP

    為每個虛擬主機準備至少一個IP地址

    基於port

    為每個虛擬主機準備至少一個專用port,實踐中少用

    基於hostname

    為每個虛擬主機準備至少一個專用hostname

    可混合使用三種方式中任意方式

    一般虛擬主機不要與中心主機混用,要使用虛擬主機,先禁用中心主機

    禁用中心主機:註釋DocumentRoot

    每個虛擬主機都有專用配置

    <VirtualHost “IP:PORT”>

    ServerName

    DocumentRoot “”

    <Directory “”>

    </Directory>

    </VirtualHost>

    ServerAlias:虛擬主機的別名

    ErrorLog

    CustomLog

  14. 內建的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會話的簡化過程

  1. 客戶端傳送可供選擇的加密方式,並向伺服器請求證書
  2. 伺服器端傳送證書以及選定的加密方式給客戶端
  3. 客戶端取得證書並進行證書驗證

    如果信任給其發證書的CA

    a、驗證證書來源的合法性,用CA的公鑰解密證書上的數字簽名

    b、驗證證書內容的合法性,完整性校驗

    c、檢查證書的有效期限

    d、檢查證書是否被吊銷

    e、證書擁有者的名字,與訪問的目標主機要一致

  4. 客戶端生成臨時會話金鑰(對稱金鑰),並使用伺服器端的公鑰加密此資料傳送給伺服器,完成金鑰交換
  5. 伺服器用此金鑰加密使用者請求的資源,響應給客戶端

    SSL會話是基於IP地址建立,所以單IP的主機上,僅可以使用一個https虛擬主機

配置httpd支援https

  1. 為伺服器申請數字證書

    測試:通過私建CA發證書

    a、建立私有CA

    b、在伺服器建立證書籤署請求

    c、CA簽證

  2. 配置httpd支援使用ssl及使用的證書

    yum install mod_ssl

    配置檔案:/etc/httpd/conf.d/ssl.conf

    DocumentRoot

    ServerName

    SSLCertificateFile

    SSLCertificateKeyFile

  3. 測試基於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

新特性

  1. MPM支援執行DSO機制,以模組形式按需載入
  2. 支援event MPM
  3. 支援非同步讀寫
  4. 支援每模組及每個目錄分別使用各自的日誌級別
  5. 每請求配置:<If>
  6. 增強版的表示式分析器
  7. 支援ms級的keepalive timeout
  8. 基於FQDN的虛擬主機不再需要NameVirtualHost指令
  9. 支援使用者自定義變數

新模組

mod_proxy_fcgi

mod_ratelimit

mod_remoteip

修改了一些配置機制

不再支援使用Order,Deny,Allow來做基於IP的訪問控制機制

安裝httpd-2.4

  1. 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”

    1. apr

      ./configure –prefix=/usr/local/apr

      make && make install

    2. apr-util

      ./configure –prefix=/usr/local/apr-util –with=/usr/local/apr

      make && make install

    3. 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

    4. 啟動服務

      apachectl

  2. 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

    配置

    1. 切換使用MPM

      LoadModule mpm_NAME_module modules/mod_mpm_NAME.so

      NAME:prefork、event、worker

    2. 修改”Main”Server的DocumentRoot
    3. 基於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>

    4. 虛擬主機

      基於IP、Port和FQDN都支援

      基於FQDN的不再需要NameVirtualHost指令

    5. ssl

      啟用模組:LoadModule ssl_module modules/mod_ssl.so

    6. 服務指令碼

      /etc/rc.d/init.d/httpd

       本文摘自http://www.178linux.com/100298

                           有待驗證!