在上一篇學習了LAMP安裝後,想較深入的學習下Apache,http://www.apache.org/是她的官方網站,http://httpd.apache.org/docs/2.2/這是官方的手冊,http://lamp.linux.gov.cn/Apache/ApacheMenu/index.html這是中文的手冊。這裏就不再說安裝了,只學習相關的配置。什麼是虛擬主機?它的優點有哪些?主要應用在哪裏?可以看一下「百度百科」http://baike.baidu.com/view/7383.htm?fr=ala0_1_1
引用百度百科:虛擬主機的關鍵技術在於,即使在同一台硬件、同一個作業系統上,運行着為多個用戶打開的不同的伺服器程式,互不干擾。而各個用戶擁有自己的一部分系統資源(IP位址、文檔存儲空間、內存、CPU時間等)。虛擬主機之間完全獨立,在外界看來,每一台虛擬主機和一台單獨的主機的表現完全相同。所以這種被虛擬化的邏輯主機被形象的稱為「虛擬主機」。
虛擬主機還有一兄弟叫「虛擬機」,它的產品有:全球首款中國人自己設計的高速虛擬機VMLite(創始人駱輝紅博士);VMware的相關產品 VMware Workstation,VMware Server等;微軟的Virtual pc ,Hyper-V;開源的VirtualBox,OpenVZ;紅帽企業級虛擬化RHEV;KVM等。感興趣的可以去http://www.xuniji.com/forum/看看。
但是,虛擬主機與虛擬機是不同的東西,不要混淆了。
操作:
1,Apache的配置文件
(1)apache的相關信息,通過apache2 命令,可以了解一些apache的信息
學習apache2的用法
#man apache2
#apache2 –V(大寫)

可以看apache的版本是2.2.14,使用的MPM是prefork。
#sudo cat /etc/apache2/envars

可以看到運行apache的用戶和組是www-data。
(2)apache2的相關配置文件在/etc/apache2下
apache2.conf 是全局配置文件,也是主配置文件
conf.d 一般性的配置
envvars 存放環境變量
httpd.conf 用戶配置文件
mods-available 已安裝的可用模塊
mods-enabled 已啟用的模塊
ports.conf httpd服務的端口號
sites-available 可用的虛擬主機
sites-enabled 啟用的虛擬主機
(3)apache的模塊的啟用和禁止
啟用一個模塊
#sudo a2enmod 模塊名
禁止一個模塊
#sudo a2dismod 模塊名
搜索想要的模塊
#sudo apt-cache search libapache2-mod
找到想要的模塊後,用以下命令安裝
#sudo apt-get install 模塊名
在/etc/apache2/mods-available 是已安裝的可用模塊,/etc/apache2/mods-enabled 是已啟用的模塊
(4)啟用和禁止虛擬站點
啟用一個站點
#sudo a2ensite 站點名
禁止一個站點
#sudo a2dissite 站點名
(5)apache的網頁放到哪了?
默認在/var/www目錄下,可以通過DocumentRoot關鍵字定義你想存放的位置,這個在虛擬主機定義時就會用到,安裝完以後只有一個有 效虛擬主機/etc/apache2/sites-available/default,也是在這個文件里定義DocumentRoot,這個根據自己的 需要進行合理的規劃。
2,虛擬主機,可以參考http://lamp.linux.gov.cn/Apache/ApacheMenu/vhosts/index.html中關於虛擬主機的講解。
有三種方式實現虛擬主機,一是基於同一IP,不同端口的虛擬主機;二是同一端口,不同IP的虛擬主機;三是基於同一IP,同一端口,不同名字的虛擬 主機。但是由於SSL協議先天特性決定了基於域名的虛擬主機無法成為SSL安全伺服器,所以想使用SSL的,就不能用基於主機名的虛擬主機。
與虛擬主機有關係的一個文件那就是ports.conf,因為它定義了httpd服務要監聽IP及端口號,默認情況是

*代表是本機上所有IP
(1)基於域名的虛擬主機
1-1.先把/etc/apache2/ports.conf改成以下內容:

1-2,建一個以www.labtest.com為域名的虛擬主機
$ cd sites-available/
$ sudo cp default labtest
$sudo vim labtest

其它內容先暫不做修改
1-3,在/var/www下建labtest目錄,並新建一測試用的index.html
$sudo mkdir /var/www/labtest
$sudo vim /var/www/labtest/index.html

1-4,啟用虛擬主機labtest
$sudo a2ensite labtest
$sudo /etc/init.d/apache2 reload
1-5,在一測試機上如下設置,因為這裏沒有配置DNS,如果DNS配置好了,就把測試機上的DNS伺服器指到相應的DNS上。
如果是在ubuntu系統上測試,則:
$sudo vim /etc/hosts
添加以下內容
192.168.3.5 www.labtest.com
如果是在windows xp 上測試,則:
在c:\WINDOWS\system32\drivers\etc\hosts里添加
192.168.3.5 www.labtest.com
在瀏覽器中輸入http://www.labtest.com,看是否顯示labtest1,若是則成功。
在做實驗過程中出現以下問題 :
重新reload 時,提示以下警告

解決方法是:在/etc/apache2/apache2.conf里加入
ServerName ubuntulab(本機的計算機名)
出現以下警告

解決方法是:

就是把<VirtualHoat 192.168.3.5>改成<VirtualHoat 192.168.3.5:80>
出現以下警告

這phpmyadmin引起的錯誤,
解決方法:
在/etc/apache2/apache2.conf 中去掉
Include /etc/phpmyadmin/apache.conf
在http://ubuntuforums.org/archive/index.php/t-829124.html中有對這個問題的討論,在上篇關於LAMP的安裝中,就發現不加這句配置,phpmyadmin也是可以成功運行。
/etc/apache2/conf.d/phpmyadmin.conf是/etc/phpmyadmin/apache.conf的一個連結文件。
在/etc/apache2/conf.d/phpmyadmin.conf中

這句配置是一定有的,如果沒有phpmyadmin是不能成功運行的。
(2)基於不同IP,同端口的虛擬主機
2-1,給網卡eth0配置第二個IP位址
$sudo ifconfig eth0:0 192.168.3.51 netmask 255.255.255.0 broadcast 192.168.3.255 up
2-2,把/etc/apache2/ports.conf中的NameVirtualHost 給註釋掉,否則在重啟apache2時會出錯。

2-3,修改站點配置文件default,labtest,在/etc/apache2/sites-available目錄下
default的配置改為:<VirtualHoat 192.168.3.5>
labtest的配置改為:<VirtualHoat 192.168.3.51>
其它配置不變。
2-4,啟動虛擬主機,重新載入 apache伺服器
$sudo a2ensite default
$sudo a2ensite labtest
$sudo /etc/init.d/apache2 reload
2-5,配置DNS伺服器或在hosts文件中做相應的修改
192.168.3.5 www.lab.com
192.168.3.51 wwww.labtest.com
在瀏覽器中不同的輸入IP或域名,會顯示不同的內容則成功。
在實驗過程中出現以下問題:

第一錯誤的解決方法是在/etc/hosts里添加
192.168.3.51 ubuntulab(本機的計算機名)
因為192.168.3.51是後面添加的IP,沒有解析到主機名
第二個警告的解決方法是:有一個虛擬主機也採用了192.168.3.5的IP ,引起了IP位址的重複,查看/etc/sites-enabled下啟用的虛擬主機採用的IP位址是否與192.168.3.5重複,若是則改為其它IP即可。
第三個警告是由於沒有把/etc/apache2/ports.conf中的NameVirtualHost 給註釋掉引起的,該配置只用於基於域名的虛擬主機。
(3)基於不同端口,同IP的虛擬主機
3-1,修改/etc/apache2/ports.con文件為

3-2,修改站點配置文件default,labtest,在/etc/apache2/sites-available目錄下
default的配置改為:<VirtualHoat 192.168.3.5:80>
labtest的配置改為:<VirtualHoat 192.168.3.5:808>
3-3,啟動虛擬主機,重新載入 apache伺服器
$sudo a2ensite default
$sudo a2ensite labtest
$sudo /etc/init.d/apache2 reload
3-4,測試
在瀏覽器里訪問時就要加上端口號如:
http://192.168.3.5
http://192.168.3.5:808或http://www.labtest1.com:808
做實驗時發現在port.conf不可寫成


告訴你語法錯誤。
3,虛擬主機的配置文件,以一個虛擬主機為例。更多的指令可以閱讀http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/directives.html#A
<VirtualHost 192.168.3.5:808>
ServerAdmin admin@labtest.com
#網站管理員的EMAIL郵件地址
DocumentRoot /var/www/labtest1
#網站的根目錄,一般要設置為絕對的路徑,否則將認為它的父目錄為在/etc/apache2/apache2.conf里ServerRoot指定的路徑
# ServerName www.labtest1.net
#在設置基於域名虛擬主機時,指定虛擬主機的域名
<Directory />
Options FollowSymLinks
#FollowSymLinks,允許在些目錄中使用符號連結
AllowOverride None
#AllowOverride ,是針對.htaccess文件的。其值有all,none,AuthConfig,FileInfo,Indexes,Limit
</Directory>
<Directory /var/www/labtest1>
Options Indexes FollowSymLinks MultiViews
#MultiViews,允許內容協商的多重視圖。內容協商由mod_negotiation模塊生成。
AllowOverride None
Order allow,deny
#Order:指定對目錄的訪問控制及allow,deny的生效順序。如果是allow,deny則是allow先於deny生效,默認拒絕所有 訪問,任何不匹配allow或是匹配deny的訪問都被拒絕;如果是deny,allow則是deny先於allow生效,默認是允許所有訪問,任何不匹 配deny或是匹配allow的訪問都被允許訪問。
allow from all
#allow:控制哪些主機可以訪問,from是固有的,後面可以是主機名,IP位址,IP範圍,域名等。例:
#allow from labtest.com
#allow from .labtest.com
#allow from 192.168.3.5/255.255.255.0
#allow from 192.168.3.5/24
#allow from 192.168.3.100 192.168.3.101
#
</Directory>
ScriptAlias /cgi-bin/ /var/www/labtest1/cgi-bin/
# ScriptAlias:它標明/var/www/labtest1/cgi-bin目錄下只有CGI腳本,同時與Alias一樣用於在URL和文件系統路徑之間實現映射,使不在DocumentRoot目錄下的內容也能成為文檔樹的一部分
<Directory "/var/www/labtest1/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
#ExecCGI:允許該目錄下通過mod_cgi執行CGI腳本
#SymLinksIfOwnerMatch:只允許使用與目標目錄或文件的擁有者具有相同的USERID的符號連結
#+與-:一般來說,在一個目錄上設置了多次的Options,則最特殊的一個會被完全接受,而其他的則會被忽略;然而,加上+或-時,所有帶+的選項將強制覆蓋當前的設置,所有帶-的選項將強制從當前設置中去除。
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/labtest1/error.log
#定義錯誤的日誌:在/var/log/apache2下一定要事先建好labtest1的目錄,否則會出錯。
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
#LogLevel:定義日誌的級別
#emerg 緊急
#alert 必須立即採取措施
#crit 致命的情況
#error 錯誤
#warn 警告
#notice 重要
#info 普通
#debug 調試
CustomLog /var/log/apache2/labtest1/access.log combined
#CustomLog:指令用來對伺服器的請求進行日誌記錄。combined第二個參數指定了寫入日誌文件的內容
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog log/acces_log combined
可參考http://httpd.apache.org/docs/1.3/logs.html
ServerSignature On
#ServerSignature:指令允許您配置伺服器端生成文檔的頁腳(錯誤信息、 mod_proxy的ftp目錄列表、
mod_info的輸出)。有三個值:On,Off,Email;on會簡單的增加一行關於伺服器版本和正在伺服的虛擬主機的ServerName;Off 設置沒有錯誤行(這樣便與Apache1.2及更舊版本兼容;EMail 設置會如文檔中說明的那樣額外創建一個指向ServerAdmin的"mailto:"部分。對於2.0.44以後的版本,顯示的詳細伺服器版本號將由ServerTokens指令控制。
Alias /files/ "/var/www/labtest1/files/"
#Alias:使不在DocumentRoot目錄下的內容也能成為文檔樹的一部分,也叫虛擬目錄。值得注意的是/files/與/files是有 區別的,在此你有/,那麼在訪問時也一定要有/。訪問都必須要知道有這個別名,才能訪問。例:http://192.168.3.5:808/files /,如果沒有寫/files/是不能訪問的。
<Directory "/var/www/labtest1/files/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
# Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
結束語:
三種實現虛擬主機的方法中涉及到/etc/apache2目錄下三個文件ports.conf httpd服務的端口號,sites-available 可用的虛擬主機,sites-enabled 啟用的虛擬主機;ports.conf在三種方式下要做相應的修改,NameVirtualHost只在基於域名虛擬主機用到。做web伺服器必然涉及到 DNS服務相關配置,在這裏我只是學習了虛擬主機的實現,還有很多其它的配置及優化沒涉及。
本文出自 「匠人」 博客,請務必保留此出處http://xuchengji.blog.51cto.com/160472/387247