CentOS6.5 web-http協議之httpd篇之一

來源:互聯網
上載者:User

標籤:虛擬機器主機   網路   通訊   

 

web服務在網路通訊中很重要,而我們這裡要展示的就是web服務中的重中之重-http協議

在CentOS6.5下,http協議的實現工具叫httpd,我們可以使用命令來查看當前httpd的版本,以及是否在本機上裝了httpd服務了。

例如:

[[email protected] conf]# rpm -q httpd
httpd-2.2.15-29.el6.centos.x86_64

這是httpd的2.2.15版本。這個版本的httpd有很多特性,下面用樣本陳述:假設我們的環境:一台vmware虛擬機器主機當做伺服器端提供web服務,而我們的用戶端類比使用的是win7

再啟動httpd之間,先說下httpd有個主設定檔,定義了httpd很多新特性。由於我們httpd2.2版本,預設定義了兩個工作模式,一個是prefork,另一個是worker。

我們可以通過rpm –ql httpd查看httpd程式都產生了什麼檔案。

[[email protected] conf]# rpm -ql httpd

……

/usr/sbin/httpd(其實它是prefork啦)
/usr/sbin/httpd.event
/usr/sbin/httpd.worker

由於httpd是有工作模式的,必須要知道它以哪種模式工作的,它預設是prefork模式,它還有個worker模式。讓我們分別看看設定檔裡面它們兩個的特性:

(伺服器在響應用戶端請求之前會預先產生一個類似“進程池 (server-pool)的東西,產生很多子進程,用戶端來響應了,我們就從池中調子進程予以響應)

對於prefork模式:該工作模式下,伺服器的主進程會fork自身從而產生多個子進程,每個子進程響應一個客戶請求。

<IfModule prefork.c>
StartServers       8  服務在開啟時,就產生了8個空閑進程
MinSpareServers    5 最少的空閑進程數
MaxSpareServers   20 最大的空閑進程數
ServerLimit      256 最多請求的進程數量

MaxClients       256 伺服器同時間可允許的最大客戶請求數量
MaxRequestsPerChild  4000  每一個子進程最多處理多少個請求

</IfModule>

對於這個worker模式:在worker工作模式下,每個子進程會產生很多個線程,每個線程請求一個客戶請求。

<IfModule worker.c>
StartServers         4 伺服器再啟動時開啟了4個閒置進程等待客戶串連
MaxClients         300 表明允許的同一時刻最大並發使用者請求數
MinSpareThreads     25 最小空閑線程數
MaxSpareThreads     75最大空閑線程數
ThreadsPerChild     25 每個子進程可以開啟的線程個數

MaxRequestsPerChild  0每個子進程最多響應可以處理多少個請求

 

由此我們有個大致瞭解,我們做實驗實驗下兩個工作模式。

實現方式:通過對設定檔重新命名的方法來開啟工作模式,如:

[[email protected] sbin]# ll /usr/sbin/httpd*
-rwxr-xr-x. 1 root root 354816 Aug 14  2013 /usr/sbin/httpd
-rwxr-xr-x. 1 root root 368168 Aug 14  2013 /usr/sbin/httpd.event
-rwxr-xr-x. 1 root root 367240 Aug 14  2013 /usr/sbin/httpd.worker

現在我們開啟httpd服務,查看閒置進程數:

[[email protected] sbin]# ps aux | grep "httpd*"
root      2843  0.0  1.6 241748  8260 ?        Ss   11:04   0:00 /usr/sbin/httpd
apache    2846  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2847  0.0  0.9 241748  4776 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2848  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2849  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2850  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2851  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2852  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2853  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd

root      3550  0.0  0.1 103252   828 pts/1    S+   13:41   0:00 grep httpd*

標記紅色斜體的進程正好為8個,對應設定檔預設的開啟了8個閒置進程數。

現在我們切換到httpd.worker工作模式:

先查看下:

[[email protected] sbin]# !ll
ll /usr/sbin/httpd*
-rwxr-xr-x. 1 root root 354816 Aug 14  2013 /usr/sbin/httpd
-rwxr-xr-x. 1 root root 368168 Aug 14  2013 /usr/sbin/httpd.event
-rwxr-xr-x. 1 root root 367240 Aug 14  2013 /usr/sbin/httpd.worker

---------------------------------------------------------------------------------------------

再次重新命名檔案

[[email protected] sbin]# mv /usr/sbin/httpd  /usr/sbin/httpd.prefork
[[email protected] sbin]# mv /usr/sbin/httpd.event  /usr/sbin/httpd

 

重啟服務

[[email protected] sbin]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

現在我們查看閒置進程數:

[[email protected] sbin]# !ps
ps aux | grep "httpd*"
root      3578  0.0  0.8 184488  4032 ?        Ss   13:46   0:00 /usr/sbin/httpd
apache    3581  0.0  0.6 528748  3276 ?        Sl   13:46   0:00 /usr/sbin/httpd
apache    3582  0.0  0.6 528748  3284 ?        Sl   13:46   0:00 /usr/sbin/httpd
apache    3583  0.0  0.6 528748  3280 ?        Sl   13:46   0:00 /usr/sbin/httpd
root      3668  0.0  0.1 103252   832 pts/1    S+   13:48   0:00 grep httpd*

加上root使用者在80連接埠開啟的監聽通訊端這個空閑進程,正好4個。

因為httpd服務需要基於通訊端檔案通訊,所以需要ip和連接埠格式,所以主設定檔也定義了連接埠的概念,這樣可以不通過公認的80連接埠。

Listen 80
Listen 38080

我這裡就定義了一個38080的連接埠同樣給web服務使用,讓我們看看實際效果:

[[email protected] sbin]# ss -tnlp | grep "httpd*"
LISTEN     0      128                     :::80                      :::*      users:(("httpd",3805,4),("httpd",3808,4),("httpd",3809,4),("httpd",3810,4),("httpd",3811,4),("httpd",3812,4),("httpd",3813,4),("httpd",3814,4),("httpd",3815,4))
LISTEN     0      128                      :::38080                   :::*      users:(("httpd",3805,6),("httpd",3808,6),("httpd",3809,6),("httpd",3810,6),("httpd",3811,6),("httpd",3812,6),("httpd",3813,6),("httpd",3814,6),("httpd",3815,6))

由於我們的httpd是高度模組化的,能動態載入程式,非常好用!比如:我們想禁掉一個模組的功能,以auth_digest為例,我們來禁掉它。

LoadModule auth_basic_module modules/mod_auth_basic.so

#LoadModule auth_digest_module modules/mod_auth_digest.so

儲存並直接查看

[[email protected] ~]# httpd -D DUMP_MODULES | grep "digest"
Syntax OK
[[email protected] ~]# echo $?
1

說明digest模組被我們禁掉了,這裡直接注釋掉就可以成功,並不需要再次重啟服務或重讀設定檔。

其實我們的web服務最好不要以root身份直接開啟服務,所以設定檔裡定義了啟動http服務的使用者,如下

User apache
Group apache

對應到主機上,看!

apache    3808  0.0  1.1 241880  5564 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3809  0.0  1.1 241880  5564 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3810  0.0  1.1 241748  5444 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3811  0.0  1.1 241748  5444 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3812  0.0  1.1 241748  5444 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3813  0.0  1.1 241880  5564 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3814  0.0  1.1 241748  5440 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3815  0.0  1.1 241748  5444 ?        S    14:00   0:00 /usr/sbin/httpd

 

我們再次說說web首頁的首頁地址在哪裡,因為我們的環境CentOS6.5這台linux系統主機是提供httpd服務的,所以首頁很可能定義到linux下某個目錄作為web服務的入口,在設定檔裡面寫到

DocumentRoot /var/www/html

它定義了web服務的“入口”,假設它在linux主機下有個1.html檔案,如果編輯好了該檔案,用我們的用戶端(win7)訪問一定能訪問到1.html,對吧,讓我們試試:

[[email protected] ~]# ll /var/www/html/1.html
-rw-r--r-- 1 root root 18 Aug  9 14:22 /var/www/html/1.html

[[email protected] ~]# cat /var/www/html/1.html
hellooooooooooooo

讓我們的客戶請求這個網頁

650) this.width=650;" style="border-right- 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1" border="0" alt="1" src="http://img1.51cto.com/attachment/201408/10/6249823_1407644126BzrH.jpg" width="244" height="92" /> 

沒錯吧!

先說下,httpd目錄下通常有個index.html,這個頁面通常是定義的首頁面,如果沒有它,伺服器會變成一個類似“下載”的頁面,讓我們看看

[[email protected] ~]# ll /var/www/html/
1.html      c6/         ct6.cfg     hello.html  hi.html     ks.cfg      repodata/   test.html   zabbix/ 

並沒有index.html是吧。讓我們的用戶端訪問它試試:

650) this.width=650;" style="border-right- 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2" border="0" alt="2" src="http://img1.51cto.com/attachment/201408/10/6249823_1407644130WaS6.jpg" width="244" height="236" />

這個是為什麼呢?

其實這個是設定檔裡定義了訪問機製造成的,在設定檔中有一項規定了預設的DocumentRoot下的頁面參數,注意在設定檔的這裡,

<Directory "/var/www/html"> 
    Options Indexes FollowSymLinks

主要看Indexes這個參數,如果帶上它就會顯示那樣,出現一個下載列表,讓你挑選下載,這是不是一個潛在的巨大泄露,通常我們可以去掉這一項,如果去掉,看成什麼樣子了,如在Indexes前面加一個-字元,這樣其實很大程度上保證了安全性。其實我們設定檔在這裡就寫到了

400 # same purpose, but it is much slower.
401 #
402 DirectoryIndex index.html index.html.var

從這裡找index.html作為首頁

<Directory "/var/www/html"> 
    Options -Indexes FollowSymLinks

儲存並重讀設定檔。

650) this.width=650;" style="border-right- 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://img1.51cto.com/attachment/201408/10/6249823_14076441324zJS.png" width="244" height="119" /> 哈哈,是不是很神奇!

而這個followSymLinks是什麼意思呢,讓我們舉個例子:

先對根檔案目錄下的1.html建立一個軟連結,格式如下:

[[email protected] html]# ln -sv /tmp/1.html /var/www/html/2014.html
`/var/www/html/2014.html‘ -> `/tmp/1.html‘

然後設定檔中預設開啟了FollowSymLinks,則可以通過輸入URL http://192.168.1.184/2014.html找到1.html,看:

 

650) this.width=650;" style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://img1.51cto.com/attachment/201408/10/6249823_1407644133JBkU.png" "244" height="100" /> 。

我們的httpd還有日誌功能,日誌分兩種,一種是錯誤記錄檔,一種是CustomLog訪問日誌,而且設定檔都定義了路徑在哪裡,先看CustomLog的位置

CustomLog logs/access_log combined

還有錯誤記錄檔的:ErrorLog logs/error_log

lrwxrwxrwx. 1 root root   19 Jun 29 17:21 logs -> ../../var/log/httpd這裡其實是一個連結,指向了/var/log/httpd/

[[email protected] logs]# cd /var/log/httpd/
[[email protected] httpd]# ll
total 1348
-rw-r--r-- 1 root root   34583 Aug  9 23:24 access_log
-rw-r--r-- 1 root root    3874 Jul 26 22:07 access_log-20140727
-rw-r--r-- 1 root root 1280638 Jul 30 19:09 access_log-20140803

-rw-r--r-- 1 root root   22171 Aug  9 23:22 error_log
-rw-r--r-- 1 root root    7697 Jul 27 10:20 error_log-20140727
-rw-r--r-- 1 root root   15110 Aug  3 09:48 error_log-20140803

我們的httpd服務還有一個好的功能,可以定義路徑別名,隨便建立一個目錄,把它當做類似前面的“根檔案目錄”一樣。如下,我現在定義個路徑別名

在設定檔裡添加Alias /music/  "/tmp/music/",然後再在/tmp/music裡面建立一個23.html。

[[email protected] music]# cd /tmp/music/
[[email protected] music]# ll
total 4
-rw-r--r-- 1 root root 14 Aug 10 00:10 23.html

[[email protected] music]# cat 23.html
1111111111111

然後我們用戶端在瀏覽器輸入:http://192.168.1.184/music/23.html

650) this.width=650;" style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://img1.51cto.com/attachment/201408/10/6249823_1407644134XXT5.png" "244" height="83" />成功,就不在藉助根檔案目錄。

 

下一篇我們來介紹更多的新特性!!!!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.