CentOS web之httpd之二

Cgi特性:配置文件明確定義了cgi,可以使httpd實現一個動態裝載的效果。

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

Cgi-bin

書接上文,在我們的配置文件內定義了cgi-bin的ScriptAlias,可以加載一個類似動態頁面的效果。

我們在CentOS6.5中對/var/www/cgi-bin/下建立一個bash腳本,腳本內容如下:

#!/bin/bash
#
cat <<EOF
Content-type:text/html

<pre>
the hostname is $(hostname)
the date is $(date)
</pre>
EOF

然後把它給一個x(可執行的權限),因爲默認啓動我們httpd服務的是配置文件中定義的apache用戶。

於是我們用客戶端win7通過瀏覽器訪問該頁面,就如下圖一樣:

image 出現了我們定義的時間和主機名變量,是不是很好用!

因爲動態資源模塊加載需要解釋器加入,還需要額外開啓子進程進行執行程序,這無疑很大程度上加大了服務器的負荷,所以後期我們開發某個頁面必須要做到動靜分離,才能加速效果。

CGI協議有很多不一樣的變種,如CGI與PHP聯繫起來就啓動了三種模式,CGI、fastcgi和模塊模式。

httpd基於用戶訪問控制

用戶認證:1、基本認證(basic)  2、摘要認證:digest 基於Hmac。

虛擬用戶,指的不是用於登錄操作系統的賬號,而僅僅是用於某服務,或者獲取某個資源的用戶賬號。

那我們可以把虛擬用戶的信息放到文本文件中,放到哪裏都可以,最好啊存放於web服務配置目錄下即/etc/http/ ,最好隱藏起來

還可以選擇放到SQL數據庫中,或者放到dbm(基於文本文件的數據庫引擎,它的存放方式基於哈希編碼存放的,所以檢索起來比快。

 

基於服務器本身做認證,basic認證和digest摘要認證。

如何基於文件方式做訪問控制

1、你想對網頁文件那個做訪問,就先在linux下建立該目錄,如我們想在根文件目錄下建立一個bbs目錄,明確對bbs目錄進行用戶認證。

[root@www html]# pwd
/var/www/html
[root@www html]# mkdir bbs

drwxr-xr-x 2 root root 4096 Aug 10 02:55 bbs

然後在配置文件裏面directory裏設定限定,格式如下:

<Directory "/var/www/html/bbs"> 定義對哪個目錄進行用戶認證

Options none 選項可以沒有
AllowOverride AuthConfig 表示用戶認證的配置
AuthType Basic 用戶認證使用的方式,這裏用是basic
AuthName "auth" 用戶請求資源之前看到的提示
AuthUserFile /etc/httpd/conf/.htpasswd 對於哪個記錄了用戶的信息的文件

如果我們使用文件類型來驗證用戶信息,這裏還可以選擇一個不用填寫的叫

AuthBasicProvider file 明確指出針對basic認證使用的認證方式是文件。

還可以豐富這個限定內容,比如這個bbs區域僅允許bill登錄,我們還可以添加

Require user bill

如果允許所有用戶就使用valid-user

</Directory>

第二步,創建認證文件.htpasswd

認證文件中的賬號是明文的,密碼是摘要的,即密文的。所以我們不應該手動編輯生成,所以有命令可以幫助我們生成.htpasswd文件。

命令htpasswd

-c :如果文件事先不存在就創建(僅能在創建第一個用戶中使用)

-m 以md5的格式編輯存儲用戶的密碼信息。

-D 刪除指定用戶的

我們來手動爲bill用戶生成一個文件記錄他的賬號密碼:

[root@www ~]# htpasswd /etc/httpd/conf/.htpasswd bill
htpasswd: cannot modify file /etc/httpd/conf/.htpasswd; use '-c' to create it它提示我們這個文件事先並不存在,需要-c選項先創建它。

[root@www ~]# htpasswd -c /etc/httpd/conf/.htpasswd billNew password:
Re-type new password:
Adding password for user bill

顯示添加成功。

我們還想爲其他人在此文件裏添加賬號和密碼就不能使用-c選項了,直接使用命令:htpasswd –m /etc/httpd/conf/.htpasswd jimmy

這裏看:

[root@www ~]# htpasswd -m /etc/httpd/conf/.htpasswd jimmy
New password:
Re-type new password:
Adding password for user jimmy

jimmy用戶賬號和密碼創建成功。

接下來我們來查看下該文件:

[root@www ~]# cat /etc/httpd/conf/.htpasswd
bill:/4xE19TDXwecQ
jimmy:$apr1$OIw1LAIH$I1G2kBR.jxWJogmCZbZkF0

接下來讓我們客戶端訪問一下看看!

image_thumb

刪除用戶:

[root@www ~]# htpasswd -D /etc/httpd/conf/.htpasswd jimmy
Deleting password for user jimmy

看看jimmy就不能登錄了。

上面是用戶的認證,我們的httpd還可以對組進行認證。還是修改配置文件,在

<Directory "/var/www/html/bbs">

Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "auth"
AuthUserFile /etc/httpd/conf/.htpasswd

添加 AuthgroupFile /etc/httpd/conf/.htgroup
AuthBasicProvider file

添加 Require group 組名

</Directory>

剩下的就是要用vim編輯一個.htgroup的文件,但是在編輯之前,最好編輯htpasswd文件多添加幾個用戶(建議而已)

編輯組文件

fas: libai lvbu

保存並重讀配置文件,用客戶端登陸驗證下:

image_thumb[1] bill登陸多次都登陸不上不去,而試試我們的組用戶信息。用libai測試,則顯示

image_thumb[2]

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

下面是最重要的部分之一!

虛擬主機

在httpd默認下,它把整個主機或者一個物理主機當做一個站點來使用,在httpd中叫做主服務器。

而虛擬主機是在一個臺服務器上提供多個站點,而一個主機是使用一個IP地址加端口的,使用多個虛擬主機,是不是需要更多的IP地址加端口呢?

要想實現虛擬主機效果,各虛擬主機要使用不同的訪問路徑,如何實現不同?

1、用多個端口,但是還是有缺陷,因爲客戶很多不會知道你用哪個端口的。雖然能基於端口實現,但必須告知客戶。

2、那麼基於ip地址,但是ip地址的經費也很貴。

故我們使用第三種。

因爲tcp/ip通信本質上只能認識ip+端口的方式用套接字文件進行傳輸,它根本不會直接使用你在瀏覽器輸入的域名直接去互聯網上該資源,它先會在它本機內的hosts文件裏看看有沒有對應的記錄,如果沒有,就去找DNS服務器進行域名解析拿着域名解析的ip地址去找ip對應的主機進行通信的。

但是我們的http的確可以做到用i一臺開啓了虛擬主機服務的基於訪問多個域名來通信的,在http的首部有個host選項,構建請求報文,會在host中加上你在瀏覽器中輸入的域名,但雖說如此,在ip報文到達主機的時候還是要靠ip地址來到達那個物理主機的,在應用層拆除http請求首部,會根據這些域名來訪問這個物理主機上的各個虛擬主機。這樣多臺虛擬主機共享一個物理主機的資源。

所以是基於主機名的虛擬主機

由於虛擬主機特別重要,所以我們對上述三個環境都必須進行測試

這裏有個最重要的前提,使用虛擬主機的前提,需要取消主服務器的web服務。需要註釋主配置文件中的DocumentRoot。

2定義虛擬主機。使用virtualhost,格式如下:

<Virtualhost IP:PORT>

ServerName:主機名

DocumentRoot:虛擬主機的根目錄

SeverAlias給服務器定義個別名

ErrorLog

</virtualhost>

測試方法,如果虛擬主機要基於端口測試,就要每個虛擬主機的ip綁在不同的端口上,如果虛擬主機要基於IP測試,就要每個虛擬主機ip地址不相同,如果虛擬主機要基於主機名,就要每個虛擬主機的主機名ServerName不相同。

如果想基於名稱不相同在http2.2 我們需要定義一個NameVirtualhost IP:PORT

第一步:

先查找/etc/httpd/conf/httpd.conf下找到Listen 監聽,在全局配置中加入你想爲虛擬主機增加的端口號是什麼,如下圖:

#Listen 12.34.56.78:80
136 Listen 80
137 Listen 38080

第二步

註釋掉DocumentRoot

#DocumentRoot "/var/www/html"

第三步

開始建立我們的虛擬主機

在配置文件裏編輯

<VirtualHost 192.168.1.184:80>
ServerName www.aaabig.com
DocumentRoot /web/host1
</VirtualHost>
<VirtualHost 192.168.1.184:38080>
ServerName www.aaabig.com
DocumentRoot /web/host2
</VirtualHost>

[root@www ~]# service httpd configtest 或者命令http -t
Warning: DocumentRoot [/web/host1] does not exist
Warning: DocumentRoot [/web/host2] does not exist
Syntax OK

顯示我們沒有創建虛擬主機的目錄,我們還有創建一下:

[root@www /]# mkdir -pv /web/host1
mkdir: created directory `/web'
mkdir: created directory `/web/host1'
[root@www /]# mkdir -pv /web/host2
mkdir: created directory `/web/host2'

第四步:我們爲兩個不同的虛擬主機提供各自的主頁面。

[root@www /]# vim /web/host1/index.html
[root@www /]# vim /web/host2/index.html
[root@www /]# cat /web/host1/index.html
this is host1
[root@www /]# cat /web/host2/index.html
this is host2

第五步:我們做一下測試

這是80的端口

image_thumb[5]

這是38080的端口

image_thumb[3]

--------------------------------------------------------------以上是不同的虛擬主機基於不同端口的--------------------------------------------------------------

下面是基於不同IP地址的虛擬主機:

第一步:先創建一個新的ip地址,因爲演示,所以臨時創建一個:

[root@www ~]# ifconfig eth0:0 192.168.1.134/24
[root@www ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:7B:06:EC
inet addr:192.168.1.184 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe7b:6ec/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:31928 errors:0 dropped:0 overruns:0 frame:0
TX packets:11008 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3475011 (3.3 MiB) TX bytes:1652801 (1.5 MiB)

eth0:0 Link encap:Ethernet HWaddr 00:0C:29:7B:06:EC
inet addr:192.168.1.134 Bcast:192.168.1.255 Mask:255.

第二步:編輯httpd.conf,修改虛擬主機那裏。

<VirtualHost 192.168.1.184:80>
ServerName www.aaabig.com
DocumentRoot /web/host1
</VirtualHost>
<VirtualHost 192.168.1.134:80>

修改並保存,用httpd -t檢查語法錯誤

[root@www ~]# httpd -t
Syntax OK

第三步 重新加載配置文件 service httpd reload

image_thumb[6] 測試成功!

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

我們也可以把它們都混着使用,譬如:

我們再次添加一個新的虛擬主機,host3

VirtualHost 192.168.1.134:38080>
ServerName www.aaabig.com
DocumentRoot /web/host3
</VirtualHost>

再次編輯它根目錄再裏面創建一個index.html的首頁。

[root@www ~]# cat /web/host3/index.html
this is host3

重讀配置文件,再檢查我們的效果:

image_thumb[7] 測試成功!

因爲我們定義了三個虛擬主機,主機名都一樣,所以如果使用www.aaabig.com我們會訪問第一個,因爲配置的執行測序是自上而下的。

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

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

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

下面我們測試不同的虛擬主機用不同的ServerName

第一步:準備環境,修改配置文件,把它們設置成相同的IP地址和端口,但是主機名稱不相同。

<VirtualHost 192.168.1.184:80>
ServerName www.aaabig.com
DocumentRoot /web/host1
</VirtualHost>
<VirtualHost 192.168.1.184:80>
ServerName www.bigfire.com
DocumentRoot /web/host2
</VirtualHost>
<VirtualHost 192.168.1.184:80>
ServerName


DocumentRoot /web/host3

下面的步驟尤爲重要,因爲用到主機名,所以要麻煩到DNS服務器來工作,因爲在我的測試環境下我的DNS服務器可以連接到外網,對你該的網址進行解析,所以我們可以修改我們客戶端(即一直在用的win7的DNS指向我的服務器CentOS6.5的DNS服務器的IP地址,還要修改CentOS6.5的DNS服務器的區域解析庫文件,添加主機名等等等,所以我們暫時使用hosts文件來看看是否能夠虛擬主機加載成功!)

所以這裏我們修改win7的hosts文件,在

image_thumb[8] 下用編輯器打開,修改爲

image_thumb[9]

下面爲演示頁面:

image_thumb[10]

image_thumb[11]

image 以上3個都能正常顯示,這裏我做實驗的時候出現了一次bug,小錯誤,後來發現是配置文件裏面的NameVirtualhost前面的註釋沒有去掉。這裏虧了好朋友志財的“點撥”啦~就是如下情況:

image

當然還有Secret內容!!!!!博客並沒有終結還有關鍵的第三篇!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章