Httpd服務的配置和使用(基礎)

Http

端口定義

0-1023:永久分配給固定的應用使用,特權端口

1024-41951:也是註冊端口,要求不嚴格

41952+:客戶端隨即使用的端口,動態端口,或私有端口

BSD Socket :

IPC的一種實現,允許位於不同主機上的進程之間進行通訊

Socket API(封裝了內核中socket通信相關的系統調用)

SOCK_STREAMtcp套接字

SOCK_DGRAMUDP套接字

SOCK_RAWraw套接字

TCP協議的特性:

建立連接:三次握手

將數據打包成段:校驗和CRC32

確認、重傳及超時

排序:邏輯序號

流量控制:滑動窗口算

 

httphyper text transfer protocol,應用層協議,80/tcp

Htmlhyper text mark language,編程語言,超文本標記語言

 

<html>

<head>

<title>TITLE</title>

</head>

<body>

<h1></h1>

<p>……<a href=”http://www.baidu.com/download.html”>……</a></p>

<h2><h2>

</body>

</html>

 

CentOS 6

程序環境:

配置文件:

/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

 

服務控制和啓動:

chkconfig httpd on

service start/stop/restart/status/reload/configtest httpd

 

 

CentOS 7:

程序環境:

配置文件:

/etc/httpd/conf/httpd.conf

/etc/httpd/conf/*.conf

模塊相關配置文件:/etc/httpd/conf.modules.d/*.conf

systemd unit file:

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

主程序文件:

/usr/sbin/httpd

httpd-2.4支持MPM的動態切換

日誌文件:

/var/log/httpd/:

access_log:訪問日誌

error_log:錯誤日誌

站點文檔:

/var/www/html

模塊文件路徑:

/usr/lib64/httpd/modules

 

服務控制和啓動:

systemctl enable httpd.service

systemctl start/stop/restart/status httpd.service

 

Web Server :

 

httpd-2.2的常用配置:

主配置文件:

/etc/httpd/conf/httpd.conf

DirectoryIndex index.html 定義默認主頁名稱

DocumentRoot /var/www/html默認站點目錄

ServerRoot /etc/httpd 用於指定Apache的運行目錄,服務啓動之後自動將目錄改爲當前目錄,在後面所使用的所有相對路徑都是相對這個目錄的

#Section 1 : 全局環境變量

#Section 2 : 主服務配置

#Section 3 : 虛擬主機

cp -v httpd.conf {,.backup}   #編輯配置文件之前備份同名後綴爲“.backup”的文件

配置文件格式:

directive value

directive : 不區分大小寫

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

 

常用配置:

1. 修改監聽的IP和端口

Listen IP:PORT

不寫IP默認監聽所有IP

2. 修改監聽Socket 重啓即生效

3. 持久鏈接功能:TCP建立鏈接之後,每個最遠獲取完成後不斷開連接,而是繼續等待其他資源請求的進行

是否開啓:KeepAlive On/Off

斷開方法:

1. 數量限制

最大連接數:MaxKeepAliveRequests 100

2. 時間限制

超時時長:KeepAliveTimeout 10

Telnet 測試:

Telnet SERVER_IP PORT

GET /URL HTTP/1.1

Host: SERVER_IP

 

MPM模塊

http2.2不支持同時編譯多個MPM模塊,故只能編譯選定使用的那一個,CentOS 6 中轉麼能提供了三個應用程序文件,httpd(prefok), httpd.worker  httpd.event  分別用於實現對不同的MPM機智的支持

默認使用的爲/usr/sbin/httpd,爲preforkMPM模塊

查看httpd程序的模塊列表

# httpd -l

查看靜態編譯以及動態編譯的模塊

# httpd -M

更換使用httpd程序,來支持其他MPM機制

/etc/sysconfig/httpd

HTTPD=/usr/sbin/httpd.{worker,event}

 

重啓服務纔可生效

 

MPM(多處理模塊)配置:

prefork的配置:

<IfModule prefork.c>

StartServers 8    #啓動時啓動多少進程

MinSpareServers 5   #最小空閒進程

MaxSpareSercers 20   #最大空閒進程

ServerLimit 256    #最大在線進程數量

MaxClients 256    #這個是真正控制單臺hostApache真正能控制的最大        併發連接數。這個參數很重要,是你計算系統峯值時消耗        系統資源的主要依據

MaxRequestPerChild 4000 #每一個進程能處理的請求最大數量,之後必須銷燬

</IfModule>

 

worker的配置:

<IfModule worker.c>

StartServers         4

MaxClients         300

MinSpareThreads     25

MaxSpareThreads     75

ThreadsPerChild     25

MaxRequestsPerChild  0  #永久存在不執行銷燬

</IfModule>

 

 

PV/UV :

PV : PageView 頁面瀏覽量

UV : UserView

 

DSO :

配置指定實現模塊加載

LoadModule <mod_name>  <mod_path>

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

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

 

定義‘Main’server的文檔頁面路徑

修改DocumentRoot指向的路徑爲URL路徑的起始位置

相當於站點URL的根路徑

 

 

站點訪問控制常見機制

 

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

文件系統路徑

1. <Directory””>

……

</Directory>

2. <File””>

……

</File>

URL路徑 :

<Location “/”>

……

</Location>

 

<Directory>基於源地址實現訪問控制

1. Options後面跟一個或多個以空白字符分隔得選項列表

選項:

indexes: 指定的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返   回索引列表給用戶

Attention:測試Indexes功能時,務必要把/etc/httpd/conf.d/welcome.conf裏面的Option選項後面的“-”去掉,否則測試時只會加載默認歡迎頁面而不會列出Indexes

FollowSymLinks (跟蹤符號鏈接) : 允許跟蹤符號鏈接文件所指向的源文件

None :全部關閉

All:全部開啓

2. AllowOverride :

與訪問控制相關的哪些指令可以放在.htaccess文件(每一個目錄下都可以有一個)中;

All : 表示所有都可以放進去

None : 否上

3. Orderallowdeny

order: 定義生效次序,寫在後面的表示默認法則

Allow from, Deny from

來源地址:

IP:

NetAddr:三種格式:172.18

172.18.0.0

172.18.0.0/16

172.18.0.0/255.255.0.0

定義站點主頁面:

DirectoryIndex index,html index.html.var

 

定義路徑別名:

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

 

設定默認字符集:

AddDefaultCharset UTF-8

中文字符集:GBK/GB2312/GB18030

 

日誌設定:

日誌類型:訪問日誌   錯誤日誌

錯誤日誌:

ErrorLog logs/error_log

LogLevel warn

日誌級別:debug/info/notice/warn/error/alert/emerg

訪問日誌:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

CustonLog logs/access_log combined

LogFormat formatrr string:

%h : 客戶端IP地址

%l :RemoteUser 通常爲一個減號(“-”

%u : 非登錄訪問時,爲減號

%t : 服務收到請求的時間

%r : First line of request 表示請求報文的首行,記錄此次請求的方法,url以及協議版本

%>s : 響應狀態碼;

%b : 響應報文的大小,單位是字節,但是不包括響應報文的HTTP首部

%{referer}i : 請求報文中首部“referer”的值,即從哪個頁面中的超鏈接跳轉至當前頁面的,

%{User-Agent}i : 請求報文中首部“User-Agent”的值,即發出請求的應用程序;

 

基於用戶的訪問控制:

認證質詢:響應碼爲401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼

認證:客戶端用戶填入賬號和密碼後再次發送請求報文、認證通過時,則服務器發送響應的資源

認證方式有兩種:

basic:明文

digest : 消息摘要認證

安全域:需要用戶認證後方能訪問的路徑,應該䚒名稱對其進行標識,一遍告知用戶認證的原因

 

用戶的賬號和密碼存放位置:

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

存儲:

文本文件:

SQL數據庫

ldap目錄存儲

basic認證配置示例:

定義安全域

<Directory””>

Option None

AllowOverride None

AuthType Basic

AuthName “String”

AuthUserFile “/PATH/TO/HTTPF_USER_PASSWD_FILE”

Require User username1 username2 ……

</Directory>

 

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

Require vaild-user

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

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

htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE  username

-c 自動創建此處指定的文件,因此,僅應該在此文件不存在時使用

-m MD5加密

-s sha 格式加密

-D 刪除指定用戶

 

基於組賬號進行認證:

定義安全域

<Directory””>

Option None

AllowOverride None

AuthType Basic

AuthName “String”

AuthUserFile “/PATH/TO/HTTPF_USER_PASSWD_FILE”

AuthGroupFile “/PATH/TO/HTTPD_GROUP_FILE”

Require group gropname1 gropname2 ……

</Directory>

創建用戶賬號和組賬號文件:

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

GRP_NAME: username1 username2 ……

 

虛擬主機:不建議直接在/etc/httpd/conf/httpd.conf 中配置,建議單獨一個文件配置虛擬主機

 

站點標識:socket

IP相同,但端口不同

IP不同,但是端口均爲默認端口

FQDN不同:

請求報文首部實現

Hostwww.zhangwentao.com

 

三種實現方案:

基於IP:爲每一個虛擬主機準備至少一個IP地址

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

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

Attention: 一般的虛擬你不要與中心主機混用,因此,需要使用虛擬主機,要先禁用‘main’主機

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

 

虛擬主機的配置方法:

<VirtualHost IP:PORT>

ServerName FQND

DocumentRoot “”  虛擬主機站點那文件路徑

</VirtualHost>

 

其它可用指令:

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

ErrorLog:

CutomLog:

 

1.基於IP的虛擬主機示例:通過IP變化來實現虛擬主機

<VirtualHost 192.168.9.128:80>

ServerName www.zhangwentao.com

DocumentRoot “/www/zhangwentao.com/httpdocs”

</VirtualHost>

 

<VirtualHost 192.168.9.129:80>

ServerName www.zhangwentao.net

DocumentRoot “/www/zhangwentao.net/httpdocs”

</VirtualHost>

 

<VirtualHost 192.168.9.130:80>

ServerName www.zhangwentao.org

DocumentRoot “/www/zhangwentao.org/httpdocs”

</VirtualHost>

 

2.基於端口的虛擬主機配置示例:

Listen 808

<VirtualHost 192.168.9.128:80>

ServerName www.zhangwentao.com

DocumentRoot “/www/zhangwentao.com/httpdocs”

</VirtualHost>

 

<VirtualHost 192.168.9.128:808>

ServerName www.zhangwentao.net

DocumentRoot “/www/zhangwentao.net/httpdocs”

</VirtualHost>

 

<VirtualHost 192.168.9.128:8080>

ServerName www.zhangwentao.org

DocumentRoot “/www/zhangwentao.org/httpdocs”

</VirtualHost>

 

3.基於FQDN的虛擬主機:http-2.2版本中,虛擬主機要基於主機名需要加NameVirtualHost 

NameVirtualHost 192.168.9.128:80

<VirtualHost 192.168.9.128:80>

ServerName www.zhangwentao.com

DocumentRoot “/www/zhangwentao.com/httpdocs”

</VirtualHost>

 

<VirtualHost 192.168.9.128:80>

ServerName www.zhangwentao.net

DocumentRoot “/www/zhangwentao.net/httpdocs”

</VirtualHost>

 

<VirtualHost 192.168.9.128:80>

ServerName www.zhangwentao.org

DocumentRoot “/www/zhangwentao.org/httpdocs”

</VirtualHost>

status狀態頁面:

LoadModule status_module modules/mod_status.so

<Location /server-status>

SetHandler server-status

Order allow.deny

Allow from all #Allow from all 是極其危險的操作

</Location>

 

測試httpd服務時,注意SElinux 的問題

常見報錯:SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port 808. For complete SELinux messages run: sealert -l

 

http協議和httpd的配置:

 

URLUnifrom Resource Locator

http:// :默認端口爲80

https:// : 默認端口爲443

 

基本語法:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

params: 參數

query:

frag: 網站目錄定位

相對URL:同一個站點內

絕對URL:跨站點

 

http協議:

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

 

http協議:statuless

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

cookie session

 

http事務:

請求:request

響應:response

 

報文語法格式:

request報文:

<method><request-URL><version>

<headers>

 

<entity-body>

response報文

<version><status><reason-phrase>

<header>

 

<entity-body>

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

GET HEAD POST

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(狀態碼):

1XX100-101,信息提示,

2XX200-206,成功類響應

3XX300-305,重定向

4XX400-415,錯誤類信息(客戶端錯誤)

5XX500-505,錯誤類信息(服務器端錯誤)

 

常用的狀態碼:

200:成功,請求的所有數據通過響應報文的entitu-bodyOK

301:請求的URL資源已經被刪除;但在響應報文中通過首部Location  明瞭資源現在所知的新位置(永久重定向)

302:與301相似,但在響應報文中通過Location指明資源現在所處臨時新  位置(臨時重定向)

304:客戶端發出了條件式請求:但服務器上的資源未曾發生改變,通過  響應此狀態碼通知客戶端

401:需要輸入賬號和密碼認證之後方能訪問資源

403:請求被禁止,Forbidden

404:服務器無法找到客戶端請求的資源:Not Found

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

502:代理服務器從後端服務器收到了一條僞響應:Bad Gateway

Headers :

格式:

通用首部(既可以應用在請求報文首部也可以用在響應報文首部):

Date:報文的創建時間

Connection: 連接方式,如KeepAlive,Close

Via:顯示報文經過的節點

Catche-Control:控制緩存

請求首部:

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

Accept-Charset

Accept-Encoding:接受編碼格式,如gzip

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:列出對此實體可以使用的請求方法

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

 

Content-Encoding:內容的編碼格式

Content-Language:內容的語言

Content-Length:主體的長度

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

 

 

ontent-Type:主體對象類型

 

緩存相關:

ETag:實體的擴展標籤

Expires:實體的過期時間

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

 

HTTPD-2.2的常見配置:

curl命令:

curl是基於URL語法在命令行方式下工作的文件傳輸工具,它支持FTP/FTPS/HTTP/HTTPS/GOPHER/TELNET/DICT/FILE以及LDAP等協議

curl [options] URL

常用選項:

-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 

 

elinks [options] url

-dump :不進入交互式模式,而是直接將URL的內容全部列出

user/group:

指定以哪個用戶的身份運行httpd服務進程

User apache

Group apache

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

適用場景:

1. 節約帶寬,額外消耗CPU,可能較老的瀏覽器不支持

2. 壓縮適用於壓縮的資源,例如文本文件

 

 

https , http over ssl

SSL會話過程:

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

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

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

a) 如果信任給其頒發的證書CA

1. 驗證證書來源的合法性:用CA的公鑰解密證書上數字簽名

2. 驗證證書的內容的合法性:完整性驗證

3. 檢查證書的有效期限

4. 檢查證書是否被吊銷

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

 

b) 客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密此數據發送給服務器,完成密鑰交換

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

 

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

 

配置httpd支持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

SSLCertificatKeyFile

3. 測試基於https訪問相應的主機

# openssl s_client [connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]

 


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