Apache2.4虛擬主機和多站點配置
部落格中提到的各個檔案路徑說明:(我的apache安裝在”D:\webtools\Apache2.4”).我的apache版本為Apache/2.4.17 (Win64),最新版下載地址:http://httpd.apache.org/
檔案 | 路徑 |
---|---|
httpd.exe | D:\webtools\Apache2.4\bin |
httpd.conf | D:\webtools\Apache2.4\conf |
httpd-vhosts.conf | D:\webtools\Apache2.4\conf |
hosts | C:\Windows\System32\drivers\etc\hosts |
如果配置後重啟apache失敗可以通過在命令列執行:httpd -t來檢查語法錯誤
1. 埠監聽
apache的埠監聽設定,是指設定apache這個軟體針對當前伺服器的哪些埠提供服務。通常瀏覽器提供的都是web請求,但有些請求不在apache的服務範圍之內(埠不符)
1.1 設定監聽多埠
直接在httpd.conf中新增監聽的埠即可。
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
#新增要監聽的埠
Listen 8080
2. 主機配置
一個主機,最核心的就是兩件事:
- 主機(站點)的名字:ServerName “主機名”
- 主機(站點)的實際資料夾位置:DocumentRoot “站點的實際完整路徑”
apache的作用其實就是一個”轉換”的角色:將當前電腦中的某個資料夾,對外以某個域名(站點)的方式展現出來。換句話說:站點的本質就是一個資料夾。
#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName localhost:8080
ServerName localhost
#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
#
<Directory />
AllowOverride none
Require all denied
</Directory>
#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#修改預設的配置,設定為E:/www為站點根目錄
DocumentRoot "E:/www"
<Directory "E:/www">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#用於顯示設定“可顯示檔案列表”(當無可顯示網頁的時候)
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
# 允許.htaccess檔案覆蓋設定
AllowOverride All
#
# Controls who can get stuff from this server.
# 控制誰能訪問這臺伺服器,這是apache2.4中的用法
# 原來版本為
# Order deny,allow
# Allow from all
Require all granted
</Directory>
當一個請求通過域名解析進入到當前apache並埠配置成功後,apache就會開始”提供服務”。
- 在站點設定中找到ServerName項,看是否匹配請求中的主機名
- 如果找到,則在對應的目錄(DocumentRoot配置項)中找相應的檔案
- 如果找到,則返回該檔案(或呼叫php語言模組執行後返回)
- 如果第2步沒有找到對應請求中的主機名,那麼將第一個主機當作準備提供服務的主機
因此:只要ip解析和埠能夠進入當前伺服器並匹配apache埠設定,則apache一定會提供服務,即使主機名不匹配
當修改主機根目錄後訪問可能會造成Forbidden,You don't have permission to access / on this server
.這是由於資料夾的訪問是有許可權的,初始的站點所對應的資料夾,安裝的時候已經設定好許可權了。現在改了,需要進行設定。
3. 配置資料夾訪問許可權
許可權中部分設定見2中的程式碼內容。以下內容apache可以設定“預設網頁”以提供給使用者
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
#這裡是對全域性(所有站點,所有資料夾)都起作用
DirectoryIndex index.html index.php index.htm
</IfModule>
此時,對於沒有指定要訪問明確的網頁請求,會按順序從前往後找這些檔案,找到後就在返回給使用者瀏覽器中顯示出來。但是如果沒有找到,此時,Options中的Indexes發揮作用:顯示該資料夾中所有檔案和資料夾
我們可以將DirectoryIndex設定項單獨放在站點資料夾區域設定中,則只對該單獨的站點或資料夾起作用
<Directory "E:/www">
#用於顯示設定“可顯示檔案列表”(當無可顯示網頁的時候)
Options Indexes FollowSymLinks
# 允許.htaccess檔案覆蓋設定
AllowOverride All
# 控制誰能訪問這臺伺服器,這是apache2.4中的用法
# 原來版本為
# Order deny,allow
# Allow from all
Require all granted
#設定預設顯示頁面,只對該資料夾(及其子資料夾)有效
DirectoryIndex phpinfo.php
</Directory>
4. 主機別名設定
在應用中,通常用一下兩種方式來訪問同一個站點:
http://www.chris.com
http://chris.com
此時,就相當於”2個站點(主機名)”但訪問的是同一個內容
這需要使用主機別名來實現,在多站點設定中會使用到
ServerAlias 別名1 別名2 別名3
當然,如果在本機上訪問,記得配置對應的hosts檔案,否則仍然無效
5. 目錄別名設定
目錄別名也叫虛擬目錄,對於實際存在的目錄,可以直接按正常的資料夾訪問層級關係來訪問,但是對於不存在的目錄,我們可以通過配置項,做到對外看起來存在一樣:
比如:http://www.study.com/soft/ 站點中不存在該目錄,正常訪問會出現NOT FOUND
,但是可以通過設定讓該地址訪問
<IfModule alias_module>
#Alias /soft "真實路徑"
Alias /soft "E:/www/study/study/"
</IfModule>
設定之後會出現Forbidden
,解決方法和2中一樣。
6. 資料夾訪問控制的檔案控制方式
通常,我們在config配置檔案中,使用Directory配置項,目的是用來控制資料夾的訪問許可權。
但我們也可以使用一個獨立的檔案來控制某資料夾的訪問許可權。
該檔名必須是: .htaccess
注意:
- 只有字尾和點號(無檔名部分)
- 該檔案必須放在要被控制訪問許可權的資料夾中(不同的資料夾可以放不同的該檔案)
- 其“上級資料夾”(通常是Directory設定中的資料夾)必須使用如下程式碼允許.htaccess發揮作用:
AllowOverride All
- .htaccess檔案中出現程式碼,幾乎可以跟Directory設定中出現的程式碼一樣。
- 如果.htaccess檔案有效,則其設定會覆蓋其上級設定。
- 此.htaccess檔案修改後可以立即發揮作用,無需重啟apache
7. 多站點設定
7.1 在http.conf中開啟多站點配置模組
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
將其前面的分號去掉改為:
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
7.2 在httpd-vhosts.conf檔案中修改預設站點根目錄
這是對於apache2.4來說,如果你原先httpd.conf中的根目錄修改了,那麼這裡也要改,因為開啟多站點功能後該設定會覆蓋httpd.conf檔案中的部分設定。否則可能會出現Forbidden。
#下一行為預設設定,埠預設為80,必須為httpd.conf中你監聽的埠
<VirtualHost _default_:80>
#下一行為預設設定,由於我的預設站點根目錄修改了,所以在這裡也要將它改掉,否則會出現Forbidden
#DocumentRoot "${SRVROOT}/htdocs"
DocumentRoot "E:/www"
#ServerName www.example.com:80
</VirtualHost>
7.3 配置站點
你可以按照它給的例子
#<VirtualHost *:80>
# ServerAdmin [email protected]
# DocumentRoot "${SRVROOT}/docs/dummy-host.example.com"
# ServerName dummy-host.example.com
# ServerAlias www.dummy-host.example.com
# ErrorLog "logs/dummy-host.example.com-error.log"
# CustomLog "logs/dummy-host.example.com-access.log" common
#</VirtualHost>
以下是我的設定:
#下一行"*:80"在httpd.conf的配置檔案中必須監聽該埠
<VirtualHost *:80>
#設定主機名
ServerName www.study.com
#設定主機別名,即用該別名也可以訪問(前提是域名解析正確)
ServerAlias study.com
#設定該站點根目錄
DocumentRoot "E:/www/study"
#設定資料夾訪問控制,其路徑要和上一行的DocumentRoot一樣,
<Directory "E:/www/study">
#用於顯示設定“可顯示檔案列表”(當無可顯示網頁的時候)
Options Indexes
#啟用資料夾訪問控制的檔案.htaccess設定
AllowOverride All
#請求控制
Require all granted
#預設開啟的頁面設定
DirectoryIndex index.php index.html
</Directory>
</VirtualHost>
#···依照上面的方法,可以設定多個站點
切記:配置好後一定要修改hosts檔案,包括設定的主機名和別名都要新增上。否則缺少這一步還是沒用。