最近一直在使用playframework,一个高性能快速开发的框架,非常推荐尝试,在生产环境部署的时候遇到了一些问题,这里做下记录。
首先查看了下官方的文档 1.4.x/deployment 官方提到了几种方式
1. 独立的play应用(前面是nginx或者apache)
1.4.x/production
这种方式就是play依然是用常用方法启动,比如 play start app
这样的方式,在play的前面做一个nginx的代理和负载均衡就可以,play提供了PROD模式,在PROD模式下会关闭代码的实时检测和热部署功能,也会做提前初始化数据库连接等操作,提高性能,但是这种模式有一个最大的问题是,你需要把你的源码也部署在你的服务器上。所以我们尝试了第二种方式
2. 使用JavaEE服务器
1.4.x/deployment
比如说常用的Tomcat,Jetty等,和我们普通开发SpringMVC项目一样,最终项目产出一个War包,然后部署到这些中间件中。
play提供了相关的命令:
play war myapp -o myapp.war
但是我们在使用了这种方式之后,发现了一些诡异的问题,比如相关资源加载不到等,网上也有一些朋友遇到了奇怪的问题 https://github.com/playframework/play1/issues/1206 最终我们也放弃了这种方法。
3. 使用precompile方式
在研究这个问题的时候,我查看了play的命令行选项,发现了一个命令
precompile Precompile all Java sources and templates to speed up application start-up
这个命令的解释是预编译所有的java源码和模板来加速项目启动,后来在一个老版本文档中终于发现了终极解决方案
war-archives-are-fully-precompiled
play start myApp -Dprecompiled=true
你可以提前使用precompile编译你的所有源码,然后通过 play start myApp -Dprecompiled=true
的方式,来直接启动项目,并不需要你的源码,这样我们的实际构建过程就是
play clean play deps --verbose play precompile zip -r web.zip conf modules lib precompiled public
先清理缓存,加载依赖,预编译,然后打包成一个zip文件,之后在生产环境上
play start web -Dprecompiled=true
就可以啦