Posted on 

Apache2.2 於 NAT 後方正常使用 VirtualHost (兩個以上的網站在同一主機上)

這次只是純紀錄我搞好久的東西,沒想到一個小動作就解決了,害我爬文這麼久 Orz

若我們要在同一個主機上跑兩個以上網站,有很多種方法可以做,第一個是在主機上綁不同的 Public IP,第二個就是在同一個 domain 下建立不同的子目錄跑不一樣的網站,第三種呢,就是本文要說的,通常獨立的網站都會有一個代表性的 Domain,但是在同一台主機下要跑不同 Domain 的網站就得靠這第三種的方法,底下聽我娓娓道來。

這種方式呢,就是 Apache2 內建的 VirtualHost 功能 (不需額外安裝套件),VirtualHost 有兩種設定方式,一種是 ip-base,就是用於一台主機上有兩組以上的 Public IP,用 Domain 綁 IP 到網站,另一種是 name-base 的方式,也就是用 Domain 的方式綁網站,通常會比較建議用 name-base 的方式問題會比較少,對於浮動 IP 架站來說的人會比較方便,以下我們來看看設定方式吧

打開 /etc/httpd/conf/httpd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
NameVirtualHost domainA.urdomain:80 #綁你主要的 Domain,這個參數在 Apache 2.4 中會被移除,要注意  
<VirtualHost domainA.urdomain:80> #綁你其中之一的 Domain
ServerAdmin webmaster@aaa.example.com
DocumentRoot /var/www/html/test1/ #目錄指向網站
ServerName domainA.urdomain #要記得給 ServerName,打 Domain 上去就行
AddType application/x-httpd-php .php
<Directory "/var/www/html/test1/" > #針對這個網站的目錄做個別設定
Order Deny,Allow
Allow from all
</Directory>
Alias /test1-1 "/var/www/html/test1-1/" #若在這個 Domain 的網站下有其他子目錄就可以在這裡設定
<Directory "/var/www/html/test1-1/"> #針對這個子目錄做其他特別設定
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

<VirtualHost domainB.urdomain:80> #綁你另一個網站的 Domain
ServerAdmin webmaster@bbb.example.com
DocumentRoot /var/www/html/test2/
ServerName domainB.urdomain
AddType application/x-httpd-php .php
Alias /phpmyadmin /var/www/html/phpmyadmin/
<Directory "/var/www/html/phpmyadmin/" >
Order Deny,Allow
Allow from all
</Directory>
</VirtualHost>

理論上來說,只要設定好,網站就能看 Domain 分別跑網站了,但小弟本人是架在 NAT 底下,就是用一台 IP 分享器以 PPPoE 連上網路,然後用 port forwarding 的方式把 80 port 轉到伺服器上,就在小弟儲存設定了,也把 Apache 重開了,卻發現不管怎麼樣上面的設定都沒有用,都一直跑 Apache 的預設頁面 (有 It Works! 的那個頁面),在 google 上爬文許久,有人說要改 Linux 的 /etc/hosts,原本以為是個 trick,想說怎麼可能要設定這個東西,但是人就是不能太鐵齒(其實是為自己太廢找理由),我就抱著死馬當活馬醫的心態設定看看,所以我在 hosts 裡面分別設定 domain 的 Private IP 居然就好了,實在是槌心肝啊。

1
vim /etc/hosts
1
192.168.xxx.xxxx domainA.urdomain domainB.urdomain #(xxx 的部份就自己下 ifconfig 指令自己看自己改囉)

以上,只要在 /etc/hosts 裡加上這行就好了,前面的 IP 還不能是 127.0.0.1 喔,也不能是 Public IP,其實原理如何我也不太清楚,我一直以為只要 domain 解析是自己家的 Public IP,分享器負責幫我 port forwarding 就好了說… Orz