- Vixual - http://www.vixual.net/blog -

在 Linux 上建立虛擬主機最快速的方法 *

本篇的目的,是說明如何使用最簡單的方式在你的網頁伺服器 (Apache) 上新增一個虛擬主機 (Virtual Host),讓你只要建一個目錄,或新增一個本機用戶,就可以建立虛擬主機,並且可自動分割 Log 檔 (以下之設定牽涉到 Apache 及 DNS 的觀念,最好也有自行架設 DNS 服務)。

修改 Apache 設定

這部份需修改 Apache 的設定檔,使它以 VirtualDocumentRoot 及 VirtualScriptAlias 建立虛擬主機,並設定 Log 檔的輸出格式。執行步驟:

  1. 備份 Apache 的設定檔:
    cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.old
  2. 編輯 /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
  3. 如果你有使用 Awstats,請搜尋:
    CustomLog logs/access_log combined

    改成:

    CustomLog logs/vhost.log vcombined

    如果你沒有使用 Awstats,請搜尋:

    CustomLog logs/access_log common

    改成:

    CustomLog logs/vhost.log vcommon
  4. 搜尋下列這一行,將它刪除或設成註解:
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
  5. 搜尋下列這些設定,將它刪除或設成註解:
    <Directory "/var/www/cgi-bin">
      AllowOverride None
      Options None
      Order allow,deny
      Allow from all
    </Directory>
  6. 如果當初已經有設定虛擬主機,請搜尋下面這一行,將它刪除或設成註解:
    NameVirtualHost *

    然後取消所有虛擬主機的設定 (同樣將它刪除或設成註解):

    <VirtualHost *>
      .
      .
      .
    </VirtualHost>
  7. 儲存修改。
  8. 重新啟動 Apache 伺服器:
    service httpd restart

分割虛擬主機的 Log 檔

這部份需下載本人寫的 Log 檔分割程式,本程式會將 vhost.log 依照 VirtualHost 的網址及月份,分割儲存成多個 log 檔。安裝步驟:

  1. 從本站下載 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 參數。

  2. 如果你有使用 Awstats,請修改 Awstats 下虛擬主機的設定檔 (假設你的虛擬主機的名稱為 "host.example.com"),將 LogFile 的參數改成:
    /var/log/httpd/host.example.com.%YYYY-1%MM-1.log

    其中的 "host.example.com" 是指你的虛擬主機的名稱,請依你的實際狀況輸入。

  3. 請於 "/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
  4. 更改檔案屬性為 755:
    chmod 755 /etc/cron.hourly/split-vhost.sh

關於 DNS 設定

修改 DNS 的目的,就是要讓 *.example.com 都可以自動指向目前的主機,避免每次新增虛擬主機時,都要再修改及重新啟動 DNS。設定步驟:

  1. 編輯現有網域的 DNS 記錄檔 (此記錄檔通常位於 /var/named/),假設主機的 IP 為 "192.168.1.10",則在記錄檔的最後一行加上:
    *  IN  A  192.168.1.10

    其中的 "192.168.1.10" 是指你的主機的 IP 位址,請依你的實際狀況輸入。

  2. 重新啟動 DNS 服務:
    service named restart

增加虛擬主機

完成上列步驟之後,如要建立虛擬主機,可使用下列兩種方式 (假設要新增 "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

參考網址