文章目录
1. 基于名称和基于IP的虚拟主机的区别
基于IP的虚拟主机使用连接的IP地址来确定要服务的虚拟主机。因此,每个主机都需要有一个单独的IP地址。使用基于名称的虚拟主机时,服务器依靠客户端将主机名报告为HTTP标头的一部分。使用此技术,许多不同的主机可以共享相同的IP地址。
基于名称的虚拟主机通常更简单,因为只需要配置DNS服务器以将主机名映射到正确的IP地址,然后配置Apache HTTP Server即可识别不同的主机名。基于名称的虚拟主机还可以缓解对稀缺IP地址的需求。
2. 使用基于名称的虚拟主机
通过官方实验进行理解。
环境:
CentOS release 6.8
Apache/2.2.15 (CentOS)
2.1 准备
新建/www/domain和/www/otherdomain文件夹,文件夹下分别新建一个index.html文件,用于测试。
# cat /www/domain/index.html
This is www.domain.tld
# cat /www/otherdomain/index.html
This is www.otherdomain.tld
2.2 配置文件
确保/etc/httpd/conf/httpd.conf文件中有如下配置:
NameVirtualHost *:80
在/etc/httpd/conf.d文件夹下新建virtualhost.conf,将两个虚拟主机的内容粘贴上。
<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>
<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>
配置完,reload一下httpd服务就可以了。
2.3 配置文件解析
- 在该实验中,确保httpd.conf中配置了Listen 80。Listen 指令告诉服务器仅在指定的端口或地址和端口组合上接受传入的请求。如果在Listen 指令中仅指定了端口号,则服务器将在所有接口上侦听给定的端口。如果提供了IP地址和端口,则服务器将侦听给定的端口和接口。Listen可以使用多个指令来指定要侦听的地址和端口的数量,服务器将响应来自任何列出的地址和端口的请求。如果Listen指令没有配置相应端口,则虚拟主机无法访问。
例如,要使服务器在所有接口上都接受端口80和8000上的连接,请使用:
Listen 80
Listen 8000
要使服务器在一个接口上接受端口80上的连接,而在另一个接口上接受端口8000上的连接,请使用:
Listen 192.0.2.1:80
Listen 192.0.2.5:8000
- “NameVirtualHost *:80” 配置是必须的,如果没有该配置,无法根据名称访问相同端口的不同主机,httpd会根据端口把所有请求发往第一台匹配的主机,不区分主机名。类似:
NameVirtualHost指令表示在服务器相应地址(一般配置为IP+端口,也可以配置为主机名或仅IP)上接收基于名称的虚拟主机请求。请注意,<VirtualHost>指令的参数必须与NameVirtualHost指令的参数完全匹配。
NameVirtualHost 1.2.3.4:80
<VirtualHost 1.2.3.4:80>
# ...
</VirtualHost>
- ServerAlias指令提供了访问该虚拟主机的别名。需要配置好域名解析才能生效。
2.4 注意事项
- 如果虚拟主机放在局域网,使用客户端验证结果之前需要配置客户端的hosts文件;如果使用公网,记得配置域名解析。
- httpd.conf中有 “Include conf.d/*.conf” 的配置,所以尽量把虚拟主机的配置文件放到/etc/httpd/conf.d下,保持httpd.conf的整洁。
3. 日志文件过多的问题
3.1 文件描述符限制
当使用大量虚拟主机时,如果每个虚拟主机指定不同的日志文件,Apache可能会用完可用的文件描述符(有时称为文件句柄)。每个不同的错误日志文件(error_log)或者访问日志(access_log)都会占用一个文件描述符。Unix操作系统限制了进程可以使用的文件描述符的数量。该限制通常为64,通常可以增加到较大的硬限制。
3.2 虚拟主机日志合一
为了减少对文件描述符的占用,需要减少日志文件的数量。不要在各<VirtualHost> 节中指定日志文件,而只记录到主日志文件。在httpd.conf中添加虚拟主机的通用日志格式:
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost
CustomLog logs/multiple_vhost_log vhost
默认的日志格式如下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
...
CustomLog logs/access_log combined
可以看到虚拟主机的格式多了%v,代表规范的虚拟主机名。重新加载httpd服务之后,查询multiple_vhost_log文件内容如下:
www.domain.tld 192.168.149.1 - - [18/Dec/2019:22:43:50 -0800] "GET / HTTP/1.1" 304 -
www.otherdomain.tld 192.168.149.1 - - [18/Dec/2019:22:44:11 -0800] "GET / HTTP/1.1" 304 -
这样,所有虚拟主机的日志,无论访问日志还是错误日志,都记录在这一个文件了。这就引出了另一个问题,日志达到一定程度,需要拆分。
3.3 按虚拟主机拆分日志文件
接上文,当希望将日志文件拆分为各个组成部分(每个虚拟主机一个文件)时,可以使用split-logfile程序来完成此操作。可以在Apache发行版的support目录中找到该程序。最新的2.4.41版本没有该程序,试了试以前的2.2.16版本是有的。
使用以下命令运行该程序:
# ./split-logfile < multiple_vhost_log //生成各个虚拟主机日志
# cat www.domain.tld.log
192.168.149.1 - - [18/Dec/2019:22:43:50 -0800] "GET / HTTP/1.1" 304 -
192.168.149.1 - - [18/Dec/2019:23:07:05 -0800] "GET /1.html HTTP/1.1" 404 284
# cat www.otherdomain.tld.log
192.168.149.1 - - [18/Dec/2019:22:44:11 -0800] "GET / HTTP/1.1" 304 -
4. 日志轮转
在繁忙的服务器上,日志文件中存储的信息量很大。访问日志文件通常每10,000个请求增长1 MB或更多。因此,有必要通过移动或删除现有日志来定期轮换日志文件。服务器运行时无法完成此操作,因为只要Apache保持打开状态,它将继续写入旧日志文件。因此,在移动或删除日志文件后必须重新启动服务器,以便它将打开新的日志文件。
通过使用优雅重启(graceful restart),可以指示服务器打开新的日志文件,而不会丢失来自客户端的任何现有连接和挂起连接。但是,为了完成此操作,服务器必须在服务旧请求的同时继续写入旧日志文件。因此,必须在重新启动后等待一段时间,然后再对日志文件进行任何处理。简单地轮转日志并压缩旧日志以节省空间的典型方案是:
mv access_log access_log.old
mv error_log error_log.old
apachectl graceful
sleep 600
gzip access_log.old error_log.old
关于日志轮转,可以使用logrotate。后面有机会再写。
欢迎了解下一篇文章 Apache HTTP配置虚拟主机(二)
参考文档
https://httpd.apache.org/docs/2.2/vhosts/