Apache网络配置与虚拟主机搭建全解析
1. HTTP/1.1基础特性
1.1 Host Header Request
与HTTP/1.0不同,HTTP/1.1要求客户端请求中包含主机头,即使它为空。以下是一个包含主机头的HTTP/1.1请求示例:
GET /~e8926506/siberia.htm HTTP/1.1
Host: stud1.tuwien.ac.at
1.2 Chunking
HTTP/1.1在将数据发送回请求的客户端时会对数据进行分块处理。根据HTTP/1.1的RFC,分块意味着将消息体修改为一系列块进行传输,每个块都有自己的大小指示符,后面可跟一个包含实体头字段的可选尾部。
分块技术的出现是为了解决服务器在发送响应时不需要提前知道响应大小的问题。由于CGI等动态内容的存在,页面的
Content-Length
变得可变且无法提前确定。分块的工作方式是服务器抓取一小部分动态输出,确定其长度,然后发送给客户端,接着再获取更多内容。
此外,一旦服务器发送完所有分块编码的文档,它还可以选择发送额外的响应头。因为服务器无论如何都在对数据进行分块处理,所以这些头信息可以像内容一样是动态的。
2. 多主机托管方式
Apache提供了三种在单台机器上托管多个网站的方式:
- 运行多个
httpd
守护进程实例。
- 使用Apache的基于IP的虚拟主机。
- 使用Apache的基于名称的虚拟主机。
这三种方法可以任意组合使用,但会受到操作系统的限制。以下是对这三种方法的详细介绍:
2.1 运行多个
httpd
守护进程实例
这种方法为每个托管的网站运行一个单独的守护进程。每个守护进程会占用一定的系统资源,但维护起来相对容易。将其中一个守护进程迁移到不同的机器上,只需要复制它,在原机器上关闭,然后在新机器上启动新副本。
运行多个守护进程还允许每个进程在单独的(受限)用户ID下运行,简化了安全管理,避免了对
suExec
的需求,并确保了无法使用
suExec
的脚本(如在
mod_perl
和
mod_php
下运行的脚本)的安全性。
不过,在一台机器上运行多个守护进程需要额外的资源,如更多的内存、CPU时间和每个守护进程的额外IP地址。如果机器没有足够的资源来支持这些需求,建议考虑其他虚拟主机选项。
2.2 基于IP的虚拟主机
如果有多个可用的IP地址,基于IP的虚拟主机是托管多个网站的一种选择。每个主机都有一个唯一的网络地址,可在网络上被找到。这种方式依赖于操作系统,需要使用IP别名,即将多个IP地址分配给同一个接口。
配置步骤如下:
1.
启用内核中的IP别名功能
:大多数发行版默认启用IP别名。如果未启用,则需要重新编译内核以支持此功能,可在内核配置菜单的“Network Options”中找到IP别名选项。
2.
使用
ifconfig
命令控制IP地址
:
- 不带参数运行
ifconfig
命令可显示系统中所有接口的当前状态:
# ifconfig
eth0 Link encap:Ethernet HWaddr 00:80:C8:14:73:77
inet addr:192.168.1.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1849 errors:0 dropped:0 overruns:0 frame:0
TX packets:1359 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:5 Base address:0x340
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:3924 Metric:1
RX packets:1984 errors:0 dropped:0 overruns:0 frame:0
TX packets:1984 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
- 创建别名的命令格式为:`ifconfig device:aliasnumber address`,例如:
# ifconfig eth0:0 192.168.1.3
每个IP地址可以属于不同的Web服务器守护进程实例,或者Web服务器可以根据IP地址将请求发送到不同的虚拟主机。基于IP的主机不需要为每个主机创建完整的目录树,但建议创建包含内容、日志和其他特定于每个主机信息的目录。
在
httpd.conf
文件中添加以下配置来定义基于IP的主机:
<VirtualHost 192.168.0.3 >
DocumentRoot /www/hosts/ipbased1/htdocs
ServerName www.iptest1.com
</VirtualHost>
<VirtualHost 192.168.0.4 >
DocumentRoot /www/hosts/ipbased2/htdocs
ServerName www.iptest2.com
</VirtualHost>
2.3 基于名称的虚拟主机
基于名称的虚拟主机不需要多个IP地址,而是使用
NameVirtualHost
指令。Apache监听一个IP地址,并根据浏览器发送的主机头来提供网站服务。
这种方法需要Web浏览器在HTTP请求头中发送
Host
字段(这是HTTP/1.1的一部分,2.0及更高版本的浏览器支持)。由于IP地址是稀缺资源,使用基于名称的方法允许多个网站共享一个IP地址分配。
以下是一个使用基于名称的虚拟主机的
httpd.conf
文件示例:
User webuser
Group webgroup
NameVirtualHost 12.34.56.7
Include /etc/httpd/conf/firstwebsite.comf
#firstwebsite.conf file in /etc/httpd/conf
<VirtualHost 12.34.56.7>
ServerName www.firstwebsite.com
ServerAdmin webmaster@firstwebsite.com
DocumentRoot /home/httpd/firstwebsite/
ErrorLog /var/log/httpd/firstwebsite-error_log
CustomLog /var/log/httpd/firstwebsite-access_log common
</VirtualHost>
#secondwebsite.conf file in /etc/httpd/conf
<VirtualHost 12.34.56.7>
ServerName www.secondwebsite.com
ServerAdmin webmaster@secondwebsite.com
DocumentRoot /home/httpd/secondwebsite/
ErrorLog /var/log/httpd/secondwebsite-error_log
CustomLog /var/log/httpd/secondwebsite-access_log common
</VirtualHost>
需要注意的是,
VirtualHost
的IP地址需要与
NameVirtualHost
指令中的地址匹配。
3. 虚拟主机配置决策
在选择虚拟主机配置方法时,需要考虑以下因素:
| 配置方法 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| 运行多个
httpd
守护进程实例 | 维护方便,安全管理简单 | 占用更多系统资源 | 对安全性要求较高,且机器资源充足的情况 |
| 基于IP的虚拟主机 | 配置相对简单,兼容性好 | 需要多个IP地址 | 有足够可用IP地址的情况 |
| 基于名称的虚拟主机 | 节省IP地址 | 依赖浏览器支持
Host
头 | IP地址资源有限的情况 |
以下是一个简单的决策流程图:
graph TD;
A[选择虚拟主机配置方法] --> B{是否有足够IP地址?};
B -- 是 --> C{对安全性要求高吗?};
C -- 是 --> D[运行多个httpd守护进程实例];
C -- 否 --> E[基于IP的虚拟主机];
B -- 否 --> F[基于名称的虚拟主机];
通过以上介绍,你可以根据自己的需求和资源情况选择合适的虚拟主机配置方法,实现Apache服务器的高效多主机托管。
4. 不同虚拟主机配置的操作细节
4.1 配置单独的守护进程
要在同一服务器上运行Apache的单独实例,每个服务器需要一个不同的IP地址。然后使用
Listen
指令告诉Apache监听哪些IP地址和端口。
Listen
指令的语法如下:
Listen <IP Address>:<port>
例如:
# Listen 123.456.789.10:11
如果服务器配置未指定要监听的IP地址,Apache将监听所有有效地址。因此,在同一台机器上运行多个守护进程时,必须指定每个守护进程应监听的地址。
4.2 引导请求到虚拟主机
在多网站共享一台机器时,第一步是找到一种将Web服务器与唯一地址关联的方法,使Web浏览器和Web服务器能够相互找到对方。在使用以太网的系统中,这涉及将另一个以太网卡插入扩展槽,并为这个新接口分配一个唯一的IP地址。然后启动另一个Web服务器守护进程,并将其配置为响应这个新的IP地址。
这种设置效果良好且限制较少,但为每个网站添加网卡的成本可能不合理。单个网卡的带宽通常远远超过大多数网站的需求,如果有一种方法可以在它们之间共享,第一个网卡就可以处理多个网站。随着用户向系统中添加更多网站,在机器运行额外Web服务器守护进程的能力耗尽之前,扩展槽的数量可能会先耗尽。
有两种方法可以区分请求:基于IP的虚拟主机和基于名称的虚拟主机。
4.3 单守护进程/虚拟主机
这种方法使用
httpd
守护进程的单个实例结合基于IP或基于名称的托管来管理事务。其基本特点和优缺点如下:
-
优点
:
- 消耗更少的系统资源,因为只有一个
httpd
守护进程在运行,在繁忙的网站上,这可以减轻系统负载。
- 设置可能更容易维护,因为一些配置是共享的,例如在更改守护进程的行为时,只需编辑一个
httpd.conf
文件。用户可以通过在
httpd.conf
中添加一个包含特定主机信息的小部分来快速添加新主机,其他主要设置将从
VirtualHost
部分之外的指令继承。使用
Include
指令可以为每个虚拟主机创建单独的配置文件。
-
缺点
:存在潜在的安全/隐私问题。
httpd
守护进程以分配给它的用户权限运行,如果网站管理员要访问某些内容或根据自己的需要定制服务器的行为,他们必须拥有实现这些操作的权限,而这些权限也可能使他们能够查看甚至更改控制其他主机的参数。
5. 虚拟主机配置的注意事项
5.1 基于IP的虚拟主机注意事项
-
目录结构
:虽然基于IP的主机不需要为每个主机创建完整的目录树,但建议创建包含内容、日志和其他特定于每个主机信息的目录。例如,在主Apache树中创建一个
hosts/目录,并从那里分支。至少要为DocumentRoot创建一个目录,还可以创建包含错误日志和用户访问日志的额外目录。 -
配置指令
:在
httpd.conf文件中为每个主机添加一个VirtualHost部分,其中包含控制该主机行为的所有设置。除了影响底层服务器操作的指令外,大多数适用于独立服务器的指令都可以在VirtualHost部分使用。例如,以下指令在VirtualHost部分是禁止的:-
ServerType -
User -
Group -
StartServers -
MaxSpareServers -
MinSpareServers -
MaxRequestsPerChild -
BindAddress -
PidFile -
TypesConfig -
ServerRoot
-
此外,
VirtualHost
部分还有两个特殊指令:
ServerAlias
和
ServerPath
。同时,要确保为每个虚拟服务器配置单独的日志文件。
5.2 基于名称的虚拟主机注意事项
-
浏览器支持
:基于名称的虚拟主机要求Web浏览器在HTTP请求头中发送
Host字段(这是HTTP/1.1的一部分,2.0及更高版本的浏览器支持)。对于早于2.0版本的浏览器,应尽量避免使用。 -
IP地址匹配
:
VirtualHost的IP地址需要与NameVirtualHost指令中的地址匹配。
6. 混合方法的虚拟主机示例
可以在同一服务器上混合使用不同的虚拟主机方法,还可以使用基于端口的虚拟主机。以下是一个使用混合方法的示例:
httpd.conf
文件中的IP地址和注释如下:
User nobody
Group nobody
Listen 80
Listen 8080
NameVirtualHost 12.34.56.7
Include /etc/httpd/conf/firstwebsite.conf
Include /etc/httpd/conf/secondwebsite.conf
Include /etc/httpd/conf/thirdwebsite.conf
Include /etc/httpd/conf/fourthwebsite.conf
#firstwebsite.conf file in /etc/httpd/conf
#Since the IP matches that in the NameVirtualHost, this
# will use the name-based method
<VirtualHost 12.34.56.7>
ServerName www.firstwebsite.com
ServerAdmin webmaster@firstwebsite.com
DocumentRoot /home/httpd/firstwebsite/
ErrorLog /var/log/httpd/firstwebsite-error_log
CustomLog /var/log/httpd/firstwebsite-access_log common
</VirtualHost>
# secondwebsite.conf file in /etc/httpd/conf
# Since the IP matches that in the NameVirtualHost, this
# will use the name-based method
<VirtualHost 12.34.56.7>
ServerName www.secondwebsite.com
ServerAdmin webmaster@secondwebsite.com
DocumentRoot /home/httpd/secondwebsite/
ErrorLog /var/log/httpd/secondwebsite-error_log
CustomLog /var/log/httpd/secondwebsite-access_log common
</VirtualHost>
6.1 混合方法的选择流程
以下是一个选择混合方法时的决策流程图:
graph TD;
A[选择虚拟主机混合配置方法] --> B{是否有多个可用端口?};
B -- 是 --> C{是否有多个可用IP地址?};
C -- 是 --> D{对安全性要求高吗?};
D -- 是 --> E[运行多个httpd守护进程实例 + 基于IP和端口];
D -- 否 --> F[基于IP和端口的混合配置];
C -- 否 --> G[基于名称和端口的混合配置];
B -- 否 --> H{是否有多个可用IP地址?};
H -- 是 --> I[基于IP的虚拟主机];
H -- 否 --> J[基于名称的虚拟主机];
通过综合考虑各种因素和使用合适的配置方法,可以灵活地实现Apache服务器的多主机托管,满足不同场景下的需求。
564



被折叠的 条评论
为什么被折叠?



