httpd詳解

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: 域內的所有主機



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章