# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment 全局環境
### Section 2: 'Main' server configuration 主服務器的配置(建立一個網站)
### Section 3: Virtual Hosts 虛擬主機的配置
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
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.
Persistent Connection :連接建立,每個資源獲取完成后不會
時間 限制, :以秒為單位, httpd-2.4 支持毫秒級
測試: : telnet WEB_SERVER_IP PORT
4 、MPM( ( Multi-Processing Module )多路處理模塊
httpd-2.2 不支持同時編譯多個模塊,所以只能編譯時選
定一個;rpm 安裝的包提供三個二進制程序文件,分別用於實現
默認為/usr/sbin/httpd, 即prefork 模式
將本來注釋掉的HTTPD WORKER模式 將注釋去掉,重啟服務生效
配置文件:/etc/httpd/conf.modules.d/00-mpm.conf
ServerLimit 256 最多進程數, 最大20000
MaxRequestsPerChild 4000 子進程最多能處理的請求
數量。在處理MaxRequestsPerChild 個請求之后, 子進程將
會被父進程終止,這時候子進程占用的內存就會釋放( 為0時 時
5 、DSO: : Dynamic Shared Object
LoadModule <mod _name> <mod_path>
相對於ServerRoot (默認/etc/httpd) )
DocumentRoot 指向的路徑為URL 路徑的起始位置
http://HOST:PORT/test/index.html
DirectoryIndex index.html index.html.var
<FilesMatch "\.(gif|jpe?g|png)$">
<LocationMatch "/(extra|special)/data">
9 、<Directory> 中"基於源地址"實現訪問控制
(1) Options :后跟1 個或多個以空白字符分隔的選項列表
Indexes :指明的URL 路徑下不存在與定義的主頁面資源
FollowSymLinks :允許訪問符號鏈接文件所指向的源文件
Options Indexes FollowSymLinks
Options Indexes FollowSymLinks
.htaccess (由AccessFileName 指定)文件中,覆蓋之前的
AllowOverride None :.htaccess 文件無效
AllowOverride AuthConfig Indexes 除了AuthConfig
order :定義生效次序;寫在后面的表示默認法則(沖突的情況下,后面的優先;不沖突的情況下,都 生效)
curl 192.168.37.106/test.html curl+ip地址 :測試該網段的服務
debug, info, notice, warn,error
定義 日志格式: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
%l 遠程用戶, 啟用mod_ident 才有效,通常為減號"-" "
%u 驗證(basic ,digest )遠程用戶, 非登錄訪問時,為
• %r First line of request ,即表示請求報文的首行;記錄了
• %b 響應報文的大小,單位是字節;不包括響應報文http 首部
• %{Referer}i 請求報文中首部"referer" 的值;即從哪個頁
• %{User-Agent}i 請求報文中首部"User-Agent" 的值;即
http://www.magedu.com/download/bash.rpm
==>/www/htdocs/download/bash.rpm
http://www.magedu.com/download/bash.rpm
http://www.magedu.com/images/logo.png
==>/www/htdocs/images/logo.png
認證質詢:WWW-Authenticate :響應碼為401 ,拒絕客戶端
認證:Authorization :客戶端用戶填入賬號和密碼后再次發送
安全域:需要用戶認證后方能訪問的路徑;應該通過名稱對其進
存儲:文本文件,SQL 數據庫,ldap 目錄存儲,nis等 等
<Directory "/path">(文件夾名稱)
AuthType Basic(用什么認證方法)
AuthName "String"(描述用戶密碼干嘛用的)
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"(路徑)
Require user username1 username2 ...
htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/HTTPD_GROUP_FILE"
Require group grpname1 grpname2 ...
GRP_NAME: username1 username2 ...
<Directory "/www/htdocs/admin">
AuthName "Administator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
vim /etc/httpd/conf.d/.htgroup
注意:一般虛擬機不要與main 主機混用;因此,要使用虛擬主機,
DocumentRoot "/www/a.com/htdocs"
DocumentRoot "/www/b.net/htdocs"
DocumentRoot "/www/c.org/htdocs"
DocumentRoot "/www/a.com/htdocs"
<VirtualHost 172.16.100.6:808>
DocumentRoot "/www/b.net/htdocs"
<VirtualHost 172.16.100.6:8080>
DocumentRoot "/www/c.org/htdocs"
NameVirtualHost *:80 httpd2.4 不需要此指令
DocumentRoot "/www/a.com/htdocs"
DocumentRoot "/www/b.net/htdocs"
DocumentRoot "/www/c.o rg/htdocs"
LoadModule status_module modules/mod_status.so
http/0.9, http/1.0, http/1.1, http/2.0
<method> <request-URL> <version>
<version> <status> <reason-phrase>
method: 請求方法,標明客戶端希望服務器對資源執行的動作
三位數字,如200 ,301, 302, 404, 502; 標記請求處
entity-body :請求時附加的數據或響應時附加的數據
OPTIONS :請求服務器返回對指定資源支持使用的請求方法
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: : 代理服務器從后端服務器收到了一條偽響應,如無法連接到
503 – 服務器不可用,臨時服務器維護或過載,服務器無法處理請求
Request URL:http://www.magedu.com/
Remote Address:101.200.188.230:80
Content-Type:text/html; charset=UTF-8
Date:Sun, 29 Jan 2017 14:32:30 GMT
X-Pingback:http://www.magedu.com/xmlrpc.php
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cookie:53gid2=10104634518015; 53gid0=10104634518015;
53gid1=10104634518015; 53revisit=1485699843851; 53uvid=1;
onliner_zdfq72145423=0; CNZZDATA1260642320=1664910013-1485697454-
%7C1485697454; visitor_type=old; 53kf_72145423_keyword=;
Hm_lvt_4a78dc1643884da1c990c4c878832e70=1485699844;
Hm_lpvt_4a78dc1643884da1c990c4c878832e70=1485700088
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
Connection :連接狀態,如keep-alive, close
Accept-Encoding :客戶端可接受編碼格式,如gzip
If-Modified-Since :自從指定的時間之后,請求的資源是否
If-None-Match :本地緩存中存儲的文檔的ETag 標簽是否與
Authorization :向服務器發送認證信息,如賬號和密碼
WWW-Authenticate :來自服務器對客戶端的質詢列表
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 代理
-A/--user-agent <string> 設置用戶代理發送給服務器
-k/--insecure 行 允許忽略證書進行 SSL 連接
-H/--header <line> 自定義首部信息傳遞給服務器
-D/--dump-header <file> 將url 的header 信息存放在指定文件中
-u/--user <user[:password]> 設置服務器的用戶和密碼
-c/--cookie-jar <file name> 將url 中cookie 存放在指定文件中
-x/--proxy <proxyhost[:port]> 指定代理服務器地址
-X/--request <command> 向服務器發送指定請求方法
-U/--proxy-user <user:password> 代理服務器用戶和密碼
-b name=data 從服務器響應set-cookie 得到值,返回給服務器
(1) 節約帶寬,額外消耗CPU ;同時,可能有些較老瀏覽器不支持
LoadModule deflate_module modules/mod_deflate.so
# 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)
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
Internet Explorer 標識本身為"Mozilla / 4 ",但實際上是
" "MSIE "("B" " 為單詞 邊界") ,就 關閉之前定義的限制
BrowserMatch \bMSI[E] !no-gzip !gzip-only-
(a) 驗證證書來源的合法性;用CA 的公鑰解密證書上數字簽名
(4) 客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密
注意:SSL 是基於IP 地址實現, 單IP 的主機僅可以使用一個https 虛擬主機
配置文件:/etc/httpd/conf.d/ssl.conf
openssl s_client [-connect host:port] [-cert filename] [-
CApath directory] [-CAfile filename]
Redirect [status] URL-path URL
Permanent:Returns a permanent redirect status
(301) indicating that the resource has moved
Temp:Returns a temporary redirect status (302).
Redirect temp / https://www.magedu.com/
HSTS:HTTP Strict Transport Security
服務器端配置支持HSTS 后,會在給瀏覽器返回的HTTP 首部中攜帶
HSTS 字段。瀏覽器獲取到該信息后,會將所有HTTP 訪問請求在內部
是 是Chrome 瀏覽器中的HSTS 預載入列表,在該列表中的網站,使用
Chrome 瀏覽器訪問時,會自動轉換成HTTPS 。Firefox 、Safari、 、
vim /etc/httpd/conf/httpd.conf
Header always set Strict-Transport-Security "max-
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]
htpasswd :basic 認證基於文件實現時,用到的賬號密碼文件
apachectl :httpd 自帶的服務控制腳本,支持start 和stop
apxs :httpd-devel 包提供,擴展httpd 使用第三方模塊工具
access.log, acccess.1.log, access.2.log
suexec :訪問某些有特殊權限配置的資源時,臨時切換至指
ab, webbench, http_load, seige
tcpcopy :網易,復制生產環境中的真實請求,並將之保存
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 安全的
(1) 要求使用證書認證,證書中要求使用的國家(CN) 、州(Beijing) 、城市
(2) 設置部門為Ops ,主機名為www.Y.com ,郵件為admin@Y.com
基於FQDN 的虛擬主機不需要NameVirutalHost 指令
不再支持使用Order, Deny, Allow 來做基於IP 的訪問控制
FastCGI Protocol backend for mod_proxy
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
Provides Bandwidth Rate Limiting for Clients
/etc/httpd/conf.modules.d/*.conf
/usr/lib/systemd/system/httpd.service
systemctl enable|disable httpd.service
systemctl {start|stop|restart|status} httpd.service
Centos 7:/etc/httpd/conf.modules.d/00-mpm.conf
啟用 要啟用的MPM 相關的LoadModule 指令即 可
Include /etc/httpd24/extra/httpd-mpm.conf
Require ip IPADDR :授權指定來源的IP 訪問
Require not ip IPADDR :拒絕特定的IP 訪問
Require host HOSTNAME :授權特定主機訪問
Require not ip 172.16.1.1 拒絕特定IP
基於FQDN 的虛擬主機不再需要NameVirutalHost 指令
DocumentRoot "/apps/b.net/htdocs"
<Directory "/apps/b.net/htdocs">
(4) ssl: 安裝mod_ssl ,和httpd-2.2 相同配置
盤 硬盤 >> 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 次拷貝,如果能減少切換次數和拷貝次數將會
在 在kernel 2.0+ 用 版本中,系統調用 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 ,因為數據就在
ProxyPass "/" "http://www.example.com/"
ProxyPassReverse "/" "http://www.example.com/"
ProxyPass "/images" "http://www.example.com/"
ProxyPassReverse "/images" http://www.example.com/
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
APR(Apache portable Run-time libraries ,Apache 可移植
平台使用的底層支持接口庫。在早期的Apache 版本中,應用
隨着Apache 的進一步開發,Apache 組織決定將這些通用的函
Apache 中獨立出來,Apache用 僅僅是使用 APR 而已。目前
APR 主要還是由Apache 使用,由於APR 的較好的移植性,因
此一些需要進行移植的C 程序也開始使用APR ,開源項目比如
用於服務器壓力測試的 的Flood loader tester, , 該項目不僅僅
適用於Apache ,http://httpd.apache.org/test/flood
依賴於apr-1.4+, apr-util-1.4+, [apr-iconv]
apr: : apache portable runtime ,解決跨平台實現
CentOS 6 :默認:apr-1.3.9, apr-util-1.3.9
相關包:pcre-devel ,openssl-devel expat-devel
./configure --prefix=/app/apr-util --with-
./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
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
./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 --
Httpd 編譯過程:/usr/local/apache24/build/config.nice
自帶的服務控制腳本:/usr/local/httpd24/bin/apachectl
vim /etc/profile.d/httpd24.sh
export PATH=/app/http24/bin:$PATH
MANPATH /usr/local/apache24/man
自 定義啟動腳本( 參考httpd-2.2 的服務腳本)
cp /etc/rc.d/init.d/httpd /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
authuserfile /etc/httpd/conf.d/.httpusers
authgroupfile /etc/httpd/conf.d/.htgroups
實驗之前要先看看防火牆,selinux策略是否關了么,如果沒關,就關掉
vim /etc/httpd/conf.d/test.conf
customlog logs/a.com.accesslog combined
customlog logs/b.com.accesslog combined
customlog logs/c.com.accesslog combined
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
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
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1:建立連接:用戶客戶端和web服務先建立連接,既三次握手,三次握手建立后;客戶端就可以向服務器發起請求了,
2:接收請求:發起請求后,web服務器收到請求,這個請求有請求報文的格式,請求報文要封裝請求報文的頭部,(客戶端發起請求三次握手后,將自己的請求封裝在請求報文中發出去,);
3:處理請求:HTTP服務器軟件進程處理請求:假設客戶端發起一個get獲取頁面請求,web服務看到是一個get請求,頁面通常是放在本機服務器的磁盤上的,所以web服務器就會去本機磁盤上去獲取這個資源,
4:獲取資源:獲取資源並不是http自己有能力獲取資源,因為http服務只是應用層的用戶空間的服務,用戶空間的程序是沒有權限訪問磁盤的;所以http服務將這個請求發送給內核空間處理,這個發送過程走的是系統調用,http通過系統調用將請求發送給內核,內核發現請求需要去磁盤上讀取數據,所以內核將請求發送給磁盤,把磁盤里的文件讀出來,讀出來后到達內核的緩沖器,中的內存空間,再從內存空間將數據復制到http,
5:構建響應: http收到資源后暫時放在自己的緩沖區,拿到數據后開始構建響應報文,封裝http報文頭的首部,
7:記錄事務處理過程: 數據發送出去后,將整個過程記錄在日志中,比如訪問的哪個頁面,等
2:持久連接:keep-alive,長連接,重用TCP連接,以消除連接和關閉的時延,以事務個數和時間決定是否關閉連接
單進程I/O模型:啟動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應
(來一個處理一個,處理完就沒事了,就算多個進程一下子來需要處理,也是要一個個來,先來后到,適合訪問量少的服務)
多進程I/O模型:並行啟動多個進程,每個進程響應一個連接請求
復用的多進程I/O模型:啟動M個進程,每個進程響應N個連接請求,同時接收M*N個請求
處理請求:服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理