作者 主題: Apache Virtual Host 最簡單的做法 (含 DNS,讓你建目錄等於建虛擬主機 )  (閱讀 50374 次)

0 會員 與 1 訪客 正在閱讀本文。

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
以下有部份取自原來我貼在 VBird 的文章
Apache 的 VH 其實設法相當多種,
相信大多數都是這種設法
<VirtualHost 1.2.3.80:80>
ServerAdmin admin@xxx.com.tw
DocumentRoot /home/httpd/html/enum
ServerName VH1.xxx.com.tw
ErrorLog logs/VH1-error.log
CustomLog logs/VH2-access_log common
</VirtualHost>
因為書本上教的,但是你改了這些值, httpd 要重新啟動...
高明點用 rewrite modules: (要有 RE 的基礎)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.[^.]+\.host\.com$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^www\.([^.]+)\.host\.com(.*) /home/$1$2

這樣只要新增 /home 目錄下的目錄就是新增 VirtualHost 了,且 httpd 不需重開
(有很多不同設法, http://httpd.apache.org/docs/misc/rewriteguide.html)

另外一種方法:Mass Virtual Hosting (亦不需要重啟 httpd)
UseCanonicalName on
CustomLog /home/www/access_log "%{VHOST}e %h %l %u %t \"%r\" %>s %b" :
RewriteEngine on
RewriteMap lowercase int:tolower
RewriteMap vhost txt:/etc/vhost.map #路徑自己設
RewriteCond %{REQUEST_URI} !^/commonurl1/.*
RewriteCond %{REQUEST_URI} !^/commonurl2/.*
RewriteCond %{REQUEST_URI} !^/commonurlN/.*
RewriteCond %{HTTP_HOST} !^$
RewriteCond ${lowercase:%{HTTP_HOST}|NONE} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/$1 [E=VHOST:${lowercase:%{HTTP_HOST}}]

#/etc/vhost.map 檔,加一行並新增對應目錄就是一個 VirtualHost
www1.xxx.com.tw:80 /home/www/www1
www2.xxx.com.tw:80 /home/www/www2
#這個方法也是 rewrite 的一種,且亦不需重新啟動 httpd,但是 httpd.conf 中要
#enable 這兩行 或是 complier 時以 static link 方式編進 httpd core
# rewrite 雖不容易懂,但懂了後就很好用
LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c



最後一種方法最簡單:
UseCanonicalName Off
VirtualDocumentRoot /home/www/%0

#%0 就是 HOST_NAME,像 www.xxx.com.tw ,一個目錄就是一個 Virtual,
#詳細用法可以看這裏哦
# http://httpd.apache.org/docs-2.1/mod/mod_vhost_alias.html

%N 的意義
0 the whole name
1 the first part
2 the second part
-1 the last part
-2 the penultimate part
2+ the second and all subsequent parts
-2+ the penultimate and all preceding parts
1+ and -1+ the same as 0

通常若您做網站代管這種業務,目錄都會再依序分層,有學過資料結構和演算法的話,你就知道一個平的目錄,不如一個有深度規畫的目錄來的好:
/home/www/tw/com/xxx/
/home/www/tw/org/yyy/
那就是
VirtualDocumentRoot /home/www/....你自己去實驗了哦...


以上是 VH 的設定法,我們假設 IP 為 1.2.3.80, 那我們再來看看 dns 的部份

$TTL 3600
$ORIGIN xxx.com.tw.
@ IN SOA dummy.xxx.com.tw. admin.xxx.com.tw. (
    1 38400 3600 864000 86400)
      IN  NS   ns1
      IN  NS   ns2
      IN MX 10 mail
ns1 IN   A  1.2.3.4
ns2 IN   A  1.2.3.5
mail IN  A  1.2.3.4
www IN A  1.2.3.80  
; 以上都是一般的設定狀況...最後再加一筆
*     IN  A  1.2.3.80

這樣的 zone file 的內容,只要是查 除了 ns1/ns2/mail/www 外,
查 a.xxx.com.tw 或 xxxxxxxxxx.xxx.com.tw 得到的結果都是
1.2.3.80, 這也是大家習慣的萬用字元的用法

我們依據以下設法(httpd.conf):
UseCanonicalName Off
VirtualDocumentRoot /home/www/%0

在 /home/www/  之下, 你每建一個 ???.xxx.com.tw 的目錄
(不含巳指明且不同 IP 的),就是建立一個 虛擬主機哦
EZ 吧 ~~我自己幾乎都是用這樣的做法,至少較最多人用的方法
都簡單許多哦

姨~什麼時候變 "榮譽博士" ?
好~改天再來貼一點獨門絶活
( :P 哈 一定不是獨門....但是都是自己 study 來的)

achilles

  • 懷疑的國中生
  • **
  • 文章數: 30
    • 檢視個人資料
    • http://www.vixual.net/
你好:
引用
最後一種方法最簡單:
UseCanonicalName Off
VirtualDocumentRoot /home/www/%0

請問以上的設法,有辨法加入 cgi-bin 嗎?
以及,如何將每個站的 access-log 分開?

謝謝。
Vixual 網路視野
http://www.vixual.net/

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
我給你網址 ~你自己看,你覺得如何呢 ?
不懂我們可以再討論哦 ~~
cgi  :  上面提到的那個 URL 有寫哦 ~~請仔細看 , 不要只看我貼的
因為我貼的作法很簡單,都沒有解釋太多....很容易造成知之為知之
不知為不知

vhost:
可參考這裏 http://httpd.apache.org/docs-2.1/vhosts/fd-limits.html    
或是我自己很特別的做法 :
原來你的  log 的設法.,假設是如下內容
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common


變通一下吧
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/%v/access_log 86400" common

%v 就是 vhost name , 了
你也可以加日期,自動一個日期一個目錄 如 %Y.%m.%d ...
(什麼,日期目錄不會自動產生? 用 crontab 自己建)
%? 可參考這
http://httpd.apache.org/docs-2.1/mod/mod_log_config.html#customlog

書上沒教過的哦 ~~

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
精華區的送出後就不能再編輯了 ...
可能有很多人可能會覺得我怎能知道的那麼細吧 ~
我是有時間就到官方網站上去看文件
不然就看 Source Code 囉 ~~其實 Source Code 內都有註解
練英文 / 練程式 / 練 trace 功力 / HTTP 標準  一舉數得

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
引用
ns1 IN A 1.2.3.4
ns2 IN A 1.2.3.5
mail IN A 1.2.3.4
www IN A 1.2.3.80
; 以上都是一般的設定狀況...最後再加一筆
* IN A 1.2.3.80


這裏我再補充一下,


* 號在 DNS 請不要過度濫用, 除非你知道你在做什麼, 不然意義不大

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
請問 abel 兄:
在 RR 檔的 * 號,能包含 . 符號嗎?
如 *.my.com 能夠包含 host.my.com 跟 host.sub.my.com 嗎?

sorry,懶得找文件及實作了...  ^_^

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
可以
但是如果用了 * 後,  subdomain 的授權就無法再使用了哦
因為會打架

誰用了 * 號 ?
.com 用了   * 號哦, Verisign 真狠
在 IDN 上用了 * 號 , (IDN=I18N DN)
[root@twnic mrtg]# nslookup
Note:  nslookup is deprecated and may be removed from future releases.
Consider using the `dig' or `host' programs instead.  Run nslookup with
the `-sil[ent]' option to prevent this message from appearing.
> 無無無.com.
Server:         127.0.0.1
Address:        127.0.0.1#53

Non-authoritative answer:
Name:   無無無.com
Address: 198.41.1.35


查不到的網域名稱轉到一個 Web Page 去了

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
感謝感謝﹗

剛還想開台  rh7.3 來測測看,就看到兄台回覆了。再感謝!

harry112

  • 憂鬱的高中生
  • ***
  • 文章數: 198
    • 檢視個人資料
Abel兄:
我現在正用您的第三個方法,但有一個問題。
我的openwebmail是用rpm裝的,並設了一virtual host,其內只包含一index.html檔,內容如下:
<html>
<head><meta http-equiv="Refresh" content="0;URL=/cgi-bin/openwebmail/openwebmail.pl">
</head>
<body onload="window.open('/cgi-bin/openwebmail/openwebmail.pl','_top')">
</body>
</html>

功能皆可正常使用,但圖檔都無法顯示,請問我該check什麼地方呢?

James Wu

  • 鑽研的研究生
  • *****
  • 文章數: 683
    • 檢視個人資料
在你的虛擬目錄下
ln -s /var/www/data就可以囉
或是ln -s /usr/local/httpd/data
要看你的apache裝在那個目錄下決定

harry112

  • 憂鬱的高中生
  • ***
  • 文章數: 198
    • 檢視個人資料
引述: "James Wu"
在你的虛擬目錄下
ln -s /var/www/data就可以囉
或是ln -s /usr/local/httpd/data
要看你的apache裝在那個目錄下決定

謝謝,可以了~~

achilles

  • 懷疑的國中生
  • **
  • 文章數: 30
    • 檢視個人資料
    • http://www.vixual.net/
我參考了本篇文章,自己寫了篇教學文件,如果實作上有遇到問題,可以來看看我的文件...
http://www.vixual.net/blog/archives/19
« 上次編輯: 2008-07-11 17:40 由 achilles »
Vixual 網路視野
http://www.vixual.net/

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
yeah~
我覺得您寫得蠻好的呀!
不像我寫時都是興之所至...
不過如果可以將這一段解釋一下會更好,因為分目錄確實蠻重要的:
引用
#%0 就是 HOST_NAME,像 www.xxx.com.tw ,一個目錄就是一個 Virtual,
#詳細用法可以看這裏哦
# http://httpd.apache.org/docs-2.1/mod/mod_vhost_alias.html

%N 的意義
0 the whole name
1 the first part
2 the second part
-1 the last part
-2 the penultimate part
2+ the second and all subsequent parts
-2+ the penultimate and all preceding parts
1+ and -1+ the same as 0



另外,給您一些參考,若可以再寫出
http://www.mysql.com/portal/software/item-316.html
http://www.mysql.com/portal/software/item-241.html
這兩篇文章的教學來 (libnss-mysql 學園好像有了,不確定)
或像 apache 2.x 的 (因為您對 perl 好像還蠻在行的 :D  :D )
http://search.cpan.org/author/JRLITTELL/Apache-AuthenIMAP-0.03/AuthenIMAP.pm  (用 IMAP protocol 作 account 認證)
http://search.cpan.org/author/SPEEVES/Apache-AuthenNTLM-2.04/smb/Smb.pm (用 samba 做 HTTP Auth 認證)
http://search.cpan.org/author/SPEEVES/Apache-AuthNetLDAP-0.25/AuthNetLDAP.pm ( 用 LDAP 做認證 )
http://search.cpan.org/author/GEOFF/Apache-AuthenHook-2.00_01/AuthenHook.pm (用自己的 hook 做認證)
http://search.cpan.org/author/DANIEL/Apache-AuthenRadius-0.3/AuthenRadius.pm  (Radius 認證)
http://search.cpan.org/author/HDANIEL/Apache-AuthPAM-0.01/AuthPAM.pm (PAM )
...........實在太多 perl module 了.....(有興趣的也可去實作看看囉)

我相信您的文件一定會更豐富的 ,因為 Web Hosting 一定會有一套帳號控管的方式,
如何統一 User 各種的 Service 的認證亦是蠻重要的

(我個人是都較喜歡 DB 走向)

jasy

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
請教:舉例網域 http://www.abc.com/test/ 可瀏覽網頁 問題出在 http://www.abc.com/test 目錄未加 / 確無法瀏覽網頁  ???

la_steva

  • 活潑的大學生
  • ***
  • 文章數: 214
    • 檢視個人資料
請問一下
假如依此做法
如果我有兩個DOMAIN NAME
但是只有一台主機
也可以做嗎?