设为首页 收藏本站
查看: 728|回复: 0

[经验分享] Play+Nginx配置多网站,动态生成routes,动态更新Application

[复制链接]

尚未签到

发表于 2016-12-28 11:03:04 | 显示全部楼层 |阅读模式
Play 运行多网站(主要是静态网站),初步想法是把新网站的views和controllers及routes链接或重写一下



views直接链接到总网站的“views/项目名”文件夹下,这时你的views下会多了诸如taobao_com、baidu_com的文件夹,而文件夹里的内容就是相关项目的views
contollers比较复杂,因为每一个项目默认的conrollers都是Application.scala,而用views文件夹的方法又会导致编译失败,所以只好把项目的controllers链接到总网站的“controllers/.项目名”文件夹下,加点的原因是在linux下会被隐藏(什么,你用windows开发,汗。。。有前途吗?自己想辙吧),这样就不会被编译,而文件夹拷贝过来主要是为了方便一会进行处理
routes的处理也不简单,需要重写“conf/rout”文件,我们就把所有的routes链接到“conf/route/项目名”下,方便我们处理
Where there is a shell,there is a way.shell
自动处理play多网站的views,conrollers,routes链接


文件链接完成了,我们可以在“app/Global.scala”里面在对conrollers和routes进行处理,代码如下




import play.api._
import play.api.mvc._
import play.api.mvc.Results._
import scala.io._
import scalax.io._
import java.io._
import java.math._
import scala.collection.mutable.LinkedHashSet
object  Global extends GlobalSettings {
override def beforeStart(app:Application){
val filename="conf/routes"
new File("conf/routes").delete()
println("正在删除原来的routes文件")
val output:Output=Resource.fromFile("conf/routes")
println("正在准备创建新的routes文件")
var fileLines=LinkedHashSet("# This file is generate automatically.\r\n")
val files=new File("conf/route/")
for(file<-files.list()){
print("正在处理"+file)
val fileName=file.replaceAll("_","").replaceFirst(file.substring(0, 1),file.su
bstring(0, 1).toUpperCase()) ;
//把诸如baidu_com变成Baiducom,主要是为了符合conrollers/Application.scala的命名
//规范               
fileLines+="# This part is generate from "+file+"\r\n"
for(line<-Source.fromFile("conf/route/"+file).getLines){
var lineNew=line.toString.replaceAll("\t+", " ").replaceAll(" +", " ")
//为了找到routes里面的重复内容,我们对routes里面的没一行进行格式化,把tab和多个空
// 格替换成一个空格
var tabStr=""
while(tabStr.length<(100-lineNew.length-file.toString.length))
tabStr+=" "
tabStr+="controllers."+fileName
//这里有一次进行格式化,通过添加空格使每一行都至少100个字符,即简单的右对齐效果
fileLines+=lineNew.replaceAll("controllers.Application",tabStr).replaceAll("GE
T /","GET /"+file+"/").replaceAll("POST /","POST     /"+fil
e+"/")
//由于controllers/Application.scala被改成诸如Baiducom.scala的格式,所以把routes
// 里面的所有的controllers.Application替换成类似controllers.Baiducom把GET / 替换
// 成类似GET /baidu_com/ 等等
fileLines+="GET /assets/*file controllers.Assets.at(path=\"/public\", file
)"
print(".")
}
println()
new File("app/controllers/"+fileName+".scala").delete()
println("正在删除原来的"+file+"Applicaton.scala文件")
print("正在重写"+file+"的Applicaton.scala")
var outputApp:Output=Resource.fromFile("app/controllers/"+fileName+".scala")
for(line<-Source.fromFile("app/controllers/."+file+"/Application.scala").getLines){
var lineNewApp=line.toString.replaceAll("views.html.","views.html."+file.repla
ce("-","_")+".").replaceAll("Application",fileName).replaceAll(fileName+".email","Application.e
mail")
//拷贝“controllers/.项目名/Appllication.scala“到“/controllers/处理过的项目名如
//Baiducom.scala”,并把厘里面的的view.html替换成views.html.项目名如baidu_com,本
//工程尽量用_而不是-
outputApp.write(lineNewApp+"\r\n")(scalax.io.Codec.UTF8)
print(".")
}
println()
}
print("正在生成新的routes文件")
fileLines+="# For contact us"
fileLines+="POST    /pricing                     controllers.Application.postMsg"
fileLines+="GET     /email                       controllers.Application.email"
for(fileLine<-fileLines){
output.write(fileLine.toString+"\r\n\r\n")(scalax.io.Codec.UTF8)
print(".")
}
output.write("GET /assets/*file controllers.Assets.at(path=\"/public\", file)")
println()
}
}

  具体步骤如下
  


运行原来的项目,确保能正确运行







cd [原项目路径]
sudo sbt
run
访问http://localhost:9000



将原项目的routes文件链接到新项目中的/conf/route/文件夹下

ln -s [原项目路径]/conf/routes [新项目路径]/[项目名,例:dm6467_cn,注意下划线,不是减号]



将原项目的views文件夹链接到新项目的views文件夹下

ln -s  [原项目路径]/app/views/ [新项目路径]/[项目名,例:dm6467_cn]



将原项目中的controllers文件夹链接到新项目的controllers文件夹下

ln -s  [原项目路径]/app/controllers/ [新项目路径]/[项目名,例:.dm6467_cn,注意文件夹名前面的点号,可保证不编译,避免不必要的错误麻烦]





运行新项目









sudo sbt
run







访问新项目 http://localhost:9000/ 可能出现错误如下











Compilation error

not enough arguments for method apply: (p: models.Page)play.api.templates.Html in object index. Unspecified value parameter p.

解决办法:找到/app/views/[项目名称]/index.scala.html(根据提示自行推断),去掉第一行的@(p:Page)


找不到scala文件,

请自行将原项目里/app/models/里的相关文件(提示缺少的文件)拷贝或整合到新项目中





配置ngnix,添加如下内容









server {
listen 80;
server_name www.[域名].com *.[域名].com [域名].com;
location / {
proxy_set_header  Host  $host;
proxy_pass http://127.0.0.1:9000/[项目名]/;
}
}





重启nginx









nano /var/run/nginx.pid(此步骤为查看nginx主进程号,记住打开文件里的数字,然后关闭文件)
kill -QUIT <主进程号>(其中<主进程号>为上一步骤中记住的数字)
sudo nginx





访问域名www.[域名].com









如果出现问题,新项目初始化的方法为









轻度初始化:删除"conf/routes"文件,将"routes.bak"复制一份,粘贴为"routes"

强力初始化:在上一步的基础上,删除"app/controllers/"里面的"<首字母大写项目名>.scala"的文件

完全初始化:在上两步的基础上,删除"app/controllers/"里面的".<项目名>"的文件夹,删除app/views/里面的"<项目名>"的文件夹

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-320654-1-1.html 上篇帖子: centos6.3环境下nginx,php,memcache,memadmin的安装部署2 下篇帖子: [原创]剖析nginx等单线程服务器设计原理与性能优势
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表