在 Linux 上建立虛擬主機最快速的方法 *
本篇的目的,是說明如何使用最簡單的方式在你的網頁伺服器 (Apache) 上新增一個虛擬主機 (Virtual Host),讓你只要建一個目錄,或新增一個本機用戶,就可以建立虛擬主機,並且可自動分割 Log 檔 (以下之設定牽涉到 Apache 及 DNS 的觀念,最好也有自行架設 DNS 服務)。
修改 Apache 設定
這部份需修改 Apache 的設定檔,使它以 VirtualDocumentRoot 及 VirtualScriptAlias 建立虛擬主機,並設定 Log 檔的輸出格式。執行步驟:
- 備份 Apache 的設定檔:
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.old
- 編輯 /etc/httpd/conf/httpd.conf,搜尋:
UseCanonicalName On
改成:
UseCanonicalName Off VirtualDocumentRoot /home/%0/public_html VirtualScriptAlias /home/%0/public_html/cgi-bin <Directory /home/*/public_html> Options FollowSymLinks AllowOverride All </Directory>
搜尋:
LogFormat "%{User-agent}i" agent
在下一行加入:
LogFormat "%V %h %l %u %t \"%r\" %>s %b" vcommon LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vcombined
- 如果你有使用 Awstats,請搜尋:
CustomLog logs/access_log combined
改成:
CustomLog logs/vhost.log vcombined
如果你沒有使用 Awstats,請搜尋:
CustomLog logs/access_log common
改成:
CustomLog logs/vhost.log vcommon
- 搜尋下列這一行,將它刪除或設成註解:
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
- 搜尋下列這些設定,將它刪除或設成註解:
<Directory "/var/www/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory>
- 如果當初已經有設定虛擬主機,請搜尋下面這一行,將它刪除或設成註解:
NameVirtualHost *
然後取消所有虛擬主機的設定 (同樣將它刪除或設成註解):
<VirtualHost *> . . . </VirtualHost>
- 儲存修改。
- 重新啟動 Apache 伺服器:
service httpd restart
分割虛擬主機的 Log 檔
這部份需下載本人寫的 Log 檔分割程式,本程式會將 vhost.log 依照 VirtualHost 的網址及月份,分割儲存成多個 log 檔。安裝步驟:
- 從本站下載 split-vhost.pl 至 /usr/bin/
cd /usr/bin wget http://here.vixual.net/files/source/log/split-vhost_pl mv split-vhost_pl split-vhost.pl chmod 755 split-vhost.pl
如有必要,請自行修改 split-vhost.pl 內的 $LogFile, $TempFile, $TargetDir 參數。
- 如果你有使用 Awstats,請修改 Awstats 下虛擬主機的設定檔 (假設你的虛擬主機的名稱為 "host.example.com"),將 LogFile 的參數改成:
/var/log/httpd/host.example.com.%YYYY-1%MM-1.log
其中的 "host.example.com" 是指你的虛擬主機的名稱,請依你的實際狀況輸入。
- 請於 "/etc/cron.hourly" 新增指令檔 "split-vhost.sh",內容如下:
#!/bin/sh /usr/bin/split-vhost.pl /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
- 更改檔案屬性為 755:
chmod 755 /etc/cron.hourly/split-vhost.sh
關於 DNS 設定
修改 DNS 的目的,就是要讓 *.example.com 都可以自動指向目前的主機,避免每次新增虛擬主機時,都要再修改及重新啟動 DNS。設定步驟:
- 編輯現有網域的 DNS 記錄檔 (此記錄檔通常位於 /var/named/),假設主機的 IP 為 "192.168.1.10",則在記錄檔的最後一行加上:
* IN A 192.168.1.10
其中的 "192.168.1.10" 是指你的主機的 IP 位址,請依你的實際狀況輸入。
- 重新啟動 DNS 服務:
service named restart
增加虛擬主機
完成上列步驟之後,如要建立虛擬主機,可使用下列兩種方式 (假設要新增 "virtual.example.com"):
- 方式一,以新增用戶的方式新增虛擬主機,用戶的名稱就是虛擬主機的名稱 (建議使用):
useradd virtual.example.com su virtual.example.com mkdir /home/virtual.example.com/public_html mkdir /home/virtual.example.com/public_html/cgi-bin exit chmod 711 /home/virtual.example.com passwd virtual.example.com
輸入密碼後即完成。
- 方式二,以建立子目錄的方式新增虛擬主機,子目錄的名稱就是虛擬主機的名稱:
mkdir /home/virtual.example.com mkdir /home/virtual.example.com/public_html mkdir /home/virtual.example.com/public_html/cgi-bin chmod 711 /home/virtual.example.com
使用以上兩種方式建立之 /home/virtual.example.com/public_html 目錄是用來放網頁的,而目錄下的 "cgi-bin" 則是用來放置 CGI 程式。建立好虛擬伺服器之後,並不需要重新啟動 Apache 或 DNS 喔!
重建原來的網頁伺服器
最後,由於使用以上的方式設定 Apache 之後,原來的網頁伺服器便沒有作用了 (不知你發現了沒?),所以,我們必須以符號連結的方式來重建原來的伺服器(假設原來的網址及 IP 分別為 "host.example.com" 及 "192.168.1.10"):
mkdir /home/host.example.com ln -s /var/www/html /home/host.example.com/public_html ln -s /var/www/cgi-bin /home/host.example.com/public_html/cgi-bin ln -s /home/host.example.com /home/192.168.1.10
No comments yet.