架設 WWW


如果您夠幸運﹐有註冊了自己的 domain ﹐還有固定的 IP 地址和 internet 連線﹐架設一個 WWW 伺服器恐怕是必不可少的事情了吧﹖就算您還沒打算正式連上 internet ﹐在自己的 intranet 上面能有一個 WWW 伺服器也是非常便利的。如果您當初安裝 Redhat 6.0 的時候選擇‘Everything’的話﹐您已經有一個叫 apache 的 WWW 伺服器了。而事實上﹐現在 internet 上面的網站﹐大部份都是用 apache 來做伺服器的啦。

設定WWW

要設定 apache ﹐關鍵的檔案都在 /etc/httpd/conf/ 這個目錄之內﹐而我們只需修改三個檔案就可以了﹕
access.conf
httpd.conf
srm.conf

然而﹐如果您在 access.conf 和 srm.conf 中看到下面字眼﹕

#
# To avoid confusion, it is recommended that you put all of your
# Apache server directives into the httpd.conf file and leave this
# one essentially empty.
#  

那麼﹐所有的設定都將改在 httpd.conf 進行﹐這是可能是版本的不同所至。(tips:如果您在參考本例子的時候是用 vi 進行編輯的話﹐可以用 “ / ”鍵尋找關鍵字眼再做修改。)

-- access.conf --

第一個 access.conf檔案﹐用來設定一些目錄權限的﹕
<Directory />
Options None
AllowOverride None
</Directory>

<Directory /home/httpd/virtual/virtual1>
Options Indexes Includes FollowSymLinks
AllowOverride All
order allow,deny
allow from all
</Directory>

在這裡﹐我定義了兩個目錄(它們必須是已經存在的)﹐當使用者透過 HTTP 連接進來的時候所擁有權限。因為‘/’(根目錄)至關緊要﹐所以我不開放任何 Option﹐也不容許 Override (在設定後面的 srm.conf 檔案時﹐可以使用‘.htacess’來改變原有目錄的權限)。

不過﹐我卻允許在 /home/httpd/virtual/virtual1/ 目錄下面使用 index ﹐也就是在沒有預設 index.html (在 srm.conf 中設定) 的時候﹐會將目錄內容顯示在流覽器上﹔而‘FollowSymLinks’呢﹐則允許透過 Symbolic Link 方式連接到此目錄外的位置。 同時﹐在這個目錄下﹐我也允許 AllowOverride All 的設定﹐這個我將在 srm.conf 裡面再解釋。

另外﹐我們還可以特別設定這個目錄的連接限制﹐‘order allow,deny’是先列出允許連接的範圍﹐然後到禁止連接的範圍。不過我這裡完全開放連接了(allow from all)。但您如果有必要的話﹐可以在此增加一些 deny 的句子在後面﹐例如﹕
allow from all

deny from 203.168.168

至於其他設定﹐您慢慢看檔案上面的說明吧﹐通常接受預設值就可以了。

-- httpd.conf --

然後﹐我們看看 httpd.conf 這個檔案。前面那些一大堆的‘LoadModule’和‘AddModule’可以不理﹐除非您真的知道如何修改﹐您唯一要做的是確定它們的路徑正確就可以了。
然後到﹕
ServerType standalone
這個設定是讓 httpd 在開機的時候就啟動起來。通常使用這個設定就可以了﹐除非您想 httpd 以 inetd 的方式啟動。

port 80
這個有點好玩﹐正如我們知道 port 的功能就好像一個 IP 地址的門口﹐port 80 是 HTTP 這個協定的預設值(在 /etc/services 可以修改)﹐如果您想建立一個秘密網站﹐只想那些知門而入的朋友流覽的話﹐那麼﹐將 80 改成其他號碼吧﹐否則﹐使用預設值好了。

HostnameLookups off
如果您想知道連進您的網站的機器是什麼名字的話﹐將之設定為‘on’﹐否則您只會看到 IP 地址而已。

User nobody

Group nobody
這個還是別改啦﹐您只需確定這個‘nobody’存在於 /etc/passwd 和 /etc/group 裡面就可以了。

ServerAdmin root@redhat52.siyongc.domain
您可以將之改成負責管理這個網站的管理者信箱。雖然我這裡使用 root ﹐但我建議您將之改成 webmaster ﹐然後為 webmaster 建立 aliase (我會在“架設MAIL”裡面說的了)。

BindAddress *
如果您要架設虛擬主機(後面我就會教您如何做了)﹐可以將前面的“#”拿掉。同時在後面的‘#Listen 12.34.56.78:80’句子(大約在第323行附近)後面把您設定好的虛擬 IP 地址增加上去(包括機器本身的 IP 地址)﹕
Listen 127.0.0.1:80
Listen 192.168.0.17:80
Listen 203.30.35.134:80
Listen 10.11.127.100:8080
Listen 192.168.1.17:80
.....

(雖然﹐您不設定 BindAddress 和 Listen 也照樣可以讓虛擬主機工作﹐但如果您的伺服器還提供 http-proxy 服務﹐或使用其它的 port 提供其它 httpd 服務﹐則要進行設定了。)

接下有一大堆東東﹐有興趣自己看吧﹐我見了早就逃之夭夭了呢~~~

ServerName www.siyongc.domain 
哈哈~~﹐這樣看上去比 redhat52.siyongc.domain 更具 WWW 味道哦~~~﹐不過﹐您的 DNS 也要設定好啦(應沒問題了吧﹖)。

......
又一堆東西被我忽略了 :(

#ProxyRequests On
咦﹖apache 也可以當 Proxy 使用﹖哈哈﹐自己試試不就知道了麼﹖
(tips: ProxyRemote * http://remote.proxy.host:8080)

架設虛擬主機

有好多朋友﹐或許會在同一台機器上﹐架設多台 WEB 伺服器﹐這就是所謂的“虛擬主機”啦。在 APACHE 上面架設虛擬主機﹐我們有兩種方法﹕IP-Based 和 Name-Based 。這兩個方法有什麼不同呢﹖

IP-Based 是在早期的網頁伺服器上面設定虛擬主機﹐要求每一個虛擬主機都分別有各自不同的 IP﹐這或許是有多張網路卡﹐或是用 IP Aliase 的方式捆綁多個 IP 。但這畢竟是有限的﹐尤其是現在 IP 位址嚴重不足的情況之下。為了解決這個問題﹐後來就發展出 Name-Based 的虛擬主機架設方法﹐也就是將所有的虛擬主機都架在單一的 IP 之上﹐這提供的便利當然是非常明顯的﹐特別是對那些提供 hosting 服務的 ISP/ICP 業者來說﹐更是救藥良方。

下面﹐讓我們先看看 IP-Based 的虛擬主機架設方法﹕

在 httpd.conf 檔案最後部份﹐我增加了這些句子﹕
<VirtualHost www.virtual.test>
ServerAdmin webmaster@siyongc.domain
DocumentRoot /home/httpd/virtual/virtual1
ServerName www.virtual.test
ErrorLog logs/www.virtual.test-error_log
TransferLog logs/www.virtual.test-access_log
</VirtualHost>

無論如何﹐我們首先要確定 /home/httpd/virtual/virtual1/ 這個目錄存在(回顧一下 access.conf 檔案﹕我已經為這個目錄設定好權限了)。同時 www.virtual.test 的 DNS 也設定好(包括正反解)﹔而且使用 IP Alias 為虛擬主機建立新的 IP 地址(可以有別於目前的子網範圍)。

如果您還有更多的虛擬主機要設定﹐將上面的句子 copy 幾份﹐修改好各自的內容就可以了。有時候﹐您或許要修改前面提到的 Listen 選項﹐例如﹕
Listen www.virtual.test:80

那麼﹐我們使用 Name-Based 又是怎麼設的呢﹖

和 IP-Based 一樣﹐首先我們要確定 DNS 的名稱﹐以及 access.conf 的目錄已經設定好。然後我們在 <VirtualHost> 前面加上一行NameVirtualHost﹐同時將 <VirtualHost>裡面的地址改成 IP﹕
NameVirtualHost 192.168.0.17
<VirtualHost 192.168.0.17>
ServerAdmin webmaster@siyongc.domain
DocumentRoot /home/httpd/html
ServerName www.siyongc.domain
ErrorLog logs/www.siyongc.domain-error_log
TransferLog logs/www.siyongc.doman-access_log
</VirtualHost>

<VirtualHost 192.168.0.17>
ServerAdmin webmaster@siyongc.domain
DocumentRoot /home/httpd/virtual/virtual1
ServerName www.virtual.test
ErrorLog logs/www.virtual.test-error_log
TransferLog logs/www.virtual.test-access_log
</VirtualHost>

不過使用 NameVirtualHost 模式後﹐原本建立在此 IP 的“真實”主機卻會消失掉﹐您必須將之當成 VirtualHost 一樣﹐也為之建立好 <VirtualHost> 設定哦~~。再有一點個人經驗要注意﹕如果在上面句子中用 IP (此列有三處)來設不工作的時候﹐將之改成 * 試試。

或許﹐有時候﹐您還想一個主頁有多個虛擬主機名稱﹐這一點也不難﹐您只要在 <VirtualHost> 範圍內加上一行﹕
ServerAlias second.virtual.host.name

或許您還會問﹕有沒有更刁鑽的啊﹖我可不可以將 IP-Based 和 Name-Based 混合起來設定啊﹖

哈哈﹐當然可以啦﹐不過我不詳細說明啦﹐請您自己參考 http://www.apache.org/docs/vhosts/

-- srm.conf --

最後﹐我們看一下 srm.conf 這個檔案的內容﹕

DocumentRoot /home/httpd/html
這是您的 Linux 主機預設的網站存放目錄﹐那個“It Worked!”網頁(如果您的機器設定好了﹐就可以看到了)就是放在這裡的 index.html 了。

UserDir html
嗯﹐這個設定嘛﹐原本是 public_html 來的﹐但我覺得太長﹐就將之裁短了。它用來指定存放使用者私人網站的目錄名稱﹐使用者家目錄下面一定要有這樣一個目錄﹐如﹕/home/netman/html ﹐要確定其名稱要和這裡的設定相同。然後您打﹕http://www.siyongc.domain/~netman/ ﹐就可以看到 netman 這個使用者的私人網站了(有時候﹐少了最後的“ / ”會看不到哦~~~)。您要注意的是﹐在預設情況下﹐使用者家目錄的權限為‘700’您得用 chmod 將之改成 755 才行(用 711 也可以﹐視乎您開放的權限而定)﹐如﹕ chmod 755 /home/netman 。不過﹐如果您不想要“/~netman”的那個“~”﹐我這裡教您一個法門﹕
在 srm.conf 裡面為 netman 建立一個別名﹕
Alias /netman /home/netman/html/

又或者用 link 的方式﹕
ln -s /home/netman/html /home/httpd/html/netman

這樣﹐您輸入 http://www.siyongc.domain/netman 就可以辦到了。不過﹐您得要確定 /home/httpd 這個目錄在 access.conf 裡面有‘Options FollowSymLinks’的設定。

AccessFileName .htaccess 
在前面的 access.conf 檔案我已經提到過這個 .htaccess 檔案(別少了前面那個小點“ . ”)。您在 access.conf 的<Directory >使用‘AllowOverride All’設定的話﹐Apache 就會讀取 .htaccess 的設定了﹐您只要在目錄下面建立起這個 .htaccess 就可以了。 透過它﹐我們可以為目錄進行一些特別限制﹐比如﹕要進入該目錄需要提供密碼﹐也可以指定有哪些使用者可以進入。範例如下﹕

AuthUserFile /home/httpd/virtual/virtual1/dir1/.htpwd
AuthName dir1pwd    #可以用任意名稱
AuthType Basic
<Limit POST GET>
require valid-user
</Limit>

您可以用其它檔案名稱代替上面那個 .htpwd檔案﹐它是用以下命令建立的﹕
htpasswd -c /home/httpd/virtual/virtual1/dir1/.htpwd user1
(注意﹕如果以後再增加使用者的話﹐請將“ -c ”參數拿掉。)

接下來﹕
DirectoryIndex index.html index.shtml index.cgi index.htm default.htm
如果您慣用了 NT IIS 上面的 default.htm 或 index.htm 來做首頁的話﹐將這兩個名字加上去。同時也修改一下在後面這句﹕
AddType text/html .shtml .htm

至於其他設定﹐有興趣自己看啦﹐我又偷懶去了 ^_^

最後﹐執行 ﹕
/etc/rc.d/init.d/httpd reload

來讓設定生效﹐一定要留意“[ OK ]”是否出現哦。

測試

然後﹐您就可以在流覽器的 URL 輸入 apache 主機名稱﹐當你看到“It worked!”畫面﹐應該就好了。如果您沒看到﹐確定 httpd 是否真被啟動了﹐留意一下 DNS 是否設定對﹐還有連線、IP、Port 等地方。

如果是虛擬主機﹐更要確定 IP aliase 是否被正式啟動了﹐同時 routing 也要確定正確。當然﹐在 /etc/httd/conf 下面的檔案也要仔細看看有沒疏忽之處啦﹐例如﹕的<Directory >有否設定好﹖是否使用了.htaccess﹖BindsAddress * 有沒有開啟﹖Listen 有沒有虛擬 IP 地址﹖等等﹐不一而足。

如果您流覽使用者個人網頁的時候碰到“Aceess Prohibited”的問題﹐多是存放網頁的目錄和其上級目錄的權限問題了﹐用‘chmod 755’就應該可以解決(或許還要包括上級目錄)。

如果您在開機的時候﹐停在 httpd 上面了﹐這可能是 httpd.conf 檔案中的 ServerName 找不到。確定您的 /etc/hosts 檔案有它的記錄﹐或者能夠透過 DNS 查詢得到就可以了。使用 ip-base 的 virtual host 也要注意這點﹐但使用 name-base 則可以忽略。

還有一點您可能要倍加小心﹕用來做測試的 browser 有時候顯示出來的畫面是從 cache 那裡來的﹐而未必是來自 server 那端﹐尤其是您未留意自己在 offline 的情況下。這樣很容易把您欺騙了﹐為了確定您的測試是真實的﹐我建議您最後的一次測試應該重新開機後再進行。

還不得不再提醒一次﹕前面提到的三設定檔為計較舊的 Apache 設定檔﹐新版的都已經全部整合在 httpd.conf 裡面了。如果您看得糊塗﹐那就請花點時間找找相應字眼吧。

有關更詳細的 Apache 安裝﹐推薦您參閱 阿帕契 HTTP 伺服器參考手冊

 

 


www.study-area.org © 2001 Netman 網中人
Last Updated: March 04, 2001