全部博文(2065)
分类: 系统运维
2010-09-18 23:25:41
虚拟主机配置文档
时间:
1. 基本概念
虚拟主机:一台机器上面跑多个网站如(和).有两种情况:如果每个域名解析到了同一个IP的话就属于基于IP的;如果这两个域名是解析到不同的IP就是基于主机名了。但是用户的话只需要知道有这两个域名就行。
心得:IDC域名提供商的话可以绑定好多域名的其实就是一台机器上面绑定了许多域名的这是基于IP的。呆会看下如何实现这种配置。
2. 基于IP的情况详细分析
实现的过程:每个基于IP的虚拟主机必须拥有不同的IP地址。那一台机器要是只有一块网卡的话怎么做到呢?我们可以使用IP别名的方式进行解决这个问题。即一块物理网卡上面配置多个IP别名得到多个IP的情况。现在有了IP地址了就可以配置虚拟主机了。(基于IP的情况就是说每个虚拟主机都必须要有自己的IP地址值。这样才能算是基于IP的情况了)
3. 如何配置apache
解决方案:拥有多个虚拟主机的单一守护进程。这种情况下单一的一个httpd进程能够对付全部的对主服务器和虚拟主机的请求。
而配置文件中的指令将为每个虚拟主机配置不同的, , DocumentRoot, , , CustomLog
疑问:标签里面的这几个参数值是什么含义?分别表示的是什么意思呢?
解释一下这几个参数
3.1
服务器返回给客户端的错误信息中包含的管理员邮件地址。
其语法为:serveradmin email-address|URL
示例:ServerAdmin
心得:一般像服务器错误请联系系统管理员什么的就会出现这个地址值了。
3.2
服务器用于识别自己的主机名和端口号,这个主要是用于创建重定向URL。
语法:servername fully-qualified-domain-name [:port]
为了加强可靠性我们最好是指定这个值
示例:ServerName
3.3 DocumentRoot
其实就是主文档树的根目录地址了。(表示请求的文件上哪去找)
语法:DocumentRoot directory-path
默认值:DocumentRoot /usr/local/apache2/htdocs 即web服务器的默认位置值
这个指令说明了httpd伺服的目录。如果你没有使用alias别名的情况下那会用到它了。
示例:DocumentRoot /usr/web 在访问
的时候其实就是访问
/usr/web/index.html这个文件了。当然比较好的一种方式就是使用别名进行定位。
3.4
存放错误日志的位置。
语法:ErrorLog file-path|syslog[:facility]
作用其实就是当服务器遇到错误的时候记录错误日志的文件。
示例:ErrorLog /var/log/httpd/error_log
3.5
指定日志文件的位置
TransferLog file|pipe
本指令除不允许直接定义日志格式或根据条件进行日志记录外,与CustomLog指令有完全相同的参数和功能。实际应用中,日志的格式是由最近的非别名定义的指令指定。如果没有定义任何日志格式,则使用通用日志格式。
LogFormat
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-agent}i\""
TransferLog logs/access_log
那说明我们的日志就是这样的一种格式了!(即log日志位置访问日志的位置)
3.6 CustomLog
设定日志的文件名和格式
这也是对服务器的请求进行日志记录的,可以指定日志的格式而且还可以使用环境变量根据请求的特征自由地组织日志。第一个参数指定了日志记录的位置。
语法:CustomLog file|pipe format|nickname [env=[!]environment-variable]
第二个参数指定了写入日志文件的内容。这个可以是由logformat指定的名称也可以是日志格式本身的格式字符串的。
示例:
# 使用nickname
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
# 明确使用格式格式字符串
CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b"
第一个参数是位置第二个参数是日志格式参数!
配置示例
ServerAdmin webmaster@mail.smallco.com
DocumentRoot /groups/smallco/www
ServerName
ErrorLog /groups/smallco/logs/error_log
TransferLog /groups/smallco/logs/access_log
ServerAdmin webmaster@mail.baygroup.org
DocumentRoot /groups/baygroup/www
ServerName
ErrorLog /groups/baygroup/logs/error_log
TransferLog /groups/baygroup/logs/access_log
注意:建议您使用IP地址来取代域名
讲一下原因
有一个原则:不要让apache软件在分析它自己的配置文件的时候再做一次DNS解析。如果说你非得用它做DNS解析的话呢就会出现它本身的可靠性问题。即不可靠了。
所以说我们在配置虚拟主机的时候就不要用到域名了就是这个原因。
示例说明一下
DocumentRoot /www/abc
说明:虚拟主机要配置正常的话一定要确保两部分的信息:一个是servername与该服务器绑定的至少一个IP地址。上面这个示例里面没有IP。所以就必须通过apache软件使用DNS进行解析了。解析一下这个域名。如果说它没有正确得到DNS的支持的话那这个虚拟主机就不会被配置了。那就不会对任何请求作出反应。
如果说这个时候我们的 的IP地址是:
10.0.0
.1
>
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
这种配置存在的一个问题:Apache软件需要DNS对虚拟主机进行反向域名解析确定其servername。如果反向解析失败了的话这个功能也将丢失了。
为了能够解决这两个问题。成功的一个方案就是
ServerName
ServerAdmin
webgirl@abc.dom
DocumentRoot
/www/abc
心得:VirtualHost里面填写IP为了不进行DNS解析。然后再配置一下其servername值表示这台虚拟主机解析到的域名。
解决上述问题的一个办法
1、 在virtualhost中使用IP地址(不要使用域名)
2、 在listen中使用IP地址
3、 确保所有的虚拟主机有显式的servername定义
4、 创建一个不包含任何页面的
4. 基于主机名的虚拟主机配置
基于IP的虚拟主机使用连接的IP地址来决定相应的虚拟主机。这样,你就需要为每个虚拟主机分配一个独立的IP地址。(解决方案是使用IP别名,即在一个物理网卡上面做多个IP绑定)。而基于域名的虚拟主机是根据客户提交的HTTP头中的标识主机名的部分决定的(HOST值)。这样的话就能够实现很多虚拟主机共享同一个IP 地址。
(其实这也是现在普遍的一种做法。即同一台主机上面跑了多个域名即多个虚拟主机共享同一个IP地址值)
好处:多个域名都到了一个IP地址了。这样的话IP地址不够的问题就能够解决了
结论:一般的情况下我们是考虑使用基于主机名的方式进行虚拟主机配置的!
5. 如何配置呢?
为了使用基于域名的虚拟主机,你必须指定服务器IP地址(和可能的端口)来使主机接受请求。(即绑定一个主机头。其实IIS也有这个功能就是编辑主机头。其实就是IP:端口号)
这个可以用指令来进行配置。如果服务器上所有的IP地址都会用到(一台服务器可能会有内外网IP的话就考虑使用* 这样的话就能够从内外网同时进行访问到),你可以用"
*
"作为的参数。如果你打算使用多端口(如运行SSL)你必须在参数中指定一个端口号,比如"
*:80
"。请注意,在指令中指定IP地址并不会使服务器自动侦听那个IP地址。请参阅一章获取更多详情。另外,这里设定的IP地址必须对应服务器上的一个网络接口。(设置的IP地址必须是实际存在于物理网络接口的)
下一步就是为每个虚拟主机建立段。的参数与的参数必须是一样的(比如说,一个IP地址或"*"代表的所有地址)。在每个段中,至少要有一个指令来指定伺服哪个主机和一个DocumentRoot指令来说明这个主机的内容位于文件系统的什么地方。
说明:即在一个虚拟主机段里面至少要有一个servername与documentroot内容!
比如说,假设你正在为域名提供服务,而你又想在同一个IP地址上增加一个名叫的虚拟主机,你只需在httpd.conf中加入以下内容:
NameVirtualHost *:80 表示内外网IP均会使用到
ServerName
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
ServerName
DocumentRoot /www/otherdomain
很多服务器希望自己能通过不只一个域名被访问。我们可以把指令放入小节中来解决这个问题。比如说在上面的第一个配置段中指令中列出的名字就是用户可以用来访问同一个web站点的其它名字:
ServerAlias
domain.tld *.domain.tld
这样,所有对域domain.tld的访问请求都将由虚拟主机处理。通配符标记"*"和"?"可以用于域名的匹配。当然你不能仅仅搞个名字然后把它放到或里就算完了。你必须先在你的DNS服务器上进行配置,将这些名字和您服务器上的一个IP地址建立映射关系。(如果在本地测试的话可以考虑使用修改本地host的方式处理)
实战
1. 在本机测试两个域名与
1.1 修改DNS即本机hosts文件如下
127.0.0.1
127.0.0.1
1.2 配置一下apache的虚拟主机
AllowOverride None
Options None
Order allow,deny
Allow from all
AllowOverride None
Options None
Order allow,deny
Allow from all
NameVirtualHost *:80
ServerName 表示当访问这个域名的时候
ServerAlias abc.com *.abc.com
DocumentRoot E:/abc 指向的文档根目录位置
CustomLog
E:/abc/logs/access_log "%h %l %u %t
\"%r\" %>s %b" 自定义日志位置
ServerName
DocumentRoot E:/efg
CustomLog
E:/efg/logs/access_log "%h %l %u %t \"%r\" %>s %b"
这样的话我一台服务器就能够配置多个虚拟主机了。申请域名的时候只需要把这些域名指向这个IP就行了。如果这里面我们不写* 的话而是写127.0.0.1的话那它就会解析不到后面这个域名了。另外我们在配置单个站点的时候一定要记得配置好其日志呢。这样做日志分析有好处的!
第二部分:配置虚拟目录
1. 全局的虚拟目录配置
如httpd.conf中的/icons/
Alias /icons/ "C:/Apache Group/Apache2/icons/"
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
那这样的话我访问的时候就能够直接指定icons就行了!
2. 在虚拟主机里面的虚拟目录配置
在
如:
ServerName
#主机名
ServerAlias test.com *.test.com #别名
DocumentRoot
"d:/test"
#所在目录
Alias /pic
"d:/pic"
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
案例
NameVirtualHost *:80
#LogFormat "%h %l %u %t \"%r\" %>s %b" common
ServerName
ServerAlias abc.com *.abc.com
DocumentRoot E:/abc
CustomLog E:/abc/logs/access_log "%h %l %u %t \"%r\" %>s %b"
Alias /pic "D:/pic"
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
我的理解:
1. 虚拟主机的概念是表示的是URL段里面的HOST部分内容。而虚拟目录的概念其实就是URI段的内容了。
这段配置当我们请求
1.1 其实是去找DocumentRoot E:/abc 下面的文件
1.2 其实是去找Alias /pic "D:/pic" 里面的内容了!
结论:一般我们可以配置一个虚拟主机然后再去定义它的虚拟目录即可!