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

Trying to run Swift Vapor on Bluemix - 404 Not Found: Requested route does not exist

我想知道如何在 IBM Bluemix 中部署一个使用 Vapor 框架的 Cloudfoundry 应用程序。

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

最后,在学习一些 CF 的同时,我达到了使用 CloudFoundry CLI 的地步:

  1. 我正在连接到 Bluemix API 端点 (api .eu-gb .bluemix .net)
  2. 登录正常(将超时设置环境变量CF_DIAL_TIMEOUT扩展为20后)
  3. 进行“cf 推送”。它创建应用程序并上传和编译所有内容。
  4. 应用状态为“运行”。

但是当我加载页面时 (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 登录

  8. cf push

我对 Swift 和 Vapor 不是很熟悉,但是对于任何 cloud foundry 应用程序,您必须使用 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

运行 Bluemix 上的 Vapor 应用程序:

  1. 添加带有 servers.jsonConfig 目录(完全使用这些名称)。 servers.json 应包含以下内容:
        {
            "myserver": {
                "port": "$PORT"
            }
        }
      

它将指示 Vapor 在取自 Bluemix 使用的 $PORT 环境变量的端口上启动名为 myserver 的服务器。

  1. 在您的 Procfile 中,添加 --workDir=. 参数,因此它将包含:

    web: App --workDir=.
    

    它将指示Vapor在运行时间内在当前目录中寻找Config目录。