试图在Bluemix上运行Swift Vapor - 404 Not Found:请求的路由不存在

时间:2016-10-17 21:29:06

标签: swift ibm-cloud cloudfoundry vapor

我正在尝试弄清楚如何在IBM Bluemix中部署使用Vapor框架的Cloudfoundry应用程序。

IBM正在为他的平台使用他的框架Kitura开发服务器端Swift应用程序提供设施和指导。我认为作为Cloudfoundry提供者,使用正确的Swift buildpack,我们必须能够部署通用服务器端Swift代码。

最后,在学习CF的各个部分时,我达到了使用CloudFoundry CLI的程度:

  1. 我正在连接到Bluemix API端点(api .eu-gb .bluemix .net)
  2. 登录确定(将超时设置env.var CF_DIAL_TIMEOUT扩展为20后)
  3. 制作“cf push”。它创建应用程序并上传和编译所有内容。
  4. 应用状态为“正在运行”。
  5. 但是当我加载页面(https://sommobilitatcore.eu-gb.mybluemix.net/)时,我得到了:

    404 Not Found: Requested route ('sommobilitatcore.eu-gb.mybluemix.net') does not exist.
    

    任何人都可以帮助我吗?谢谢!

    某些背景信息:

    manifest.yml:

    applications:
    - path: .
      memory: 256M
      instances: 1
      name: SomMobilitatCore
      disk_quota: 1024M
      buildpack: https://github.com/IBM-Swift/swift-buildpack.git
    

    Procfile

    web: App
    

    (main.swift在Source / App /中)

    在Vapor Config文件中未配置任何端口,然后Vapor正在尝试侦听端口80:

    import Vapor
    import HTTP
    
    let drop = Droplet()
    
    let _ = drop.config["app", "key"]?.string ?? ""
    
    drop.get("/") { request in
        return try drop.view.make("welcome.html")
    }
    
    (...)
    
    let port = drop.config["app", "port"]?.int ?? 80
    
    // Print what link to visit for default port
    drop.serve()
    

    更新

    最后让它在没有Procfile的情况下运行,即manifest.yml

    - path: .
      instances: 1
      memory: 256M
      disk_quota: 1024M
      name: SomMobilitat4
      command: App --env=production --workdir="./"
      buildpack: swift_buildpack
    

    和/Config/production/servers.json:

    {
        "production": {
            "port": "$PORT"
        }
    }
    

    我既没有在main.swift文件中指定端口变量。随着更新的Vapor版本:

    import Vapor
    import HTTP
    
    let drop = Droplet()
    
    drop.get("/") { request in
        return "hello vapor in bluemix cloudfoundry"
    }
    
    
    drop.run()
    

    如果您不熟悉Cloudfoundry或IBM Bluemix,这是一种工作方式:

    1. 您在Cloudfoundry提供商中注册(例如:bluemix)
    2. 你在当地有Vapor项目。
    3. 使用以下短行添加.cfignore文件:Packages / 避免将包上传到服务器。
    4. 将上面提到的manifest.yml文件添加到其中。
    5. 下载并安装Cloudfoundry CLI:https://docs.cloudfoundry.org/cf-cli/

      使用CLI:

    6. cf api https://api.eu-gb.bluemix.net

    7. cf login
    8. cf push

2 个答案:

答案 0 :(得分:1)

在Bluemix上运行Vapor应用程序:

  1. 使用Config添加servers.json目录(使用这些名称)。 servers.json应包含以下内容:
        {
            "myserver": {
                "port": "$PORT"
            }
        }
      
  2. 它将指示Vapor在从Bluemix使用的myserver环境变量获取的端口上启动名为$PORT的服务器。

    1. Procfile中添加--workDir=.参数,以便它包含:

      web: App --workDir=.
      

      它将指示Vapor在运行时查找当前目录中的Config目录。

答案 1 :(得分:0)

我对Swift和Vapor不是很熟悉,但对于任何云代工厂应用程序,您必须使用VCAP_APPLICATION环境变量中的端口。

Bluemix为Swift创建了一个有用的包,你可以得到这个端口号。

在Package.swift文件中添加以下行:

.Package(url: "https://github.com/IBM-Swift/Swift-cfenv.git", majorVersion: 1, minor: 7)

然后你可以使用这样的东西来获得正确的端口号来启动你的应用程序:

import CloudFoundryEnv

...

let appEnv: AppEnv
appEnv = try CloudFoundryEnv.getAppEnv()
let port = appEnv.port 

您可以在此处查看Bluemix Swift启动代码以获取更多详细信息:

https://github.com/IBM-Bluemix/Kitura-Starter