最近几年 Docker 火热,在此之前,有 VMVare、VBox之类的可以安装虚拟镜像的软件,「虚拟机」的概念并不陌生。
比如 Docker 等容器管理,能将一台物理机的资源虚拟化,使用起来和多台机器也没太大差别。
VMVare、VBox 这种,可以在电脑上安装另一个「镜像」,仿佛多了操作系统。
其实,在 Web Server的设计上,也有类似的概念。 Apache、Nginx 等,都可以配置多虚拟主机。对于 Web Container,也有对应的 Server的能力,所以容器设计中,也是存在多虚拟主机的。像在 Tomcat 中, 虚拟主机的组件是 Host,是很重要的一个组件。
通过 Host,我们可以配置区别与其他主机的 AccessLog,设置不同的DefaultContext,甚至可以绑定不同的 Connector。 而且每个 Host 可以设置不同的 name, 通过这个 name, 就能将咱们的域名绑定上去了。
如果是本地测试,设置一个随意写的域名,只需要在操作系统的 hosts 文件中进行指定即可。
不同的虚拟主机之间,彼此互不影响。自己搭过网站的朋友可能了解。在这几年云服务器流行之前,几年前,我们可以通过「买空间」的方式,来搭网站。比如要建个 wordpress 的博客站点,那一般会有几百兆内存、配个MySQL,硬盘允许多大空间,再给个FTP做为网站根目录。这个所谓的PHP空间,其实也就是个「虚拟主机」,把一台物理电脑上的资源,划分给多个人用。所以当年如果你的网站想要接广告联盟,如果这个空间所属物理机IP被处罚过,那基本就没戏了。
回到 Tomcat 的虚拟主机。我们之前的文章写过在 Tomcat 里,多个应用一般的部署方式建议(Tomcat应用部署,是否要一个萝卜一个坑?),以及应用之间的类隔离与共享(Tomcat类加载器以及应用间class隔离与共享)既然应该已经可以分开部署了,为什么要设计虚拟主机呢?这里除了像上面「PHP空间」那样,资源共用外,还可以进行不同的 Connector 绑定。 我们知道, Connector 是 Tomcat 连接物理世界的桥梁,那如果我们的虚拟主机上部署的是「管理应用」,即对于 Tomcat 服务器进行应用的启、停,进行监控等,类似于 Manager 应用,我们想要做端口的隔离,或者想要对不同的应用设置不同的安全级别,比如对于管理应用,我们要进行HTTPS 访问,对于普通应用,只要HTTP就可以,那两种不同的 Connector 就可以绑定到不同的主机上。
另外,如果我们的管理应用和普通应用部署在一起,共用同一个Connector,那管理应用在修改 Connector 的属性时,比如我们把端口号从8000 改成了 9000 的时候, Connector 组件需要重启才能生效,这个时候,我们的管理应用会不可用。隔离的好处,是管理应用对于其他容器组件的变更,应用自己使用不受影响。
不少朋友应该都看过电影「骇客帝国」,一定还记得影片中的 Matrix 。感觉上,这些不同的虚拟主机,和 Matrix 类似,在每个 Host 中, AccessLog, Valve , Listener 这些组件都是相互隔离,彼此之间老死不相往来。
通过这种不同的「Matrix」,我们就能进行不同的定制化配置了。
相关阅读:
阀门(Valve)常打开,快发请求过来 | Tomcat的AccessLogValve介绍
如果你喜欢本文
请长按二维码关注
转发朋友圈,是对我最大的支持。
更多精彩内容:
一台机器上安装多个Tomcat 的原理(回复001)
监控Tomcat中的各种数据 (回复002)
启动Tomcat的安全机制(回复003)
乱码问题的原理及解决方式(回复007)
Tomcat 日志工作原理及配置(回复011)
web.xml 解析实现(回复 012)
线程池的原理( 回复 014)
Tomcat 的集群搭建原理与实现 (回复 015)
类加载器的原理 (回复 016)
类找不到等问题 (回复 017)
代码的热替换实现(回复 018)
Tomcat 进程自动退出问题 (回复 019)
为什么总是返回404? (回复 020)
...
PS: 对于一些 Tomcat常见问题,在公众号的【常见问题】菜单中,有需要的朋友欢迎关注查看
如有帮助请点好看☟