Web基礎與apache講解

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不同:靜態頁面沒有?、動態頁面包含?
Web基礎與apache講解
Web基礎與apache講解
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 資源的方法:
Web基礎與apache講解
5.http狀態返回狀態碼:
Web基礎與apache講解
Web基礎與apache講解
6.http報文格式:一個完整的http訪問包含請求(request)和響應(response);
Web基礎與apache講解
7.使用fiddler抓包工具抓包,查看http報文格式:
Web基礎與apache講解

三、TCP數據包狀態分析:

1.tcp報文走向:Web基礎與apache講解

2.TCP建立連接與斷開連接時,連接的狀態變化:Web基礎與apache講解

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連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了爲每個請求建立新連接所需的時間,還節約了帶寬。
實現長連接要客戶端和服務端都支持長連接。

Web基礎與apache講解

MPM-worker:多進程多線程、一個進程開多個線程、每一個線程處理一個連接,但通知機制還是select不過可以接受更多的請求;特點:節省資源、兼容性不好、穩定性不高、keep-alive長連接佔據問題;
Web基礎與apache講解

MPM-event:worker的升級版、把服務器進程和連接進行分離,基於異步I/O模型。請求過來後進程並不處理請求,而是直接交由其他機制來處理,通過epoll機制來通知請求是否完成;在這個過程中,進程本身一直處於空閒狀態,可以一直接收用戶請求。可以實現一個進程響應多個用戶請求。並且event模式對於keep-alive連接處理也有所優化,event模式有單獨的線程處理keep-alive長連接,執行完畢後,又允許它釋放。這樣增強了高併發場景下的請求處理能力。特點:支持海量級高併發負載、消耗資源少、但其對https支持的不完美;

Web基礎與apache講解
總結:
不同模式效率不同,主要用於調優、命令“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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章