http服務配置和apache


CentOS 6 httpd 程序環境

記錄了httpd的主進程編號:

 

 主程序文件:

/usr/sbin/httpd

/usr/sbin/httpd.worker

/usr/sbin/httpd.event

 主進程 文件 :

/etc/httpd/run/httpd.pid

 日志文件目錄:

/var/log/httpd

access_log: 訪問日志

error_log :錯誤日志

 

 幫助文檔包:

httpd-manual

Httpd 2.2 常見配置

 httpd 配置文件的組成:

 # grep "Section" /etc/httpd/conf/httpd.conf

 

### Section 1: Global Environment 全局環境

### Section 2: 'Main' server configuration 主服務器的配置(建立一個網站)

### Section 3: Virtual Hosts 虛擬主機的配置

 配置格式:directive value

directive: 不區分字符大小寫

value: 為路徑時,是否區分大小寫,取決於文件系統

55

Httpd 2.2 常見配置

 1 、顯示服務器版本信息

ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full

ServerTokens Prod[uctOnly] :Server: Apache

ServerTokens Major: Server: Apache/2

ServerTokens Minor: Server: Apache/2.0

ServerTokens Min[imal]: Server: Apache/2.0.41

ServerTokens OS: Server: Apache/2.0.41 (Unix)

ServerTokens Full (or not specified): Server: Apache/2.0.41

(Unix) PHP/4.2.2 MyMod/1.2

This setting applies to the entire server and cannot be

enabled or disabled on a virtualhost-by-virtualhost basis.

After version 2.0.44, this directive also controls the

information presented by the ServerSignature directive.

建議使用:ServerTokens Prod

 

Httpd 2.2 常見配置

 2 、修改監聽的IP 和Port

Listen [IP:]PORT

(1) 省略IP 表示 為本機所有IP

(2) Listen 指令至少一個,可 重復出現 多次

Listen 80

Listen 8080

示例:

Listen 192.168.1.100:8080

Lsten 80

 

Httpd 2.2 常見配置

 3、 、 持久連接

Persistent Connection :連接建立,每個資源獲取完成后不會

斷開連接,而是繼續等待其它的請求 完成,默認關閉持久連接

斷開條件:數量 限制:100

時間 限制, :以秒為單位, httpd-2.4 支持毫秒級

副作用:對並發訪問量較大的服務器,持久連接功能會使用有

些請求得不到響應

折衷:使用較短的持久連接 時間

: 設置: KeepAlive On|Off

 

KeepAliveTimeout 15

MaxKeepAliveRequests 100

測試: : telnet WEB_SERVER_IP PORT

GET /URL HTTP/1.1

Host: WEB_SERVER_IP

 

Httpd 2.2 常見配置

 4 、MPM( ( Multi-Processing Module )多路處理模塊

prefork, worker, event (試驗階段)

 

httpd-2.2 不支持同時編譯多個模塊,所以只能編譯時選

定一個;rpm 安裝的包提供三個二進制程序文件,分別用於實現

對不同MPM 機制的支持

確認方法:

ps aux | grep httpd

默認為/usr/sbin/httpd, 即prefork 模式

 

Httpd 2.2 常見配置

 查看模塊列表

 查看靜態編譯的模塊

httpd -l

 查看靜態編譯及動態裝載的模塊

httpd –M

 

 動態模塊加載:不需重啟即生效

 動態 模塊路徑

/usr/lib64/httpd/modules/

 

Httpd 2.2 常見配置

更換使用的httpd 程序:

 /etc/sysconfig/httpd

 

HTTPD=/usr/sbin/httpd.worker

將本來注釋掉的HTTPD WORKER模式 將注釋去掉,重啟服務生效

 

pstree -p|grep httpd 查看進程和線程

查看靜態模塊:

 

 Httpd 2.4 與之不同

以動態模塊方式提供

配置文件:/etc/httpd/conf.modules.d/00-mpm.conf

httpd –M |grep mpm

重啟服務 生效

 

pstree -p|grep httpd 查看進程和線程

 

Httpd 2.2 常見配置

 prefork 的默認配置:

<IfModule prefork.c>

StartServers 8

MinSpareServers 5

MaxSpareServers 20

ServerLimit 256 最多進程數, 最大20000

MaxClients 256 最大並發

MaxRequestsPerChild 4000 子進程最多能處理的請求

數量。在處理MaxRequestsPerChild 個請求之后, 子進程將

會被父進程終止,這時候子進程占用的內存就會釋放( 為0時 時

永遠不釋放)

</IfModule>

 

 

Httpd 2.2 常見配置

 worker 的默認配置:

<IfModule worker.c>

StartServers 4

MaxClients 300

MinSpareThreads 25

MaxSpareThreads 75

ThreadsPerChild 25

MaxRequestsPerChild 0 無限制

</IfModule>

測試worker性能:其他模型也可以測試

 

bHttpd 2.2 常見配置

 5 、DSO: : Dynamic Shared Object

 加載 動態模塊配置

/etc/httpd/conf/httpd.conf

配置指定實現模塊加載格式:

LoadModule <mod _name> <mod_path>

模塊文件路徑可使用相對路徑:

相對於ServerRoot (默認/etc/httpd) )

示例:

LoadModule auth_basic_module

modules/mod_auth_basic.so

 

Httpd 2.2 常見配置

 6 、定義'Main' server 的文檔頁面路徑

DocumentRoot "/path"

 

 

文檔路徑映射:

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

示例:

DocumentRoot "/app/data"

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

--> /app/data/test/index.html

注意:SELinux 和iptables 的狀態

 7、 、 定義站點主頁面

DirectoryIndex index.html index.html.var

 

Httpd 2.2 常見配置

 8 、站點訪問控制常見機制

可基於兩種機制指明對哪些資源進行何種訪問控制

訪問控制機制有兩種:客戶端來源地址,用戶賬號

 文件系統路徑:

<Directory "/path">

...

</Directory>

<File "/path/file">

...

</File>

<FileMatch "PATTERN">

...

</FileMatch>

 

Httpd 2.2 常見配置

 URL 路徑:

\后邊的都是URL路徑

 

<Location "">

...

</Location>

<LocationMatch "">

...

</LocationMatch>

 示例:

march后邊跟正則表達式

files后邊跟通配符

<FilesMatch "\.(gif|jpe?g|png)$">

<Files "?at.*"> 通配符

<Location /status>

<LocationMatch "/(extra|special)/data">

<Files "?at.*">

 

Httpd 2.2 常見配置

 9 、<Directory> 中"基於源地址"實現訪問控制

 (1) Options :后跟1 個或多個以空白字符分隔的選項列表

在選項前的+ ,- 表示增加或刪除指定選項

常見選項:

Indexes :指明的URL 路徑下不存在與定義的主頁面資源

相符的資源文件時,返回索引列表給用戶

 

FollowSymLinks :允許訪問符號鏈接文件所指向的源文件

 

允許訪問軟連接:

將軟連接功能去掉:

None :全部禁用

全部支持:(索引,軟連接。。。。。)

 

 

All: : 全部允許

目錄繼承父目錄的權限設置,如果想子目錄單獨設置如下圖,

在父目錄下設置

Httpd 2.2 常見配置

 示例:

 <Directory /web/docs>

Options Indexes FollowSymLinks

</Directory>

<Directory /web/docs/spec>

Options FollowSymLinks

</Directory>

 <Directory /web/docs>

Options Indexes FollowSymLinks

</Directory>

<Directory /web/docs/spec>

Options +Includes -Indexes

</Directory>

 

Httpd 2.2 常見配置

(2) AllowOverride

與訪問控制相關的哪些指令可以 放在指定目錄下的

.htaccess (由AccessFileName 指定)文件中,覆蓋之前的

配置指令

只對<directory> 語句有效

AllowOverride All: 所有指令都有效

AllowOverride None :.htaccess 文件無效

AllowOverride AuthConfig Indexes 除了AuthConfig

和 和Indexes 的其它指令都無法覆蓋

Httpd 2.2 常見配置

 (3) order 和allow 、deny

放在directory, .htaccess中

order :定義生效次序;寫在后面的表示默認法則(沖突的情況下,后面的優先;不沖突的情況下,都 生效)

Order allow,deny

Order deny,allow

Allow from, Deny from

 

 

 

權限拒絕

curl 192.168.37.106/test.html curl+ip地址 :測試該網段的服務

 

來源地址:

IP

網絡: 172.16

172.16.0.0

172.16.0.0/16

172.16.0.0/255.255.0.0

 

Httpd 2.2 常見配置

 示例:

<files "*.txt">

order deny,allow

deny from 172.16. 100.100

allow from 172.16

</files>

<files "*.txt">

order allow,deny

deny from 172.16.100.100

allow from 172.16

</files>

 

Httpd 2.2 常見配置

 10 、日志設定

日志類型:

訪問日志

錯誤日志

錯誤日志:

ErrorLog logs/error_log

LogLevel warn

loglevel 可選值:

debug, info, notice, warn,error

crit, alert, emerg

 

Httpd 2.2 常見配置

 訪問日志:

 定義 日志格式:LogFormat format strings

LogFormat "%h %l %u %t \"%r\" %>s %b

\"%{Referer}i\" \"%{User-Agent}i\"" combined

 使用 日志格式:

CustomLog logs/access_log combined

參考幫助:

http://httpd.apache.org/docs/2.2/mod/mod_log_config

.html#formats

 %h 客戶端IP 地址

 %l 遠程用戶, 啟用mod_ident 才有效,通常為減號"-" "

 %u 驗證(basic ,digest )遠程用戶, 非登錄訪問時,為

一個減號"-" "

74

Httpd 2.2 常見配置

• %t 服務器收到請求時的時間

• %r First line of request ,即表示請求報文的首行;記錄了

此次請求的"方法","URL" 以及協議版本

• %>s 響應狀態碼

• %b 響應報文的大小,單位是字節;不包括響應報文http 首部

• %{Referer}i 請求報文中首部"referer" 的值;即從哪個頁

面中的超鏈接跳轉至當前頁面的

• %{User-Agent}i 請求報文中首部"User-Agent" 的值;即

發出請求的應用程序

 

Httpd 2.2 常見配置

、設定默認字符集

AddDefaultCharset UTF-8

中文字符集:GBK, GB2312, GB18030

 

 

 

定義路徑別名

主站點路徑:

 

: 格式: Alias /URL/ "/PATH/"

DocumentRoot "/www/htdocs"

http://www.magedu.com/download/bash.rpm

==>/www/htdocs/download/bash.rpm

Alias /download/ "/rpms/pub/"

http://www.magedu.com/download/bash.rpm

==>/rpms/pub/bash.rpm

http://www.magedu.com/images/logo.png

==>/www/htdocs/images/logo.png

 

Httpd 2.2 常見配置

基於用戶的訪問控制

 認證質詢:WWW-Authenticate :響應碼為401 ,拒絕客戶端

請求,並說明要求客戶端提供賬號和密碼

 認證:Authorization :客戶端用戶填入賬號和密碼后再次發送

請求報文;認證通過時,則服務器發送響應的資源

 認證方式兩種:

basic :明文

digest :消息摘要認證, 兼容性差

 安全域:需要用戶認證后方能訪問的路徑;應該通過名稱對其進

行標識,以便於告知用戶認證的原因

 用戶的賬號和密碼

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

存儲:文本文件,SQL 數據庫,ldap 目錄存儲,nis等 等

 

Httpd 2.2 常見配置

 basic 認證配置示例:

(1) 定義安全域

<Directory "/path">(文件夾名稱)

Options None

AllowOverride None

AuthType Basic(用什么認證方法)

AuthName "String"(描述用戶密碼干嘛用的)

AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"(路徑)

Require user username1 username2 ...

</Directory>

 

 

允許賬號文件中的所有用戶登錄訪問:

Require valid-user

重新加載后:

 

Httpd 2.2 常見配置

 (2) 提供賬號和密碼存儲(文本文件)

使用專用命令完成此類文件的創建及用戶管理

htpasswd [options] /PATH/HTTPD_PASSWD_FILE username

-c :自動創建文件,僅應該在文件不存在時使用

-m :md5 格式加密,默認方式

-s: sha 格式加密

-D :刪除指定用戶

Httpd 2.2 常見配置

 基於組賬號進行認證

 

 (1) 定義安全域

<Directory "/path">

AuthType Basic

AuthName "String"

AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"

AuthGroupFile "/PATH/HTTPD_GROUP_FILE"

Require group grpname1 grpname2 ...

</Directory>

 

重新加載后,httpgroup2加載不了

 (2) 創建用戶賬號和組賬號文件;

組文件:每一行定義一個組

GRP_NAME: username1 username2 ...

Httpd 2.2 常見配置

 示例:

<Directory "/www/htdocs/admin">

Options None

AllowOverride None

AuthType Basic

AuthName "Administator private"

AuthUserFile "/etc/httpd/conf.d/.htpasswd"

AuthGroupFile "/etc/httpd/conf.d/.htgroup"

Require group webadmins

</Directory>

vim /etc/httpd/conf.d/.htgroup

webadmins:wang mage

 

Httpd 2.2 常見配置

 遠程客戶端和用戶驗證的控制

 Satisfy ALL|Any

ALL 客戶機IP 和用戶驗證都需要通過才可以

Any 客戶機IP 和用戶驗證, 有一個滿足即可

 

 示例:

Require valid-user

Order allow,deny

Allow from 192.168.1

Satisfy Any

82

Httpd 2.2 常見配置

 14 、虛擬主機

 : 站點標識: socket

IP 相同,但端口不同

IP 不同,但端口均為默認端口

FQDN 不同:

請求報文中首部

Host: www.magedu.com

 有三種實現方案:

基於ip :為每個虛擬主機准備至少一個ip 地址

基於port :為每個虛擬主機使用至少一個獨立的port

 

基於FQDN :為每個虛擬主機使用至少一個FQDN

 

 注意:一般虛擬機不要與main 主機混用;因此,要使用虛擬主機,

一般先禁用main 主機

禁用方法:注釋中心主機的DocumentRoot 指令即可

 

 

主配置文件 里面的最下邊有虛擬主機配置文件的例子

虛擬主機配置文件的例子(*:所有ip)

建立站點:

 

 

 

 

 

 

 

83

Httpd 2.2 常見配置

 虛擬主機的配置方法:

<VirtualHost IP:PORT>

Se rverName FQDN

DocumentRoot "/path"

</VirtualHost>

建議:上述配置存放在獨立的配置文件中

 其它可用指令:

ServerAlias :虛擬主機的別名;可多次使用

ErrorLog: : 錯誤日志

CustomLog :訪問日志

<Directory "/path">

</Directory>

Alias

 

84

Httpd 2.2 常見配置

 基於IP 的虛擬主機示例:

<VirtualHost 172.16.100.6:80>

ServerName www.a.com

DocumentRoot "/www/a.com/htdocs"

</VirtualHost>

<VirtualHost 172.16.100.7:80>

ServerName www.b.net

DocumentRoot "/www/b.net/htdocs"

</VirtualHost>

<VirtualHost 172.16.100.8:80>

ServerName www.c.org

DocumentRoot "/www/c.org/htdocs"

</VirtualHost>

85

Httpd 2.2 常見配置

 基於端口的虛擬主機:可和基於IP 的虛擬主機混和使用

listen 808

listen 8080

<VirtualHost 172.16.100.6:80>

ServerName www.a.com

DocumentRoot "/www/a.com/htdocs"

</VirtualHost>

<VirtualHost 172.16.100.6:808>

ServerName www.b.net

DocumentRoot "/www/b.net/htdocs"

</VirtualHost>

<VirtualHost 172.16.100.6:8080>

ServerName www.c.org

DocumentRoot "/www/c.org/htdocs"

</VirtualHost>

86

Httpd 2.2 常見配置

 基於FQDN 的虛擬主機:

 

NameVirtualHost *:80 httpd2.4 不需要此指令

<VirtualHost *:80>

ServerName www.a.com

DocumentRoot "/www/a.com/htdocs"

</VirtualHost>

<VirtualHost *:80>

ServerName www.b.net

DocumentRoot "/www/b.net/htdocs"

</VirtualHost>

<VirtualHost *:80>

ServerName www.c.org

DocumentRoot "/www/c.o rg/htdocs"

</VirtualHost>

 

Httpd 2.2 常見配置

 15 、status 頁面

LoadModule status_module modules/mod_status.so

<Location /server-status>

SetHandler server-status

Order allow,deny

Allow from 172.16

</Location>

ExtendedStatus On 顯示擴展信息

 

 練習:實現特定用戶身份驗證訪問

 

http 協議

 http 協議

http/0.9, http/1.0, http/1.1, http/2.0

 http 協議:stateless 無狀態

服務器無法持續追蹤訪問者來源

 解決http 協議無狀態方法

cookie 客戶端存放

session 服務端存放

 http 事務:一次訪問的過程

請求:request

響應:response

 

 

http 協議

 報文語法格式:

響應,請求報文首部:

 

 request 報文

<method> <request-URL> <version>

<headers>

<entity-body>

 response 報文

響應報文的首部:

 

<version> <status> <reason-phrase>

<headers>

<entity-body>

 method: 請求方法,標明客戶端希望服務器對資源執行的動作

GET 、HEAD 、POST 等

92

http 協議

 version:

HTTP/<major>.<minor>

 status:

三位數字,如200 ,301, 302, 404, 502; 標記請求處

理過程中發生的情況

 reason-phrase: :

狀態碼所標記的狀態的簡要描述

 headers: :

每個請求或響應報文可包含任意個首部;每個首部都有首

部名稱,后面跟一個冒號,而后跟一個可選空格,接着是一個值

 entity-body :請求時附加的數據或響應時附加的數據

93

http 協議

 Method 方法:

GET :從服務器獲取一個資源

HEAD :只從服務器獲取文檔的響應首部

POST :向服務器輸入數據,通常會再由網關程序繼續處理

PUT :將請求的主體部分存儲在服務器中,如上傳文件

DELETE :請求刪除服務器上指定的文檔

TRACE :追蹤請求到達服務器中間經過的代理服務器

OPTIONS :請求服務器返回對指定資源支持使用的請求方法

 協議查看或分析的工具:

tcpdump, wireshark,tshark

94

http 協議狀態碼分類

95

http 協議狀態碼分類

 status( 狀態碼): :

 1xx :100-101 信息提示

 2xx :200-206 成功

 3xx :300-305 重定向

 4xx :400-415 錯誤類信息,客戶端錯誤

 5xx :500-505 錯誤類信息,服務器端錯誤

96

http 協議常用的狀態碼(面試常問問題)

200: : 成功,請求數據通過響應報文的entity-body 部分發送;OK

 301: : (永久的重定向) 請求的URL 指向的資源已經被刪除;但在響應報文中通過首部

Location 指明了資源現在所處的新位置;Moved Permanently

 302: : (暫時的重定向 ) 響應報文Location置 指明資源臨時新位置 Moved Temporarily

 304: :(服務器端沒變化,客戶端利用緩存就行) 客戶端發出了條件式請求,但服務器上的資源未曾發生改變

,則通過響應此響應狀態碼通知客戶端;Not Modified

 401: : 需要輸入賬號和密碼認證方能訪問資源;Unauthorized

 403: : (權限拒絕)請求被禁止;Forbidden

 404: :(訪問的資源不存在) 服務器無法找到客戶端請求的資源;Not Found

 500: : 服務器內部錯誤;Internal Server Error

 502: : 代理服務器從后端服務器收到了一條偽響應,如無法連接到

網關;Bad Gateway

 503 – 服務器不可用,臨時服務器維護或過載,服務器無法處理請求

 504 – 網關超時

 

http 協議

 headers: :

 格式:

 Name: Value

Request URL:http://www.magedu.com/

Request Method:GET

Status Code:200 OK

Remote Address:101.200.188.230:80

Response Headers

view source

Connection:keep-alive

Content-Encoding:gzip

Content-Type:text/html; charset=UTF-8

Date:Sun, 29 Jan 2017 14:32:30 GMT

Server:Tengine

Transfer-Encoding:chunked

Vary:Accept-Encoding

X-Pingback:http://www.magedu.com/xmlrpc.php

98

http 協議

Request Headers

view source

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0

.8

Accept-Encoding:gzip, deflate, sdch

Accept-Language:zh-CN,zh;q=0.8

Cache-Control:max-age=0

Connection:keep-alive

Cookie:53gid2=10104634518015; 53gid0=10104634518015;

53gid1=10104634518015; 53revisit=1485699843851; 53uvid=1;

onliner_zdfq72145423=0; CNZZDATA1260642320=1664910013-1485697454-

%7C1485697454; visitor_type=old; 53kf_72145423_keyword=;

kf_72145423_keyword_ok=1;

Hm_lvt_4a78dc1643884da1c990c4c878832e70=1485699844;

Hm_lpvt_4a78dc1643884da1c990c4c878832e70=1485700088

Host:www.magedu.com

Upgrade-Insecure-Requests:1

User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36

(KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36

99

http 協議首部

 首部的分類:

 通用首部

 請求首部

 響應首部

 實體首部

 擴展首部

 通用首部:

Date: 報文的創建時間

Connection :連接狀態,如keep-alive, close

Via :顯示報文經過的中間節點(代理,網關)

Cache-Control :控制緩存,如緩存時長

MIME-Version: 發送端使用的MIME 版本

 

http 協議

 請求首部:

Accept :通知服務器自己可接受的媒體類型

Accept-Charset: : 客戶端可接受的字符集

Accept-Encoding :客戶端可接受編碼格式,如gzip

Accept-Language: : 客戶端可 接受的語言

Client-IP: 請求的客戶端IP

Host: 請求的服務器名稱和端口號

Referer :跳轉至當前URI 的前一個URL

User-Agent :客戶端代理,瀏覽器版本

 

http 協議

 條件式請求首部:

Expect :允許客戶端列出某請求所要求的服務器行為

If-Modified-Since :自從指定的時間之后,請求的資源是否

發生過修改

If-Unmodified-Since :與上面相反

If-None-Match :本地緩存中存儲的文檔的ETag 標簽是否與

服務器文檔的Etag 不匹配

If-Match :與上面相反

 安全請求首部:

Authorization :向服務器發送認證信息,如賬號和密碼

Cookie: 客戶端向服務器發送cookie

Cookie2 :用於說明請求端支持的cookie 版本

 代理請求首部:

Proxy-Authorization: 向代理服務器認證

 

http 協議

 響應首部:

 信息性:

Age :從最初創建開始,響應持續時長

Server :服務器程序軟件名稱和版本

 協商首部:某資源有多種表示方法時使用

Accept-Ranges :服務器可接受的請求范圍類型

Vary :服務器查看的其它首部列表

 安全響應首部:

Set-Cookie :向客戶端設置cookie

Set-Cookie2: 以上面相似

WWW-Authenticate :來自服務器對客戶端的質詢列表

103

http 協議

 實體首部:

Allow: 列出對此資源實體可使用的請求方法

Location :告訴客戶端真正的實體位於何處

Content-Encoding: 對主體執行的編碼

Content-Language: 理解主體時最適合的語言

Content-Length: 主體的長度

Content-Location: 實體真正所處位置

Content-Type :主體的對象類型,如text

緩存相關:

ETag :實體的擴展標簽

Expires :實體的過期時間

Last-Modified :最后一次修改的時間

104

curl 工具

 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 [options] [URL...]

-A/--user-agent <string> 設置用戶代理發送給服務器

-e/--referer <URL> 來源網址

--cacert <file> CA書 證書 (SSL)

-k/--insecure 行 允許忽略證書進行 SSL 連接

105

curl 工具常用選項

--compressed 要求返回是壓縮的格式

 

-H/--header <line> 自定義首部信息傳遞給服務器

-i 顯示頁面內容,包括報文首部信息

 

-I/--head 只顯示響應報文首部信息

-D/--dump-header <file> 將url 的header 信息存放在指定文件中

 

--limit-rate <rate> 設置傳輸速度

 

--basic 使用HTTP 基本認證

-u/--user <user[:password]> 設置服務器的用戶和密碼

 

-L 如果有3xx 響應碼,重新發請求到新位置(跳轉)

 

 

-o <file> 將網絡文件保存為指定的文件中

-O 使用URL 中默認的文件名保存文件到本地

-0/--http1.0 使用HTTP 1.0

 

 

curl 工具常用選項

-C - 選項可對文件使用斷點續傳功能

-c/--cookie-jar <file name> 將url 中cookie 存放在指定文件中

 

-x/--proxy <proxyhost[:port]> 指定代理服務器地址

-X/--request <command> 向服務器發送指定請求方法

-U/--proxy-user <user:password> 代理服務器用戶和密碼

-T 選項可將指定的本地文件上傳到FTP 服務器上

--data/-d 方式指定使用POST 方式傳遞數據

-b name=data 從服務器響應set-cookie 得到值,返回給服務器

 elinks 工具:

elinks [OPTION]... [URL]...

-dump: 非交互式模式,將URL 的內容輸出至標准輸出

-source: 打印源碼

107

mod_deflate 模塊

 使用mod_deflate 模塊壓縮頁面優化傳輸速度

 適用場景:

(1) 節約帶寬,額外消耗CPU ;同時,可能有些較老瀏覽器不支持

(2) 壓縮適於壓縮的資源,例如文本文件

LoadModule deflate_module modules/mod_deflate.so

SetOutputFilter DEFLATE

# 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

108

mod_deflate 模塊

 Level of compression (Highest 9 - Lowest 1)

 DeflateCompressionLevel 9

 排除特定舊版本的瀏覽器,不支持壓縮

Netscape 4.x 只壓縮text/html

BrowserMatch ^Mozilla/4 gzip-only-text/html

Netscape 4.06-08本 三個版本 不壓縮

BrowserMatch ^Mozilla/4\.0[678] no-gzip

Internet Explorer 標識本身為"Mozilla / 4 ",但實際上是

能夠處理請求的壓縮。 如果 用戶代理 首部匹配 字符串

" "MSIE "("B" " 為單詞 邊界") ,就 關閉之前定義的限制

BrowserMatch \bMSI[E] !no-gzip !gzip-only-

text/html

https

 https :http over ssl

 SSL 會話的簡化過程 (aparch不支持壓縮)

( 1) 客戶端發送可供選擇的加密方式,並向服務器請求證書

(2) 服務器端發送證書以及選定的加密方式給客戶端

(3) 客戶端取得證書並進行證書驗證

如果信任給其發證書的CA

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

(b) 驗證證書的內容的合法性:完整性驗證

(c) 檢查證書的有效期限

(d) 檢查證書是否被吊銷

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

(4) 客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密

此數據發送給 服務器,完成密鑰交換

(5) 服務用此密鑰加密用戶請求的資源,響應給客戶端

 注意:SSL 是基於IP 地址實現, 單IP 的主機僅可以使用一個https 虛擬主機

110

https 實現

 

 (1) 為服務器申請數字證書

測試:通過私建CA 發證書

(a) 創建私有CA

(b) 在服務器創建證書簽署請求

(c) CA 簽證

 (2) 配置httpd 支持使用ssl ,及使用的證書

yum -y 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]

111

http 重定向https

 將 將http 請求轉發至https 的URL

 重定向

Redirect [status] URL-path URL

 status 狀態:

 Permanent:Returns a permanent redirect status

(301) indicating that the resource has moved

permanently

 Temp:Returns a temporary redirect status (302).

This is the default

 示例:

Redirect temp / https://www.magedu.com/

112

HSTS

 HSTS:HTTP Strict Transport Security

服務器端配置支持HSTS 后,會在給瀏覽器返回的HTTP 首部中攜帶

HSTS 字段。瀏覽器獲取到該信息后,會將所有HTTP 訪問請求在內部

做 做307 跳轉到HTTPS 。而無需任何網絡過程

 HSTS preload list

是 是Chrome 瀏覽器中的HSTS 預載入列表,在該列表中的網站,使用

Chrome 瀏覽器訪問時,會自動轉換成HTTPS 。Firefox 、Safari、 、

Edge 瀏覽器也會采用這個 列表

 實現HSTS 示例:

vim /etc/httpd/conf/httpd.conf

Header always set Strict-Transport-Security "max-

age=15768000"

RewriteEngine on

RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]

113

httpd 自帶的工具程序

 httpd 自帶的工具程序

htpasswd :basic 認證基於文件實現時,用到的賬號密碼文件

生成工具

apachectl :httpd 自帶的服務控制腳本,支持start 和stop

apxs :httpd-devel 包提供,擴展httpd 使用第三方模塊工具

rotatelogs :日志滾動工具

access.log -->

access.log, access.1.log -->

access.log, acccess.1.log, access.2.log

suexec :訪問某些有特殊權限配置的資源時,臨時切換至指

定用戶身份運行

114

httpd 的壓力測試工具

 httpd 的壓力測試工具

 ab, webbench, http_load, seige

 Jmeter 開源

 Loadrunner 商業,有相關認證

 tcpcopy :網易,復制生產環境中的真實請求,並將之保存

 ab [OPTIONS] URL

來自httpd-tools包 包

-n :總請求數

-c :模擬的並行數

-k :以持久連接模式測試

 

ulimit –n # 調整能打開的文件數

 

練習

 1 、建立httpd 服務器,要求提供兩個基於名稱的虛擬主機:

(1)www.X.com ,頁面文件目錄為/web/vhosts/x; ; 錯誤日志為

/var/log/httpd/x.err ,訪問日志為/var/log/httpd/x.access

(2)www.Y.com ,頁面文件目錄為/web/vhosts/y ;錯誤日志為

/var/log/httpd/www2.err ,訪問日志為/var/log/httpd/y.access

(3) 為兩個虛擬主機建立各自的主頁文件index.html ,內容分別為其對應的主

機名

(4) 通過www.X.com/server-status 輸出httpd 工作狀態相關信息

2 、為上面的第2 個虛擬主機提供https 服務,使得用戶可以通過https 安全的

訪問此web 站點

(1) 要求使用證書認證,證書中要求使用的國家(CN) 、州(Beijing) 、城市

(Beijing) 和組織(MageEdu)

(2) 設置部門為Ops ,主機名為www.Y.com ,郵件為admin@Y.com

116

httpd-2.4

 新特性

 MPM 支持運行為DSO 機制;以模塊形式按需加載

 event MPM 生產環境可用

 異步讀寫機制

 支持每模塊及每目錄的單獨日志級別定義

 每請求相關的專用配置

 增強版的表達式分析式

 毫秒級持久連接時長定義

 基於FQDN 的虛擬主機不需要NameVirutalHost 指令

 新指令,AllowOverrideList

 支持用戶自定義變量

 更低的內存消耗

117

httpd-2.4

 修改了一些配置機制

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

 新模塊

 (1) mod_proxy_fcgi

FastCGI Protocol backend for mod_proxy

 (2) mod_remoteip

Replaces the apparent client remote IP address

and hostname for the request with the IP address list

presented by a proxies or a load balancer via the

request headers.

 (3) mod_ratelimit

Provides Bandwidth Rate Limiting for Clients

118

CentOS 7 httpd 程序環境

 CentOS 7 :httpd-2.4

 安裝方法:rpm ,編譯安裝

 Rpm 安裝程序環境:

 配置文件:

/etc/httpd/conf/httpd.conf

/etc/httpd/conf.d/*.conf

 模塊相關的配置文件:

/etc/httpd/conf.modules.d/*.conf

 systemd unit file: :

/usr/lib/systemd/system/httpd.service

 主程序文件:

/usr/sbin/httpd

httpd-2.4 支持MPM 的動態切換

119

CentOS 7 httpd 程序環境

 日志文件:

/var/log/httpd

access_log :訪問日志

error_log :錯誤日志

 站點文檔:

/var/www/html

 模塊文件路徑:

/usr/lib64/httpd/modules

 服務控制:

systemctl enable|disable httpd.service

systemctl {start|stop|restart|status} httpd.service

120

httpd-2.4 配置

 配置 應用 :

 (1) 切換使用的MPM

 Centos 7:/etc/httpd/conf.modules.d/00-mpm.conf

啟用 要啟用的MPM 相關的LoadModule 指令即 可

 centos6 編譯安裝:

vim /etc/httpd24/httpd.conf

Include /etc/httpd24/extra/httpd-mpm.conf

LoadModule mpm_event_module

modules/mod_mpm_event.so

 (2) 主目錄:

DocumentRoot /path

121

httpd-2.4 配置

 (3) 基於IP 的訪問控制:

無明確授權的目錄,默認拒絕

允許所有主機訪問:Require all granted

拒絕所有主機訪問:Require all denied

控制特定的IP 訪問:

Require ip IPADDR :授權指定來源的IP 訪問

Require not ip IPADDR :拒絕特定的IP 訪問

控制特定的主機訪問:

Require host HOSTNAME :授權特定主機訪問

Require not host HOSTNAME :拒絕

HOSTNAME: :

FQDN :特定主機

domin.tld :指定域名下的所有主機

122

httpd-2.4 配置

 不能有失敗,至少有一個成功 匹配才成功,即失敗優先

<RequireAll>

Require all granted

Require not ip 172.16.1.1 拒絕特定IP

</RequireAll>

 多個語句有一個成功, 則 成功,即成功優先

<RequireAny>

Require all denied

require ip 172.16.1.1 允許特定IP

</RequireAny>

123

httpd-2.4 配置

 (4) 虛擬主機

基於FQDN 的虛擬主機不再需要NameVirutalHost 指令

<VirtualHost *:80>

ServerName www.b.net

DocumentRoot "/apps/b.net/htdocs"

<Directory "/apps/b.net/htdocs">

Options None

AllowOverride None

Require all granted

</Directory>

</VirtualHost>

注意:任意目錄下的頁面只有顯式授權才能被訪問

124

httpd-2.4 配置

 (4) ssl: 安裝mod_ssl ,和httpd-2.2 相同配置

 (5) KeepAlive on

KeepAliveTimeout #ms

MaxKeepAliveRequests 100

毫秒級持久連接時長定義

125

Sendfile 機制

 用 不用 sendfile 的傳統網絡傳輸過程:

 read(file, tmp_buf, len)

 write(socket, tmp_buf, len)

 盤 硬盤 >> kernel buffer >> user buffer >> kernel socket buffer >> 協議棧

 到 一般網絡應用通過讀硬盤數據,寫數據到 socket 來完成網絡傳輸, 底層執行過程:

 1 用 系統調用 read() 從 產生一個上下文切換:從 user mode 到 切換到 kernel mode, ,

后 然后 DMA 個 執行拷貝,把文件數據從硬盤讀到一個 kernel buffer 里。

 2 從 數據從 kernel buffer 到 拷貝到 user buffer用 ,然后系統調用 read() 返回,這時

又產生一個上下文切換:從kernel mode 到 切換到 user mode

 3 用 系統調用 write() 從 產生一個上下文切換:從 user mode 到 切換到 kernel mode, ,

然后把步驟2到 讀到 user buffer 到 的數據拷貝到 kernel buffer (數據第2 次拷貝到

kernel buffer的 ),不過這次是個不同的 kernel buffer個 ,這個 buffer和 和 socket

相關聯。

 4 用 系統調用 write() 從 返回,產生一個上下文切換:從 kernel mode 到 切換到 user

mode( 第4 次切換), 然后DMA從 從 kernel buffer 拷貝數據到協議棧(第4 次拷貝)

 上面4 個步驟有4 次上下文切換,有4 次拷貝,如果能減少切換次數和拷貝次數將會

有效提升性能

126

Sendfile 機制

 在 在kernel 2.0+ 用 版本中,系統調用 sendfile() 就是用來簡化上面步

驟提升性能的。sendfile() 不但能減少切換次數而且還能減少拷貝

次數

 用 用 sendfile() 來進行網絡傳輸的過程:

 sendfile(socket, file, len);

 盤 硬盤 >> kernel buffer ( 快速拷貝到kernel socket buffer)

>> 協議棧

 1 用 系統調用 sendfile() 過 通過 DMA 到 把硬盤數據拷貝到 kernel

buffer被 ,然后數據被 kernel 與 直接拷貝到另外一個與 socket 相關

的 的 kernel buffer有 。這里沒有 user mode 和 和 kernel mode 之間的

在 切換,在 kernel 個 中直接完成了從一個 buffer 個 到另一個 buffer

的拷貝。

 2 DMA 從 把數據從 kernel buffer 直接拷貝給協議棧,沒有切換,

從 也不需要數據從 user mode 到 拷貝到 kernel mode ,因為數據就在

kernel 里 里

127

反向代理功能

 啟用反向代理

ProxyPass "/" "http://www.example.com/"

ProxyPassReverse "/" "http://www.example.com/"

 特定URL 反向代理

ProxyPass "/images" "http://www.example.com/"

ProxyPassReverse "/images" http://www.example.com/

 示例:

<VirtualHost *>

ServerName www.magedu.com

ProxyPass / http://localhost:8080/

ProxyPassReverse / http://localhost:8080/

</VirtualHost>

128

APR

 APR(Apache portable Run-time libraries ,Apache 可移植

運行庫) 主要為上層的應用程序提供一個可以跨越多操作系統

平台使用的底層支持接口庫。在早期的Apache 版本中,應用

程序本身必須能夠處理各種具體操作系統平台的細節,並針

對不同的平台調用不同的處理函數

 隨着Apache 的進一步開發,Apache 組織決定將這些通用的函

數獨立出來並發展成為一個新的項目。這樣,APR 的開發就從

Apache 中獨立出來,Apache用 僅僅是使用 APR 而已。目前

APR 主要還是由Apache 使用,由於APR 的較好的移植性,因

此一些需要進行移植的C 程序也開始使用APR ,開源項目比如

用於服務器壓力測試的 的Flood loader tester, , 該項目不僅僅

適用於Apache ,http://httpd.apache.org/test/flood

129

在 在centos6 編譯安裝httpd-2.4

 安裝httpd-2.4

 依賴於apr-1.4+, apr-util-1.4+, [apr-iconv]

 apr: : apache portable runtime ,解決跨平台實現

 CentOS 6 :默認:apr-1.3.9, apr-util-1.3.9

 安裝前准備開發包:

 開發環境包組:

Development Tools,Server

相關包:pcre-devel ,openssl-devel expat-devel

 下載源代碼並解壓縮:

httpd-2.4.27.tar.bz2

apr-1.6.2.tar.bz2

apr-util-1.6.0.tar.bz2

130

centos6 編譯安裝httpd-2.4 方法一

 安裝apr-1.4+

cd apr-1.6.2

./configure --prefix=/app/apr

make && make install

 安裝apr-util-1.4+

cd ../apr-util-1.6.0

./configure --prefix=/app/apr-util --with-

apr=/app/apr/

make -j 2 && make install

131

centos6 編譯安裝httpd-2.4 方法一

 編譯安裝httpd-2.4

cd ../httpd-2.4.27

./configure --prefix=/app/httpd24 --enable-so --

enable-ssl --enable-cgi --enable-rewrite --with-zlib

--with-pcre --with-apr=/app/apr/ --with-apr-

util=/app/apr-util/ --enable-modules=most --enable-

mpms-shared=all --with-mpm=prefork

make -j 4 && make install

132

centos6 編譯安裝httpd-2.4 方法二

 cp -av apr-util-1.6.0 httpd-2.4.27/srclib/apr-util

 cp -av apr-1.6.2 httpd-2.4.27/srclib/apr

 cd httpd-2.4.27/

./configure --prefix=/usr/local/httpd24 --enable-

so --enable-ssl --enable-cgi --enable-rewrite --

with-zlib --with-pcre --with-included-apr --

enable-modules=most --enable-mpms-shared=all --

with-mpm=prefork

make && make install

 Httpd 編譯過程:/usr/local/apache24/build/config.nice

 自帶的服務控制腳本:/usr/local/httpd24/bin/apachectl

133

在 在centos6 編譯安裝httpd-2.4

 vim /etc/profile.d/httpd24.sh

export PATH=/app/http24/bin:$PATH

 vim /etc/man.config

MANPATH /usr/local/apache24/man

 自 定義啟動腳本( 參考httpd-2.2 的服務腳本)

cp /etc/rc.d/init.d/httpd /etc/rc.d/init.d/httpd24

vim /etc/rc.d/init.d/httpd24

apachectl=/usr/local/httpd24/bin/apachectl

httpd=${HTTPD-/usr/local/httpd24/bin/httpd}

pidfile=${PIDFILE-/usr/local/httpd24/logs/httpd.pid}

lockfile=${LOCKFILE-/var/lock/subsys/httpd24}

chkconfig –add httpd24 ;chkconfig –list httpd24

 

 

 

 

 

 

 

 

實驗:實現基於basic驗證的目錄訪問

 

cat .htaccess

authname "Secret DIR"

authtype basic

authuserfile /etc/httpd/conf.d/.httpusers

authgroupfile /etc/httpd/conf.d/.htgroups

require group httpgroup2

 

 

 

實驗:實現基於FQDN虛擬主機

實驗之前要先看看防火牆,selinux策略是否關了么,如果沒關,就關掉

關閉selinux防火牆的方法:

iptable -F:關閉防火牆

setenforce 0:關閉selinux策略

getenforce:查看selinux策略

在atttp服務子配置文件

vim /etc/httpd/conf.d/test.conf

NameVirtualHost *:80

<virtualhost *:80>

documentroot /app/site1

servername www.a.com

errorlog logs/a.com.errlog

customlog logs/a.com.accesslog combined

</virtualhost>

<virtualhost *:80>

documentroot /app/site2

servername www.b.com

errorlog logs/b.com.errlog

customlog logs/b.com.accesslog combined

</virtualhost>

 

 

<virtualhost *:80>

documentroot /app/site3

servername www.c.com

errorlog logs/c.com.errlog

customlog logs/c.com.accesslog combined

</virtualhost>

 

實驗:啟用壓縮

SetOutputFilter DEFLATE

DeflateCompressionLevel 9

AddOutputFilterByType DEFLATE text/plain

AddOutputFilterByType DEFLATE text/html

 

實驗:實現HTTPS

 

1 yum install mod_ssl

2 vim /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt

SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key

SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem

 

 

實驗:在centos6.9編譯httpd2.4.28 方法1

 

實驗:在centos6.9編譯httpd2.4.28 方法2

 

 

 

 

 

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 

http中web服務的請求處理步驟

1:建立連接:用戶客戶端和web服務先建立連接,既三次握手,三次握手建立后;客戶端就可以向服務器發起請求了,

2:接收請求:發起請求后,web服務器收到請求,這個請求有請求報文的格式,請求報文要封裝請求報文的頭部,(客戶端發起請求三次握手后,將自己的請求封裝在請求報文中發出去,);

3:處理請求:HTTP服務器軟件進程處理請求:假設客戶端發起一個get獲取頁面請求,web服務看到是一個get請求,頁面通常是放在本機服務器的磁盤上的,所以web服務器就會去本機磁盤上去獲取這個資源,

4:獲取資源:獲取資源並不是http自己有能力獲取資源,因為http服務只是應用層的用戶空間的服務,用戶空間的程序是沒有權限訪問磁盤的;所以http服務將這個請求發送給內核空間處理,這個發送過程走的是系統調用,http通過系統調用將請求發送給內核,內核發現請求需要去磁盤上讀取數據,所以內核將請求發送給磁盤,把磁盤里的文件讀出來,讀出來后到達內核的緩沖器,中的內存空間,再從內存空間將數據復制到http,

5:構建響應: http收到資源后暫時放在自己的緩沖區,拿到數據后開始構建響應報文,封裝http報文頭的首部,

6:發送響應: 封裝報文后將數據發送出去

7:記錄事務處理過程: 數據發送出去后,將整個過程記錄在日志中,比如訪問的哪個頁面,等

 

 

提高HTTP連接性能

1:並行連接:通過多條TCP連接發起並發的HTTP請求

2:持久連接:keep-alive,長連接,重用TCP連接,以消除連接和關閉的時延,以事務個數和時間決定是否關閉連接

3:管道化連接:通過共享TCP連接發起並發的HTTP請求

4:復用的連接:交替傳送請求和響應報文(實驗階段)

一次完整的http請求處理過程

1:建立連接:接收或拒絕請求

2:接收請求:接收客戶端請求報文中對資源的一次請求過程

web訪問響應模型(web I/O)

單進程I/O模型:啟動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應

(來一個處理一個,處理完就沒事了,就算多個進程一下子來需要處理,也是要一個個來,先來后到,適合訪問量少的服務)

多進程I/O模型:並行啟動多個進程,每個進程響應一個連接請求

 

復用I/O結構:啟動一個進程,同時響應N個連接請求

實現方法:多線程模型和事件驅動

多線程模型:一個進程生成N個線程,每個線程響應一個連接請求

事件驅動:一個進程處理N個請求

復用的多進程I/O模型:啟動M個進程,每個進程響應N個連接請求,同時接收M*N個請求

處理請求:服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理

元數據:請求報文首部


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM