Web基礎與apache講解
一、網站基礎;
二、HTTP協議分析;
三、TCP數據包狀態分析;
四、apache原理詳解;
五、案例:搭建apache網站服務;
一、網站基礎:
1.域名:域名是一個IP地址的“面具” ,目的是便於記憶和訪問一個或一組服務器的地址(網站,電子郵件,FTP等)。
2.域名解析:本地HOSTS解析、DNS服務器解析
3.網站的基本概念:網站、網頁、主頁;HTTP、URL、HTML、超鏈接
4.web網站:有web1.0(以編輯爲特徵)和web2.0(側重用戶交互)
5.動態頁面與靜態頁面的差別:
1)URL不同:靜態頁面沒有?、動態頁面包含?
2)後綴不同(開發語言不同):靜態頁面一般以.html/.htm/.xml;動態頁面一般以.php/.asp/.jsp/.pl/.py/.cgi等爲後綴
3)靜態頁面的內容是固定的,動態頁面的內容會因用戶、瀏覽器、時間、地點等而發生變化。
http://(協議頭)cn.bing.com(域名)/(URI資源:路徑/文件名):
https://jx.tmall.com/?ali_trackid=2:mm_28347190_2425761_27186547:1512434578_208_1779858597
6.網站傳輸協議:http--超文本傳輸協議、https--安全超文本傳輸協議;
二、HTTP協議分析:
1.HTTP:超文本傳輸協議協議是互聯網上應用最爲廣泛的一種網絡協議,協議的核心功能是傳輸 Web 服務器上的 HTML 頁面及其他文件;
2.版本:http0.9(已過時)、http1.0和http1.1(目前廣泛使用)、http2.0(未普及);
3.http協議請求流程:
影響客戶端訪問web站點的因素:客戶端請求的網絡I/O;Web服務器請求頁面的磁盤I/O;
4.HTTP 協議有多種獲得 Web 資源的方法:
5.http狀態返回狀態碼:
6.http報文格式:一個完整的http訪問包含請求(request)和響應(response);
7.使用fiddler抓包工具抓包,查看http報文格式:
三、TCP數據包狀態分析:
1.tcp報文走向:
2.TCP建立連接與斷開連接時,連接的狀態變化:
3.查看系統中數據包的狀態;
netstat -anto ##查看系統中所有連接
netstat -ant |awk '/^tcp|^udp/{state[$6]++}END{for(i in state){print i,state[i]}}' ##統計連接
四、apache原理講解:
1.概述:apache作爲最早的web服務程序,基於http協議提供網頁瀏覽服務;
2.特點:模塊化設置、開放源代碼、跨平臺應用、支持多種web編程語言、運行穩定;
3.apache的常見三種工作模式:
Apache 的核心模塊叫多路處理模塊Multi-Processing Module,簡稱 MPM;
MPM-prefox:多進程模式,一個進程處理一個連接,每個進程相對來講都是獨立的,這個過程會用到select機制來通知;特點:穩定、響應快、消耗大量cpu和內存、keep-alive長連接佔據問題;
註解:keep-alive長連接-- TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了爲每個請求建立新連接所需的時間,還節約了帶寬。
實現長連接要客戶端和服務端都支持長連接。
MPM-worker:多進程多線程、一個進程開多個線程、每一個線程處理一個連接,但通知機制還是select不過可以接受更多的請求;特點:節省資源、兼容性不好、穩定性不高、keep-alive長連接佔據問題;
MPM-event:worker的升級版、把服務器進程和連接進行分離,基於異步I/O模型。請求過來後進程並不處理請求,而是直接交由其他機制來處理,通過epoll機制來通知請求是否完成;在這個過程中,進程本身一直處於空閒狀態,可以一直接收用戶請求。可以實現一個進程響應多個用戶請求。並且event模式對於keep-alive連接處理也有所優化,event模式有單獨的線程處理keep-alive長連接,執行完畢後,又允許它釋放。這樣增強了高併發場景下的請求處理能力。特點:支持海量級高併發負載、消耗資源少、但其對https支持的不完美;
總結:
不同模式效率不同,主要用於調優、命令“httpd -l”查看當前使用模式;
五、案例:搭建apache網站服務;
環境:
系統 IP地址 主機名 所需軟件
Centos 6.5 192.168.100.150 www.linuxfan.cn httpd-2.2.17.tar.gz
實驗步驟:
準備環境,上傳軟件包,並解壓編譯安裝;
安裝後優化調整;
修改定製配置文件並啓動服務;
客戶端訪問測試;
優化httpd服務:調整其工作模式;
準備環境,上傳軟件包,並解壓編譯安裝;
[root@www ~]# rpm -e httpd --nodeps
[root@www ~]# wget http://archive.apache.org/dist/httpd/httpd-2.2.17.tar.gz
[root@www ~]# tar zxvf httpd-2.2.17.tar.gz -C /usr/src/
[root@www ~]# cd /usr/src/httpd-2.2.17/
[root@www httpd-2.2.17]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-cgi && make &&make install
[root@www httpd-2.2.17]# echo $? ##返回0爲成功
0
[root@www httpd-2.2.17]# ls /usr/local/httpd/ ##安裝成功
bin cgi-bin error icons lib man modules
build conf htdocs include logs manual
註解:
bin:存放命令;
lib:httpd的鏈接文件
man:幫助文檔
modules:模塊文件
conf:配置文件存放位置
htdocs:網頁存放位置
logs:日誌存放文件位置
[root@www httpd-2.2.17]# cd
[root@www ~]#
安裝後優化調整;
[root@www ~]# ln -s /usr/local/httpd/bin/* /usr/local/bin/ ##優化執行命令的路徑
[root@www ~]# cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd
[root@www ~]# vi /etc/init.d/httpd
1 #!/bin/bash
2 # chkconfig: 35 85 15 ##在3和5運行級別開機啓動,開機啓動順序爲85,關機關閉順序爲15
81 $HTTPD -k $ARGV &&echo "httpd is $ARGV complete." ##第82行,添加輸出信息
:wq
[root@www ~]# chmod +x /etc/init.d/httpd
[root@www ~]# chkconfig --add httpd
[root@www ~]# chkconfig --list httpd
httpd 0:關閉 1:關閉 2:關閉 3:啓用 4:關閉 5:啓用 6:關閉
修改定製配置文件、準備網頁文檔、並啓動服務;
[root@www ~]# vi /usr/local/httpd/conf/httpd.conf ##修改主配置文件
:set nu ##打印出行號
29 ServerRoot "/usr/local/httpd"
40 Listen 80
65 User daemon
66 Group daemon
88 ServerAdmin [email protected] ##修改管理員的郵箱
97 ServerName www.linuxfan.cn:80 ##添加網站的域名
104 DocumentRoot "/usr/local/httpd/htdocs"
186 ErrorLog "logs/error_log"
193 LogLevel warn
215 CustomLog "logs/access_log" common
:wq
[root@www ~]# cat <<END > /usr/local/httpd/htdocs/index.html ##準備網頁文檔
<html>
<head>
<title>www.linuxfan.cn</title>
</head>
<body>
<h1><span style="color:#3F9; font-size:36px;">www.linuxfan.cn</h1>
<p><img src="./linux.jpg" alt="www.linuxfan.cn" title="www.linuxfan.cn width=700"" height="500" /></p>
</body>
</html>
END
[root@lwh ~]# ls /usr/local/httpd/htdocs/ ##上傳網頁中調用的圖片
index.html linux.jpg
[root@www ~]# /etc/init.d/httpd start
httpd is start complete.
[root@www ~]# netstat -utpln |grep httpd
tcp 0 0 :::80 :::* LISTEN 73341/httpd
[root@www httpd]# netstat -nat | awk '/^tcp/ {++S[$NF]} END {for(key in S) print key,"\t",S[key]}'
FIN_WAIT2 38
CLOSING 3
SYN_RECV 1
CLOSE_WAIT 1
TIME_WAIT 261
ESTABLISHED 71
LAST_ACK 2
FIN_WAIT1 9
註解:
CLOSED 無連接是活動的或正在進行
LISTEN 服務器在等待進入呼叫
SYN_RECV 一個連接請求已經到達,等待確認
SYN_SENT 應用已經開始,打開一個連接
ESTABLISHED 正常數據傳輸狀態/當前併發連接數
FIN_WAIT1 應用說它已經完成
FIN_WAIT2 另一邊已同意釋放
ITMED_WAIT 等待所有分組死掉
CLOSING 兩邊同時嘗試關閉
TIME_WAIT 另一邊已初始化一個釋放
LAST_ACK 等待所有分組死掉
客戶端訪問測試;
[root@www ~]# curl -o 192.168.100.150
優化httpd服務:調整其工作模式;
1.查看工作模式:
[root@www ~]# /usr/local/httpd/bin/httpd -V |grep MPM ##查看工作模式
Server MPM: prefork
注:設置httpd的工作模式時,不僅考慮網站的併發連接等工作效率,也要考慮服務器硬件佔用情況,內存尤爲重點考慮;
2.prefork(進程+子進程)模式,默認:
StartServers 服務器啓動時建立的子進程數量,推薦:小型網站:默認、中:20-50、大:50-100;
MinSpareServers 空閒子進程最小數量,當空閒子進程數少於該數值將產生新的子進程,推薦:與startservers一致;
MaxSpareServers 空閒子進程最大數量,當空閒子進程數大於該數值將殺死多於子進程。這個值不要設得過大,但如果設的值比 MinSpareServers 小, Apache 會自動把其調整爲MinSpareServers+1;
MaxClients 限定最大用戶併發數, 是對 Apache 性能影響最大的參數。默認是150個進程,如果請求總數達到該設置的值時--可以使用ps -ef |grep http |wc -l來查看,那麼後邊的請求就需要排隊,直到某個已經建立完成的請求處理完成後。這就是apache服務器系統資源剩餘很多,但是http訪問還是很慢的原因,理論上這個值設置的越大,apache可以處理的請求就越多,那麼如果該值超過256,那麼apache則無法啓動,如果想配置更大值,必須在源碼包中修改serverlimit(服務極限)這個參數,該參數最大爲200000,對位於源代碼包下 server/mpm/prefork/prefork.c 中以下兩行做相應修改即可:
#define DEFAULT_SERVER_LIMIT 256
#define MAX_SERVER_LIMIT 200000
改後重新編譯安裝;
MaxRequestsPerChild 每個子進程在其生存期內允許服務的最大請求數量,若爲0則代表該進程不會因爲請求數量的變化而停止,建議10000-30000,避免出現活動請求佔用服務器內存資源;
[root@www ~]# /usr/local/httpd/bin/httpd -V |grep MPM
Server MPM: prefork
-D APACHE_MPM_DIR="server/mpm/prefork"
[root@www ~]# vi /usr/local/httpd/conf/extra/httpd-mpm.conf
36 <IfModule mpm_prefork_module>
37 StartServers 5
38 MinSpareServers 5
39 MaxSpareServers 20
40 MaxClients 150
41 MaxRequestsPerChild 10000
42 </IfModule>
[root@www ~]# vi /usr/local/httpd/conf/httpd.conf ##去掉註釋
370 Include conf/extra/httpd-mpm.conf
[root@www ~]# /etc/init.d/httpd restart
[root@www ~]# ps aux |grep httpd |grep -v grep ##一個主進程,五個子進程
daemon 3849 0.0 0.3 27996 1528 ? S 21:37 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 3850 0.0 0.3 27996 1528 ? S 21:37 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 3851 0.0 0.3 27996 1528 ? S 21:37 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 3852 0.0 0.3 27996 1528 ? S 21:37 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 3853 0.0 0.3 27996 1528 ? S 21:37 0:00 /usr/local/httpd/bin/httpd -k restart
root 53394 0.0 0.4 27996 2088 ? Ss 19:19 0:00 /usr/local/httpd/bin/httpd -k restart
3.worker(多進程+多線程)工作模式:
StartServers 服務器啓動時建立的子進程數量,推薦:小=默認、中=3-5、大=5-10;
MaxClients 限定最大用戶併發數、推薦:500以上;
MinSpareThreads 空閒子線程最小數量,當空閒子線程數少於該數值將產生新的子線程,推薦:小=默認、中=50-100、大=100-200;
MaxSpareServers 空閒子線程最大數量,當空閒子線程數大於該數值將殺死多於子線程,推薦:小=默認、中=80-160、大=200-400;
ThreadsPerChild 每個子進程的最大併發線程數,推薦:小型網站1000、中1000-2000、大2000-3500,推薦:小=默認、中=50-100、大=100-200;
MaxRequestsPerChild 每個子進程在其生存期內允許服務的最大請求數量。如果設置爲“ 0”,子進程將永遠不會結束。推薦:小10000、大20000-50000;
注:如若開啓worker工作模式,需要在編譯安裝時--with-mpm=worker選項指定;
當從prefox切換到worker時,重新編譯安裝時;
執行make命令出現以下錯誤:
/usr/src/httpd-2.2.17/server/mpm/prefork/prefork.c:862: undefined reference to `ap_mpm_pod_signal'
collect2: ld returned 1 exit status
make[1]: *** [httpd] 錯誤 1
make[1]: Leaving directory `/usr/src/httpd-2.2.17'
make: *** [all-recursive] 錯誤 1
可執行命令make clean清空已編譯內容,重新編譯即可;
[root@www ~]# /usr/local/httpd/bin/httpd -V |grep MPM
Server MPM: worker
-D APACHE_MPM_DIR="server/mpm/worker"
[root@www ~]# vi /usr/local/httpd/conf/extra/httpd-mpm.conf
51 <IfModule mpm_worker_module>
52 StartServers 2
53 MaxClients 150
54 MinSpareThreads 25
55 MaxSpareThreads 75
56 ThreadsPerChild 50
57 MaxRequestsPerChild 10000
58 </IfModule>
[root@www ~]# vi /usr/local/httpd/conf/httpd.conf
371 Include conf/extra/httpd-mpm.conf
:wq
[root@www ~]# ps aux |grep httpd |grep -v grep
root 33118 0.0 0.4 28168 2044 ? Ss 00:18 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 33119 0.0 0.2 27900 1372 ? S 00:18 0:00 /usr/local/httpd/bin/httpd -k restart
daemon 33121 0.0 0.4 628528 2156 ? Sl 00:18 0:00 /usr/local/httpd/bin/httpd -k restart
4.event工作模式:
ServerLimit 服務器開啓最大的進程數
StartServers 服務器啓動時建立的子進程數量,推薦:小=默認、中=3-5、大=5-10;
MaxClients 限定最大用戶併發數、爲ServerLimit* ThreadsPerChild、推薦:500以上;
MinSpareThreads 空閒子線程最小數量,當空閒子線程數少於該數值將產生新的子線程,推薦:小=默認、中=50-100、大=100-200;
MaxSpareServers 空閒子線程最大數量,當空閒子線程數大於該數值將殺死多於子線程,推薦:小=默認、中=80-160、大=200-400;
ThreadsPerChild 每個子進程的最大併發線程數,推薦:小型網站1000、中1000-2000、大2000-3500,推薦:小=默認、中=50-100、大=100-200;
MaxConnectionsPerChild 每個子進程在其生存期內允許服務的最大請求數量。如果設置爲“ 0”,子進程將永遠不會結束。推薦:小10000、大20000-50000;
注:如若開啓worker工作模式,需要在編譯安裝時--with-mpm=event選項指定,並且內核版本最低需要2.6;
[root@www ~]# /usr/local/httpd/bin/httpd -V |grep MPM
Server MPM: Event
-D APACHE_MPM_DIR="server/mpm/experimental/event"
[root@www ~]# vi /usr/local/httpd/conf/extra/httpd-mpm.conf
111 <IfModule mpm_event_module>
112 ServerLimit 1000
113 StartServers 20
114 MinSpareThreads 25
115 MaxSpareThreads 1200
116 ThreadsPerChild 50
117 MaxConnectionsPerChild 1000
118 </IfModule>
[root@www ~]# vi /usr/local/httpd/conf/httpd.conf
371 Include conf/extra/httpd-mpm.conf
:wq
[root@www ~]# ps aux |grep httpd |grep -v grep
root 18598 0.1 3.6 44416 18276 ? Ss 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18599 0.0 0.2 27900 1376 ? S 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18600 0.0 0.4 644776 2164 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18601 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18602 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18603 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18604 0.0 0.4 644776 2160 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18605 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18606 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18607 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18608 0.0 0.4 644776 2160 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18609 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18610 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18611 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18612 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18613 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18614 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18615 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18616 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18617 0.0 0.4 644776 2160 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18618 0.0 0.4 644776 2156 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start
daemon 18619 0.0 0.4 644776 2152 ? Sl 00:36 0:00 /usr/local/httpd/bin/httpd -k start