httpd筆記之理論詳解優化配置(Apache)web入門

Linux的愛之初體驗web服務~~!!!(之所以這麼說我覺得這是進入Linux世界的第一個也是重要的一個服務)

文章叫長,懂的隨便看看可能有不對的地方請校正。小白看看也可以理解理解大白話寫的!


http 超文本傳輸協議筆記

傳輸層:tcp/udp提供進程地址

Port number:

tcp:傳輸控制協議,面向連接的協議;通信前需要建立虛擬鏈路;結束後拆除鏈路;數據流通信協議

0-65535 Linux中端口數

udpUser Datagram Protocol,無連接的協議;無連接的數據報文通信協議

0-65535

 

IANA:

0-1023:衆所周知,永久的分配給固定的應用使用,特權端口,22/tcp(ssh), 80/tcp(http), 443/tcp(https)  只有管理員擁有權限註冊使用

1024-41951:亦爲註冊端口,但要求並不是特別嚴格,分配給程序註冊爲某應用使用,11211/tcp, 11211/udp (memcached), 3306/tcp(mysql)

41952+:客戶端程序隨機使用的端口;動態端口,或私有端口;其範圍的定義:/proc/sys/net/ipv4/ip_local_port_range

客戶端訪問服務器端隨機生成端口,訪問服務器端的某固定端口。

 

套接字Socket: IPC的一種實現,允許位於不同主機(甚至同一主機)上不同進程之間進行通信;從而完成數據交換;也稱爲Socket API庫調用接口, 第一次出現在1983年,4.2 BSD系統上(伯克利系統分發版)。

SOCK_STREAMtcp套接字

SOCK_DGRAMudp套接字

SOCK_RAW: 裸套接字不借助UDP/TCP的接口進行通信

 

IPv4:

分類:

A1-127

B128-191

C192-223

D:組播,224-239

E240-254

 

私有地址:

A10.0.0.0/8

B172.16.0.0/16-172.31.0.0/16

C192.168.0.0/24-192.168.255.0/24

 

TCP協議的特性:

建立連接:三次握手

將數據打包成段:校驗和(CRC-32循環冗餘檢驗

確認、重傳以及超時:

報文排序:邏輯序號

流量控制:滑動窗口算法有接收緩存控制,快滿時暫停接收發送方流量小的情況下

擁塞控制:慢啓動和擁塞避免算法

 wKioL1kR16mR3yn8AANYorTyuSg522.png-wh_50

Socket Domain(根據其所使用的地址):socket又分爲三類

AF_INETAddress FamilyIPv4

AF_INET6IPv6

AF_UNIX:同一主機上不同進程之間通信時使用;

 

每類套接字都至少提供了兩種socket:流,數據報

流:可靠地傳遞、面向連接、無邊界;

數據報:不可靠地傳遞、有邊界、無連接;比如寄信,有信封,封裝多封就需要多個

 

套接字相關的系統調用:

socket(): 創建一個套接字;

bind():綁定

listen():監聽

accept():接收請求

connect():請求連接建立

write():發送

read():接收

send(), recv(), 發接

               sendto(), recvfrom() 發接

HTTP協議

http: hyper text transfer protocol, 80/tcp

html: 編程語言,超文本標記語言;

 

<html>

<head>

<title>TITLE</title>

</head>

<body>

<h1></h1>

<p> blabla... <a href="http://www.magedu.com/logo.jpg"> blabal </a> </p>

<h2></h2>

</body>

</html>

 

CSS: Cascading Style Sheet  級聯樣式表

js: javascript

 

MIME: Multipurpose Internet Mail Extesion多用途Internet郵件擴展

 

工作機制:

http請求

http響應

 

被請求的內容稱爲:Web資源:web resource

靜態文件:.jpg, .gif, .html, .txt, .js, .css, .mp3, .avi

動態文件:.php, .jsp,   (客戶端請求時不是直接反饋給客戶端而是先在服務器端執行一次)

比如:Windows瀏覽器需要藉助外部插件來工作,瀏覽器本身不具備打開圖片或視頻等而且根據文件的後綴名來決定藉助由客戶端的某個插件來打開

媒體:決定了客戶端的瀏覽器如何打開藉助那個插件

媒體類型(MIME類型):major/minor主類型/次類型

text/html  超文本文檔

text/plain  純文本文檔

image/jpeg  

image/gif

 

URI: Uniform Resource Identifier統一資源標識符

URL: Uniform Resorce Locator,用於描述某服務器某特定資源的位置;

Scheme://Server:Port/path/to/resource

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

URN: Uniform Resource Naming統一資源命名

 

http協議版本:

HTTP/0.9:原型版本,功能簡陋

HTTP/1.0:第一個廣泛使用的版本,支持MIME

HTTP/1.1: 增強了緩存功能

Spdy 

HTTP/2.0

 

rfc文檔讀一讀有助於瞭解 1.1 2.0

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

(1) 建立或處理連接:接收請求或拒絕請求

(2) 接收請求:

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

 

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

單進程I/O結構:啓動一個進程處理用戶請求,而且一次只處理一個;多個請求被串行響應;多個請求到來排隊,依次處理

多進程I/O結構:並行啓動多個進程,每個進程響應一個請求;

複用I/O結構:一個進程響應n個請求;借用一個複用I/O 處理器基於事件驅動機制

多線程模型:一個進程生成N個線程,每個線程響應一個用戶請求;

事件驅動:event-driven一個進程內部維持一個類似事件監控器,能夠監控着多個I/O使得一個服務器進程能夠同時連接多個請求針對怎麼知道每一個請求的連接與結束,在服務器編程時在內部基於事件回調的機制來完成連接狀態(i/o)的追蹤,並基於回調的狀態來完成連接與結束的響應。

 

複用的多進程/線程--I/O結構:啓動多個(m)進程,每個進程響應n個請求;

 

 

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

 

元數據:請求報文首部

<method>//請求的方法 <URL>//資源 <VERSION>//版本

Host: www.magedu.com   請求的主機名稱

Connection//指明此次連接使用的方式

 

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

 

web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源;這些資源放置於本地文件系統某路徑下,此路徑通常稱爲DocRoot

 

/var/www/html/

images/1.jpg

 

http://www.magedu.com/images/1.jpg

 

web服務器資源路徑映射方式:

(a) docroot

(b) alias

(c) 虛擬主機docroot

(d) 用戶家目錄docroot

 

(5) 構建響應報文

 

資源的MIME類型:標記的方法

顯式分類

魔法分類

協商分類

 

URL重定向:

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

 

(6) 發送響應報文

 

 

(7) 記錄日誌

 

http服務器程序:

httpd (apache)

nginx

Lighttpd  //德國人研發輕量級類似Nginx

 

應用程序服務器容器類動靜都能解析

IIS

tomcat, jetty, jboss, resin

webshpere, weblogic, oc4j

 

www.netcraft.com  //查看一些web服務器佔用市場的份額

 

httpd的安裝配置和使用:

httpd: apache

a  patchy server = apache

ASF: apache software foundation  //軟件基金會

 

httpd的特性:

高度模塊化:core + modules

DSO: Dynamic Shared Object  動態模塊機制

MPMMultipath Processing Modules  實現多種不同I/O模型機制

prefork:多進程模型,每個進程響應一個請求;每個主進程只負責監聽套接字,接收請求交給子進程處理請求。

一個主進程:負責生成n個子進程,子進程也稱爲工作進程,每個子進程處理一個用戶請求;即便沒有用戶請求,也會預先生成多個空閒進程,隨時等待請求到達;最大不會超過1024個;

worker:多線程模型,每個線程響應一個請求;

一個主進程:生成多個子進程,每個子進程負責生個多個線程,每個線程響應一個請求;


event:事件驅動模型,每個線程響應n個請求;

一個主進程:生成m個子進程,每個進程直接n個請求;

m進程,n線程:m*n

httpd-2.2: event爲測試使用

httpd-.24event可生產使用

 

CentOS 6:

 

程序環境

配置文件:

/etc/httpd/conf/httpd.conf

/etc/httpd/conf.d/*.conf  //補充性配置文件

服務腳本:

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

服務腳本自己的配置文件:/etc/sysconfig/httpd

主程序文件:

/usr/sbin/httpd       //prefork 默認使用的

/usr/sbin/httpd.event   //event

/usr/sbin/httpd.worker  //worker

日誌文件目錄:

/var/log/httpd

access_log: 訪問日誌

error_log:錯誤日誌  //啓動停止訪問錯誤等信息

站點文檔目錄:

/var/www/html

模塊文件路徑:

/usr/lib64/httpd/modules

 

配置文件的組成:

 ~]# grep "Section" /etc/httpd/conf/httpd.conf

### Section 1: Global Environment   //全局環境配置

### Section 2: 'Main' server configuration  //主服務器配置

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

 

配置格式:directive value  指令對應的值來完成 比如listen 80

directive: 不區分字符大小寫;

value: 爲路徑時,取決於文件系統;

 

常用配置:修改完配置文件 httpd -t 或者 service httpd configtest 測試語法

1、修改監聽的IPPort  //修改監聽端口需要restart

Listen [IP:]PORT

 

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


2、持久連接

Persistent Connection長連接):連接建立,每個資源獲取完成後不會斷開連接,而是繼續等待其它的請求完成;

如何斷開?

數量限制:100 資源請求默認100

時間限制:可配置   

副作用:對併發訪問量較大的服務器,持久連接功能會使用有些請求得不到響應;

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

httpd-2.4 支持毫秒級持久時間;

非持久連接

 

KeepAlive On|Off  //是否開啓

MaxKeepAliveRequests # //最大連接請求數量

KeepAliveTimeout #   //連接超時

 

測試:

telnet HOST PORT

GET /URL HTTP/1.1

Host: HOSTNAME or IP

wKioL1kR2A_hIXMbAAGt8Pu0zu4992.png-wh_50

3MPM

Multipath Process Module:多道處理模塊

prefork, worker, event

 

httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個;rpm安裝的包提供三個二進制程序文件,分別用於實現對不同MPM機制的支持;確認方法:

# ps aux  | grep httpd

wKiom1kR2GzxfA5tAAA94aml8H4748.png-wh_50


默認爲/usr/sbin/httpd, 其使用prefork

查看模塊列表:

查看靜態編譯的模塊

# httpd -l   ///httpd.worker  -l///httpd.event -l

Compiled in modules:

  Core.c   //核心模塊

  Prefork.c   /已經使用的

  http_core.c  //功能核心模塊

  mod_so.c   //支持模塊動態裝卸載的功能

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

# httpd -M   

 

更換使用的httpd程序:

/etc/sysconfig/httpd

HTTPD=

wKioL1kR2JeDXOtAAABYVBe_JMI214.png-wh_50

重啓服務生效;

 

prefork的配置:

<IfModule prefork.c>

StartServers       8  //服務啓動時啓動多少服務子進程

MinSpareServers    5  //最小空閒進程數

MaxSpareServers   20  //最大空閒進程數

ServerLimit      256   ///在服務器聲明週期內爲MaxClients生成數量

MaxClients       256   ///最大併發數

MaxRequestsPerChild  4000  //一個進程最多能夠響應多少次請求然後死掉

</IfModule> 

wKiom1kR2NqS-fQHAAApF1RkjWc946.png-wh_50


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有效訪問量;

4DSO

wKiom1kR2TKTdKDWAABNoui_-6Q744.png-wh_50

配置指令實現模塊加載

 

LoadModule <mod_name> <mod_path>

 

模塊路徑可使用相對地址

相對於ServerRoot(/etc/httpd)指向的路徑而言;

/etc/httpd/modules/

wKioL1kR2W3DbP5HAABJwtFzHnU850.png-wh_50

wKiom1kR2W7gi3jRAABvCUnNNnA222.png-wh_50

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

DocumentRoot

wKioL1kR2W-yB0QRAAAOn5YP7K0405.png-wh_50

文檔路徑映射:

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

DocumentRoot "/var/www/html"

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

 

6、站點訪問控制

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

文件系統路徑:

<Directory ""> </Direcotry>

wKiom1kR2bfx4E2qAAAHpCScjqE373.png-wh_50

<File ""> 

</File>


wKiom1kR2beCZmhcAAATFs91Whk998.png-wh_50

訪問控制機制:

基於來源地址;

基於賬號;

7Directory中“基於來源地址”實現訪問控制

wKiom1kR2gmwAFP-AABRi8HkepU166.png-wh_50


(1) Options  建議關閉(如果是下載網站打開不指定默認網頁可以打開網站上資源,非下載網站是不安全的在沒有定義默認頁的情況下同事http的也沒有做測試頁客戶端打開網站會獲取服務器端的所有網站資源)

比如默認根目錄下存放的沒有默認定義的主頁面(index.html)就會索引到根目錄下其他的文檔。

wKiom1kR2jGTgzL-AACO7IYACy8641.png-wh_50

所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews

  None, All

Indexes: 索引;//當訪問網站目錄下默認主頁面

FollowSymlinks:允許跟蹤符號鏈接文件;允許訪問網站中根目錄下作鏈接的文件

SymLinksifOwnerMatch 允許追蹤鏈接文件和源文件爲同一屬主就允許(使用少)

MultiViews  是否允許多視圖(不開啓)(使用少)

 

(2) 基於來源地址的訪問控制機制

Order:檢查次序

Order allow,deny

Order deny,allow

Allow from

Deny from

wKiom1kR2lyAKV0-AAAToJOeoGw797.png-wh_50

來源地址:

IP

NetAddr:

172.16

172.16.0.0

172.16.0.0/16

172.16.0.0/255.255.0.0

 

8、定義默認主頁面  訪問沒有指明自左向右訪問

DirecotryIndex  index.html  index.html.var  index.php

 

9、日誌設定

 

錯誤日誌:

ErrorLog logs/error_log

LogLevel warn

wKioL1kR2nfRK5-OAAAl0kHakLA605.png-wh_50

debug, info, notice, warn,  error, crit, alert, emerg

                        調試信息、通知、警告、 錯誤、暴擊、警報、緊急

定義warn那麼比warn高的級別都將記錄。

訪問日誌:

CustomLog logs/access_log combined

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

wKiom1kR2prSenzzAABLr7HdnVI032.png-wh_50

%h:客戶端IP地址;

%l: Remote logname (from identd, if supplied). -表示爲空;遠程登錄名大多數爲空

%u: Remote user,  (from auth; may be bogus if return status (%s) is 401);用戶認證時的用戶名  大多數無需認證-表示爲空

%tTime the request was received (standard english format),服務器收到請求的時間;默認爲英文格式

%rFirst line of request,請求報文的行信息請求的URL以及協議版本等(method url version)

%>s: 響應狀態碼;

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

%{Referer}i:請求報文當中"referer"首部的值;當前資源的訪問入口,即從哪個頁面中的超鏈接跳轉而來;

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

wKiom1kR2rixGrw1AAAt9rsLJ7o312.png-wh_50

詳情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

 

10、路徑別名

 

DocumentRoot "/www/htocs"

http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm

--> /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm

 

Alias /URL/ "/PATH/TO/SOMEDIR/"

 

Alias /3/ "/1/2"

http://www.magedu.com/3/index.html

--> /1/2/3/

 

Alias /bbs/ "/forum/htdocs"

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

--> /forum/htdocs/bbs/

 

wKioL1kR2yijU-raAAAUT85bBmI371.png-wh_50

wKiom1kR2ymgemOQAAAIjgV-vDU879.png-wh_50

wKioL1kR2yrxap_YAABK6ua81Ow586.png-wh_50

wKiom1kR2yuTB5DbAAAiwOqIA4c823.png-wh_50

wKiom1kR2yzhgsxZAAAU0KaQnP4486.png-wh_50

wKioL1kR2yyj4PNzAAADE64tWrY794.png-wh_50

wKioL1kR2y2iNlfMAAA5_2EQTJ8447.png-wh_50

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

wKiom1kR3C2At15kAAAZvOwzWIs213.png-wh_50

wKiom1kR3C6xCwSQAAAriW-pb-w366.png-wh_50

wKioL1kR3DLzwm79AAC9WvzvdsM080.png-wh_50

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

使用htpasswd命令進行管理

htpasswd [options] passwordfile username

-c: 自動創建passwordfile,因此,僅應該在添加第一個用戶時使用;

-m: md5加密用戶密碼;

-s: sha1加密用戶密碼;

-D: 刪除指定用戶

wKiom1kR3DPTCp9pAAA-3jBXeVs419.png-wh_50

wKioL1kR3DnCgjFWAAChxwaLbII127.png-wh_50

wKiom1kR3DrCrYQfAAAeDafaA2o778.png-wh_50

(3) 實現基於組進行認證

<Directory "">

Options None

AllowOverride None

AuthType Basic

AuthName "STRING"

AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"

AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"

Require group GROUP1 GROUP2 ...

</Directory>

 

要提供:用戶賬號文件和組文件;

 

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

GRP_NAMEuser1 user2 user3 ... 組名 冒號 用戶名用空格分隔

 

 

示例:

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

</Directory>

spacer.gif

wKioL1kR3DrBv9WkAAAZvFhcYsY898.png-wh_50

wKiom1kR3DvD-YH9AAA-yL4aLXk963.png-wh_50

wKioL1kR3ECTetNiAACmSQRRzcY791.png-wh_50

13、虛擬主機

 

有三種實現方案:

基於ip

爲每個虛擬主機準備至少一個ip地址;

基於port

爲每個虛擬主機準備至少一個專用port;實踐中很少使用;

基於hostname

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

 

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

 

注意:一般虛擬主機莫與中心主機混用,所以,要使用虛擬主機,先禁用中心主機;

禁用中心主機:註釋DocumentRoot

 

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

<VirtualHost "IP:PORT">

SeverName

DocumentRoot ""

</VirtualHost>

 

ServerAlias: 虛擬主機的別名;以下這些都可以定義在虛擬主機中

ErrorLog   

CustomLog

<Directory "">

</Directory>

               ip addr add [ip/mask] dev eth0  /添加新的IP

Ip addr list //查看

示例1:基於ip

<VirtualHost 172.16.100.6:80>

    ServerName web1.magedu.com

    DocumentRoot "/vhosts/web1/htdocs"

</VirtualHost>

 

<VirtualHost 172.16.100.7:80>

    ServerName web2.magedu.com

    DocumentRoot "/vhosts/web2/htdocs"

</VirtualHost>

 

示例2:基於port

<VirtualHost 172.16.100.7:80>

    ServerName web2.magedu.com

    DocumentRoot "/vhosts/web2/htdocs"

</VirtualHost>

 

<VirtualHost 172.16.100.7:8080>

    ServerName web3.magedu.com

    DocumentRoot "/vhosts/web3/htdocs"

</VirtualHost>

wKiom1kR3ETSWAhDAACPcQQwIYI856.png-wh_50

示例3:基於hostname

<VirtualHost 172.16.100.6:80>

    ServerName web1.magedu.com

    DocumentRoot "/vhosts/web1/htdocs"

</VirtualHost>

 

<VirtualHost 172.16.100.6:80>

    ServerName web2.magedu.com

    DocumentRoot "/vhosts/web2/htdocs"

</VirtualHost>

 

<VirtualHost 172.16.100.6:80>

    ServerName web3.magedu.com

    DocumentRoot "/vhosts/web3/htdocs"

</VirtualHost>

 

14、內置的status頁面  //內置狀態頁面

<Location /server-status>

    SetHandler server-status

    Order deny,allow

    Deny from all

    Allow from 172.16

</Location>

wKiom1kR3ETQMKHHAAAoJag3I54193.png-wh_50

wKioL1kR3EnRZ76xAADgEB18oWQ109.png-wh_50

實現:基於賬號實現訪問控制


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