最近,我有一臺debian服務器,雙網卡,一個用於提供外網服務,一個用於管理,上面部署有apache,部署了四個基於域名的虛擬主機,如今想把其中兩個改爲讓外網能夠訪問,兩個讓內網訪問,按照通常的操做完成後,發現第二個設置外網訪問的虛擬主機訪問不了,訪問時內容老是跳轉到第一個外網虛擬主機上面,當時知道apache若是找不到相應的虛擬主機會以第一個虛擬主機爲默認的,可是看配置是沒有問題的(表面而已)。 web
下來說一下debian安裝apache的目錄結構,在centos下安裝httpd時只要yum -y install httpd.x86_64便可,centos的默認配置都在一個文件中,全部的加載的模塊配置和虛擬主機配置都在一個httpd.conf文件中,而debian倒是以加載模塊和配置文件的形式在,debian的apache安裝按成後在/etc/apache2目錄下有如下文件: shell
debian的主配置文件是apache2.conf,httpd.conf是空文件,envvars用來給apache2ctl設置環境變量,ports.conf用來定義主配置文件的監聽IP, NameVirtualHost等,mods-available和mods-enabled是兩個重要的目錄,裏面包含了一些apache的擴展模塊,mods-available裏面是默認的一些apache模塊,但並非全部的都已經加入主配置中,好比要加入rewrite模塊,執行a2enmod rewrite便可,這樣在mods-enabled目錄中就有開啓的rewrite模塊了(軟鏈接形式),a2dismod能夠取消相關模塊,sites-available和sites-enabled是配置虛擬主機的,全部的虛擬主機都在sites-available目錄下,當須要開啓某個虛擬主機時,執行a2ensite filename便可,在sites-enabled目錄下就會有相應的文件(軟鏈接)。a2dissite 取消相關虛擬主機。在apache2.conf中會以Include的形式把相關文件夾包含進去。 apache
個人apache都是以域名的虛擬主機,在sites-enabled目錄下,每一個項目的虛擬主機分別分配一個文件,以下: centos
格式以下: 服務器
<VirtualHost 192.168.2.1:80> ServerAdmin webmaster@localhost ServerName test.wai2.com DocumentRoot /var/www/test.wai2.com <Directory /var/www/test.wai2.com> Options -Indexes FollowSymLinks +Execcgi Order allow,deny allow from all ErrorLog /var/log/apache2/test.wai2.com_error.log LogLevel warn CustomLog /var/log/apache2/test.wai2.com_access.log combined </Directory> </VirtualHost>
在四個基於域名的虛擬主機都綁定內網IP時,這種配置訪問都很正常,每一個虛擬主機一個配置文件也沒問題,可是當其中兩個綁定內網IP,兩個綁定外網IP時就出現了開頭說的那種狀況,最後把綁定內網IP的虛擬主機的配置文件(test.nei1.com,test.nei3.com)合併到一個文件中,把綁定外網IP的虛擬主機配置文件(test.wai2.com,test.wai4.com)合併到一個文件中,在ports.conf中取消 NameVirtualHost的定義配置,在合併後的每一個配置文件的開頭插入一行NameVirtualHost IP:80,綁定內網的就寫內網IP,綁定外網的就寫外網IP,作好DNS後,而後重啓apache便可。 測試
測試: spa
這樣就能夠即有綁定內網的虛擬主機,也有綁定外網的虛擬主機,且互不影響,在centos下應該不會出如今debian下的這種狀況,由於全部的配置都在一個文件中,可是習慣了debian的配置文件格式,且這樣每一個虛擬主機分開寫管理起來方便,因此還不死心,又改爲了四個配置文件的格式,而且在每一個配置文件的第一行插入NameVirtualHost IP:80的配置,而後啓動的時候會有警告NameVirtualHost 外網IP:80 has no VirtualHosts,很奇怪定義了,怎麼會沒有呢,這樣等於就有兩個NameVirtualHost 內網IP:80和兩個NameVirtualHost 外網IP:80的配置了,可是實驗結果倒是能夠正常訪問互不影響的,而後看了一下文檔有以下描述: code
The namevirtualhost command tells Apache that you will use VirtualHost boxes on a specific IP address. This command is needed only once for each IP address. It is not necessary to repeat the namevirtualhost directive for every VirtualHost box you use as in your example. The directive doesn't define a VirtualHost, it only tells Apache that on that IP address one or more virtual hosts will be present. ci
恍然大悟啊,同一個IP的NameVirtualHost的只能定義一次,可是若是各取消一個NameVirtualHost的話就又會出現開頭的問題,因此爲了每次啓動時美觀一些(沒有warn),只好改爲兩個配置文件,一個綁定內網的,一個綁定外網的。 文檔
各位看官有什麼好的建議能夠提一下,謝謝了。