前言:php
在上一篇學習了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_1html
引用百度百科:虛擬主機的關鍵技術在於,即便在同一臺硬件、同一個操做系統上,運行着爲多個用戶打開的不一樣的服務器程式,互不干擾。而各個用戶擁有本身的一部分系統資源(IP地址、文檔存儲空間、內存、CPU時間等)。虛擬主機之間徹底獨立,在外界看來,每一臺虛擬主機和一臺單獨的主機的表現徹底相同。因此這種被虛擬化的邏輯主機被形象的稱爲「虛擬主機」。linux
虛擬主機還有一兄弟叫「虛擬機」,它的產品有:全球首款中國人本身設計的高速虛擬機VMLite(創始人駱輝紅博士);VMware的相關產品VMware Workstation,VMware Server等;微軟的Virtual pc ,Hyper-V;開源的VirtualBox,OpenVZ;紅帽企業級虛擬化RHEV;KVM等。感興趣的能夠去http://www.xuniji.com/forum/看看。web
可是,虛擬主機與虛擬機是不一樣的東西,不要混淆了。apache
操做:ubuntu
1,Apache的配置文件vim
(1)apache的相關信息,經過apache2 命令,能夠了解一些apache的信息windows
學習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:808或http://www.labtest1.com:808
作實驗時發如今port.conf不可寫成
前者從新載入apache2時不會出現錯誤信息,可是訪問是不成功的,後者會出現以下錯誤信息
告訴你語法錯誤。
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服務相關配置,在這裏我只是學習了虛擬主機的實現,還有不少其它的配置及優化沒涉及。