標籤:虛擬機器主機 網路 通訊
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" />成功,就不在藉助根檔案目錄。
下一篇我們來介紹更多的新特性!!!!