`
jiagou
  • 浏览: 2595234 次
文章分类
社区版块
存档分类
最新评论

Play+Nginx配置多网站,动态生成routes,动态更新Application

 
阅读更多

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/里面的"<项目名>"的文件夹
分享到:
评论

相关推荐

    liunx nodejs+nginx配置收藏版

    liunx nodejs+nginx配置收藏版liunx nodejs+nginx配置收藏版

    windows下 php+nginx配置详解

    安装完Nginx后,我们需要配置它的配置文件`nginx.conf`。这个文件通常位于`nginx`安装目录下的`conf`子目录中。在这个文件中,我们需要定义服务器块来监听HTTP请求,并指定PHP处理器的位置。例如: ```nginx server...

    Consul+upsync+Nginx动态配置负载均衡.pdf

    Consul+upsync+Nginx的组合提供了一种高效且灵活的动态负载均衡解决方案,它允许Nginx在无需重启的情况下实时更新其配置,以响应后端服务器的变化。这种技术特别适用于高可用性和可扩展性要求较高的分布式系统。 一...

    docker-compose php7.3.4-fpm+nginx+mysql配置

    docker-compose php7.3.4-fpm+nginx+mysql配置

    notepad++编辑nginx配置文件支持高亮

    在标题“notepad++编辑nginx配置文件支持高亮”中,我们关注的是如何在Notepad++中实现对Nginx配置文件的语法高亮显示,这将极大提升开发者的阅读和编写效率。 Nginx是一款高性能的HTTP和反向代理服务器,其配置...

    ffmpeg+nginx+nginx-rtmp-module搭建个人直播平台

    ffmpeg+nginx+nginx-rtmp-module搭建个人直播平台。 使用说明(ffmpeg+nginx+rtmp-module已经整合,支持HTTP,具体配置查看conf/nginx.conf): 1.解压后,运行nginx_start.bat。(查看监控状态 ...

    linux+nginx+php+mysql环境配置指南.pdf

    Linux+Nginx+PHP+MySQL 环境配置指南 本文档旨在指导用户如何配置 Linux+Nginx+PHP+MySQL 环境,以便搭建一个功能齐全的 Web 服务器。下面是详细的配置步骤: 一、安装 Red Hat Linux 首先,需要安装 Red Hat ...

    lua+nginx动态更新配置.zip

    "time":配置文件的生成的时间戳(用来判断文件是否有更新)eg:1585209315 "kxsip":与可信控制服务数据交互IP地址eg:192.168.0.1 "kxsport":与可信控制服务数据交互端口eg:8001 "gettokenapi":请求userID对应的...

    Notepad++ 自定义 nginx.conf 文件语法高亮的配置文件

    Notepad++ 自定义 nginx.conf 文件语法高亮的配置文件 使用教程:点击语言-自定义语言格式-导入(下载的xml文件)-重启notepad++,即可使用

    openerp+nginx配置方法

    openerp+nginx配置方法, 非常详细的资料,可以参考使用。

    redis+tomcat+nginx负载均衡配置

    8. **扩展性**:随着业务的增长,可以通过增加更多Tomcat实例并更新Nginx配置来轻松扩展系统。此外,Redis也可以通过主从复制或Cluster模式提升自身的可扩展性和容错性。 以上就是关于"redis+tomcat+nginx负载均衡...

    Keepalived+Nginx+Tomcat 高可用集群搭建实战记录

    Keepalived+Nginx+Tomcat 高可用集群搭建实战记录 Keepalived 是一种高可用性解决方案,可以与 Nginx 和 ...Keepalived+Nginx+Tomcat 高可用集群搭建可以提供高可用的 Web 服务,能够满足大型网站和应用程序的需求。

    MongoDB+Nginx配置

    ### MongoDB+Nginx配置详解 #### 一、概述 在现代Web开发中,高效的数据存储与灵活的内容分发网络(CDN)对于提升用户体验至关重要。MongoDB作为一种高性能、易扩展的文档型数据库,广泛应用于各类应用程序中;而...

    XShell+Xftp+nginx+默认配置

    【XShell+Xftp+nginx+默认配置】的组合是IT行业中常见的远程服务器管理和Web服务部署方案。这个组合主要用于Linux服务器的管理、文件传输以及Web服务的高效运行。以下是对这些工具及其默认配置的详细解释: 1. **...

    Redis+nginx集群部署

    通过配置Nginx的upstream模块,可以动态地将流量分发到不同的Tomcat实例,提高系统处理能力。 2. **Tomcat集群**:Tomcat是Apache软件基金会的一个开源Java应用服务器,用于运行Servlet和JSP。在集群模式下,多个...

    centos7安装+tomcat+mysql+jdk+nginx配置步骤

    centos7安装+tomcat+mysql+jdk+nginx配置步骤,按着步骤走傻子都能做出来,非常详细

    LVS+keeplived+nginx+apache

    最后,为了实现用户多站点的运行环境,还需要设置好相应的域名解析和虚拟主机配置,确保用户网站能够独立运行,而不会相互干扰。 综上所述,实现高可用、高性能的PHP集群是一个涉及多个组件、多环节配置的过程,...

    zabbix5.0+nginx详细配置.docx

    zabbix5.0+nginx详细配置

Global site tag (gtag.js) - Google Analytics