我们在使用Eclipse开发JavaWeb应用程序时,一点运行就会自动弹出浏览器,显示程序的运行结果。实际上,IDE帮我们省略了很多步骤。这篇笔记主要介绍如何在服务器环境上部署JavaWeb应用程序。
Java Web应用程序有固定的文件目录结构,开发完成后,可以把项目打包为一个.war
文件部署,也可以直接把整个项目文件夹部署(War Exploded方式)。WAR包的优点是只有一个文件,管理起来十分方便;而不打包,优点则是系统管理员可以很方便的对内部的配置文件进行修改。这两种方式的选择,应该视部署环境而定。
无论WAR包还是War Exploded,在Tomcat中最简单的部署方式就是把项目扔到webapps
文件夹下。不需要任何配置,甚至不需要重启Tomcat,项目就已经热部署完成了。
例如将myproject.war
直接放入webapps
,tomcat会自动将其解压到一个同名的文件夹,部署机器的IP是192.168.1.104
,在浏览器中访问http://192.168.1.104:8080/myproject/
就能正常访问到新部署的项目了。
打开CATALINA_BASE/conf/server.xml
,我们可以看到下图的默认配置。这也解释了Tomcat解压缩WAR包和自动热部署的行为。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
上面访问项目时,我们输入的地址是http://IP:端口/myproject/
,其中myproject
和我们放入webapps
的WAR包同名。实际上,对于Tomcat,我们部署进去的一个“项目”被称为“Context”,开发JavaWeb应用程序时,我们称/myproject
为ContextPath。如果Tomcat里部署了多个项目,我们就能使用不同的ContextPath进行访问。
如果我们需要项目在根路径/
访问,那么最简单的方法是将我们的War包命名为ROOT.war
。
现在我们有/home/ubuntu/myproject.war
,并且不打算把它放到webapps
里,我们需要命名这个项目的上下文路径(Context)为abc
,即我们希望使用http://IP:端口/abc/
进行访问。此时就必须手动配置了。
我们在conf/Catalina/[hostname]
目录下,创建一个abc.xml
,并写入以下内容:
<Context docBase="/home/ubuntu/myproject.war">
</Context>
这样配置就能达到我们的要求了。注意文件名abc.xml
的abc
就是Context名字,而配置文件里的docBase
则是WAR包的路径。通过此种方式,我们也可以配置多个在不同位置的项目。
注:网上查到的资料都比较老了,网上大多数的手动配置是在server.xml
的host
里配置context
,这样做的缺点是server.xml
只会在服务器启动时读取一次,而上述的方法tomcat会一直监视配置文件的变化,修改不需要重启Tomcat,比如把abc.xml
改名为cba.xml
,新的ContextPath会立刻生效,而且这种方式配置文件结构也比较清晰。
打开conf/server.xml
,我们看到Tomcat默认配置了一个Host,其name
属性为localhost
。前文说过,Tomcat可以配置多个context
,也就是多个web应用程序,但是这些web应用程序在同一个服务器上,其IP相同。如果这些web应用程序域名不同,用户从DNS服务器得到web应用程序服务器IP是同一个,那服务器如何知道用户想要访问哪个网站呢?
实际上,用户的HTTP请求里有一个Host
字段,值就是用户请求的域名,Tomcat配置的web应用程序如果需要使用域名,可以采用配置虚拟主机方式进行绑定。
不过真实的生产环境中,我们很少在Tomcat上配置虚拟主机,我们一般都是在Nginx上配置,通过反向代理转发到不同工程,这部分内容具体可以参考Nginx相关章节。