配置 Apache 支援多個網域

FlossDoc,自由中文開源知識庫

Jump to: navigation, search

目录


何謂 Virtual Hosting?

Virtual Hosting 就是同一台伺服器可以同時處理超過一個網域 (domain)。即是說,假設 www.example1.netwww.example2.net 兩個網域都指向同一部電腦,如果電腦上的網頁伺服器 (WWW Server) 支援 Virtual Hosting,那您用 www.example1.netwww.example2.net 去訪問同一個伺服器就可以取得不同的網站。

IP-based 和 Host-based Virtual Hosting

本身 Virtual Hosting 技術分 IP-based 和 Host-based。IP-based Virtual Hosting 是指運行網站伺服器的電腦有多個 IP 地址 (IP Address),訪問不同的 IP 地址就可以取得不同的網站。Host-based Virtual Hosting 則是指在 DNS 上多個網域都是指向同一個 IP 地址,網頁瀏覽器 (WWW Browser) 透過 HTTP 協定告知網頁伺服器要訪問那個網站。

一來 IP-based Virtual Hosting 需要多 IP 地址,即每個網站都要多點成本,二來 Host-based Virtual Hosting 技術已有十年多,現存所有網頁瀏覽器和網頁伺服器都有支援,所以現時很少人會採用 IP-based Virtual Hosting。不過因為 TLS/SSL 技術限制了每一個 IP 地址只可以支援一張電子證書 (Digital Certificate),所以如果您要在同一部電腦使用多過一張電子證書,您仍然需要 IP-based Virtual Hosting。

當然您亦可以將 IP-based 及 Host-based Virtual Hosting 混合使用於同一台 Apache 網頁伺服器中。

Debian 或 Ubuntu 的 Apache2 (2.x)

安裝 Debian/Ubuntu 套件 apache2

# apt-get install apache2

在目錄 /etc/apache2/sites-available 建立一個新檔案 (建議使用新站網域名稱,例如 www.examples.net) 存放有關網站的設定:

<VirtualHost *>
    # 在 ServerName 後加上您的網站名稱
    ServerName www.examples.net
    # 如果您想多個網站名稱都取得相同的網站,可以加在 ServerAlias 後加上其他網站別名。
    # 別名間以空格間開。
    ServerAlias web.examples.net mail.examples.net
    # 在 ServerAdmin 後加上網站管理員的電郵地址,方便別人有問題是可以聯絡網站管理員。
    ServerAdmin webmaster@examples.net

    # 在 DocumentRoot 後加上存放網站內容的目錄路徑
    DocumentRoot /var/www/www.examples.net
    <Directory /var/www/www.examples.net>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
    ServerSignature On
</VirtualHost>

使用 "a2ensite domainname" 啟動上面的配置檔。例如:

# a2ensite www.examples.net

記謹建立您在以上配置檔中所提到的目錄,例如 /var/www/www.examples.net:

# mkdir /var/www/www.examples.net

檢查您的配置檔中是否有任何語法錯誤:

# apache2ctl configtest

重新啟動 Apache:

# /etc/init.d/apache2 reload

Debian 的 Apache 1.3.x

安裝 Debian 套件 apache

# apt-get install apache

在 Apache 配置檔案 /etc/apache/httpd.conf 的尾部加入以下內容:

<VirtualHost *>
    # 在 ServerName 後加上您的網站名稱
    ServerName www.example.net
    # 如果您想多個網站名稱都取得相同的網站,可以加在 ServerAlias 後加上其他網站別名。
    # 別名間以空格間開。
    ServerAlias web.example.net mail.example.net *.example.org
    # 在 ServerAdmin 後加上網站管理員的電郵地址,方便別人有問題是可以聯絡網站管理員。
    ServerAdmin webmaster@example.net

    # 在 DocumentRoot 後加上存放網站內容的目錄路徑
    DocumentRoot /var/www/www.examples.net
    <Directory /var/www/www.examples.net>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Allow from all
    </Directory>

    ErrorLog /var/log/apache/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache/access.log combined
</VirtualHost>

記謹建立您在以上配置檔中所提到的目錄,例如 /var/www/www.examples.net:

# mkdir /var/www/www.examples.net

檢查您的配置檔中是否有任何語法錯誤:

# apachectl configtest

重新啟動 Apache:

# /etc/init.d/apache reload

CentOS 5/RHEL 5/Scientific Linux 5.x 的 Apache

確定在 Apache 配置檔案 /etc/httpd/conf/httpd.conf 的「NameVirtualHost *」前的 「#」 已被刪去:

NameVirtualHost *:80

在目錄 /etc/httpd/conf.d/ 建立一個名稱以 .conf 為尾新檔案 (建議使用新站網域名稱加上「.conf」,以仍管理。例如 /etc/httpd.conf.d/www.examples.net.conf) 存放有關網站的設定:

<VirtualHost *>
    # 在 ServerName 後加上您的網站名稱
    ServerName www.examples.net
    # 如果您想多個網站名稱都取得相同的網站,可以加在 ServerAlias 後加上其他網站別名。
    # 別名間以空格間開。
    ServerAlias web.examples.net mail.examples.net
    # 在 ServerAdmin 後加上網站管理員的電郵地址,方便別人有問題是可以聯絡網站管理員。
    ServerAdmin webmaster@examples.net

    # 在 DocumentRoot 後加上存放網站內容的目錄路徑
    DocumentRoot /var/www/www.examples.net
    <Directory /var/www/www.examples.net>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Allow from all
    </Directory>

    ErrorLog /var/log/httpd/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/httpd/access.log combined
    ServerSignature On
</VirtualHost>

記謹建立您在以上配置檔中所提到的目錄,例如 /var/www/www.examples.net:

# mkdir /var/www/www.examples.net

檢查您的配置檔中是否有任何語法錯誤:

# apachectl configtest

重新啟動 Apache:。

# service httpd reload

Fedora Linux 或 Red Hat Linux 的 Apache

確定在 Apache 配置檔案 /etc/httpd/conf/httpd.conf 的「NameVirtualHost *」前的 「#」 已被刪去:

NameVirtualHost *:80

在 /etc/httpd/conf/httpd.conf 的尾部加入以下內容:

<VirtualHost *>
    # 在 ServerName 後加上您的網站名稱
    ServerName www.examples.net
    # 如果您想多個網站名稱都取得相同的網站,可以加在 ServerAlias 後加上其他網站別名。
    # 別名間以空格間開。
    ServerAlias web.examples.net mail.examples.net
    # 在 ServerAdmin 後加上網站管理員的電郵地址,方便別人有問題是可以聯絡網站管理員。
    ServerAdmin webmaster@examples.net

    # 在 DocumentRoot 後加上存放網站內容的目錄路徑
    DocumentRoot /var/www/www.examples.net
    <Directory /var/www/www.examples.net>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Allow from all
    </Directory>

    ErrorLog /var/log/httpd/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/httpd/access.log combined
    ServerSignature On
</VirtualHost>

記謹建立您在以上配置檔中所提到的目錄,例如 /var/www/www.examples.net 。

# mkdir /var/www/www.examples.net

檢查您的配置檔中是否有任何語法錯誤:

# apachectl configtest

重新啟動 Apache 。

# service httpd reload

Mandriva Linux 的 Apache 2.0.x

安裝 Mandriva 套件 apache-mpm-prefork:

# urpmi apache-mpm-prefork

確定在 Apache 配置檔案 /etc/httpd/conf/httpd.conf的 "NameVirtualHost *:80" 及 "Setenv VLOG" 前的 "#" 已被刪去:

NameVirtualHost *:80
Setenv VLOG

在目錄 /etc/httpd/conf/vhosts.d 建立一個新檔案 (建議使用新網站名稱,例如 ”www.examples.net“) 存放有關網站的設定:

<VirtualHost *>
    # 在 ServerName 後加上您的網站名稱
    ServerName www.examples.net
    # 如果您想多個網站名稱都取得相同的網站,可以加在 ServerAlias 後加上其他網站別名。
    # 別名間以空格間開。
    ServerAlias web.examples.net mail.examples.net
    # 在 ServerAdmin 後加上網站管理員的電郵地址,方便別人有問題是可以聯絡網站管理員。
    ServerAdmin webmaster@examples.net

    # 在 DocumentRoot 後加上存放網站內容的目錄路徑
    DocumentRoot /var/www/www.examples.net
    <Directory /var/www/www.examples.net>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Allow from all
    </Directory>

    ErrorLog /var/log/httpd/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/httpd/access.log combined
    ServerSignature On
</VirtualHost>

記謹建立您在以上配置檔中所提到的目錄,例如 /var/www/www.examples.net 。

# mkdir /var/www/www.examples.net

重新啟動 Apache 。

# /etc/init.d/httpd reload

配置選項詳解

IP Alias

如果您需要使用 IP-based virtual hosting,您先需要利用 IP Alias 令您的 GNU/Linux 同時擁有超過一個IP地站,做法是以 root 身份鍵入指令 "ifconfig 介面:編號 IP地址",例如:

# ifconfig eth0:0 192.168.0.101

NameVirtualHost

NameVirtualHost選項的作用是告訴 Apache 那個 IP 地址所指的網絡介面入來的要求需要用 Host-based Virtual Hosting。即是當有由 NameVirtualHost 標示過網絡介面的要求入來時,Apache 會檢查要求標頭是否有 "Host:" 項目(標示了要訪問的網站名稱),並根據要訪問網站名稱決定採用那一組 <VirtualHost>...</VirtualHost> 的設定。NameVirutalHost 的語法是:

NameVirtualHost IP地址[:]

例如:

NameVirutalHost 192.168.0.1
<VirtualHost 192.168.0.1>
# ...
</VirtualHost>

如果您要有多個網絡介面需要 Name-based 設定,請重覆多個 NameVirtualHost 選項標示所有網絡介面對應的IP地址。如果您想電腦所有網絡介面進來的要求都而要 Name-based Virtual Hosting,可以使用星號 "*" 代替IP地址:

NameVirtualHost *

要標示埠,可以:

NameVirtualHost *:8080

<VirtualHost>

<VirtualHost> 用作包著每個虚擬網站的設定。其語法為:

<VirtualHost 地址[:] 地址[:] ...> ... </VirtualHost>

地址可以以下幾種

  • 虚擬網站的 IP 地址
  • 對應 IP 地址的 Full Qualified Domain Name
  • * - 代表任何 IP 地址
  • _default_ - 適用於未符合所有其他IP地址的設定

例如:

<VirtualHost 10.1.2.3>
 ServerAdmin webmaster@host.example.org
 DocumentRoot /www/docs/host.example.org
 ServerName host.example.net
 ErrorLog logs/host.example.net-error_log
 TransferLog logs/host.example.net-access_log
</VirtualHost>

ServerName

ServerAlias

ServerAdmin

DocumentRoot

相關連結

Personal tools