【问题标题】:Deploying spring boot application to heroku - error message "No web processes running"将 Spring Boot 应用程序部署到 Heroku - 错误消息“没有运行 Web 进程”
【发布时间】:2020-05-21 22:03:42
【问题描述】:

我创建了一个 Spring Boot Web 应用程序(在 IntelliJ IDEA 中),它在本地运行没有问题。

然后我构建了一个工件(Build -> Build Artifacts... -> my_app:jar -> Build),它在“out”目录中创建了一个 jar 文件。

我尝试完全按照 heroku 演练中描述的步骤将应用程序部署到 heroku:https://devcenter.heroku.com/articles/deploying-spring-boot-apps-to-heroku

注意:演练没有提到 Procfile,所以我没有创建。

在浏览器中打开应用程序的地址时,我遇到了“应用程序错误”。

日志显示构建应用程序成功,但显然“没有网络进程正在运行”:

2020-02-06T20:42:19.262364+00:00 app[api]: Release v1 由用户创建 michaels@icloud.com 2020-02-06T20:42:19.598724+00:00 应用程序 [api]: 由用户 michaels@icloud.com 创建的版本 v2 2020-02-06T20:42:19.262364+00:00 app[api]:用户首次发布 michaels@icloud.com 2020-02-06T20:42:19.598724+00:00 应用程序 [api]: 由用户 michaels@icloud.com 启用 Logplex 2020-02-06T20:46:11.000000+00:00 app[api]:用户开始构建 michaels@icloud.com 2020-02-06T20:46:56.626428+00:00 应用程序 [api]: 由用户 michaels@icloud.com 创建的版本 v3 2020-02-06T20:46:56.626428+00:00 app[api]:按用户部署 93b6dfea michaels@icloud.com 2020-02-06T20:47:04.000000+00:00 应用程序 [api]: 构建成功 2020-02-06T20:48:22.485742+00:00 heroku[router]: at=错误代码=H14 desc="没有运行 Web 进程" method=GET path="/" 主机=my-app.herokuapp.com request_id=22e30a92-5094-4f8b-a51c-3f21177b19dc fwd="95.88.203.176" dyno=连接=服务=状态=503字节=协议=https

我使用以下命令检查了测功机是否正在运行:

heroku ps

结果:

⬢infinite-sky-81114 上没有测功机

然后我运行以下命令来启动测功机:

heroku ps:scale web=1

结果:

缩放测功机...! ▸ 找不到该进程类型(网络)。

所以应用程序无法运行,因为没有测功机 - 但我无法启动测功机。

我怎样才能做到这一点?

【问题讨论】:

  • 您为什么要使用war 进行新应用程序?
  • 您的Profile 应命名为Procfile

标签: java spring-boot heroku


【解决方案1】:

假设您使用 JAR,默认情况下将创建 Procfile。你确定你的网络测功机还在运行吗?如果您使用的是 cli,您可以使用heroku ps 来查看状态。如果它说没有测功机,您可以使用heroku ps:scale web=1 放大并尝试heroku open 启动应用程序。

如果您使用 WAR,您可以关注 https://devcenter.heroku.com/articles/war-deployment,是的,您需要 Procfile。

另外,在独立的 tomcat 上运行 spring boot 应用程序时,不要忘记按照此处的步骤操作https://docs.spring.io/spring-boot/docs/2.1.10.RELEASE/reference/html/howto-traditional-deployment.html

这是我在进行 Spring Boot Heroku 集成时拍摄的一些屏幕截图。

过程文件

Pom(带有 WebRunner 插件) 演示应用程序(注意使用 SpringBootServletInitializer)。不使用会得到404。

首页

Heroku 日志

【讨论】:

  • 非常感谢您的回答...我检查了是否有测功机正在运行。由于情况并非如此,因此我尝试启动测功机。然而,这导致了以下错误消息:“Scaling dynos...!▸ 找不到该进程类型(网络)。”,请参阅我更新的帖子
  • 不客气。请您查看help.heroku.com/W23OAFGK/… 好吗?和stackoverflow.com/questions/48512013/…。您能否确认您是否使用 WAR ?还是使用独立的 tomcat 在本地运行?
  • 我还建议在根 devcenter.heroku.com/articles/procfile#procfile-format 中创建一个默认 Procfile。与 SpringBoot 一起使用。
  • “使用 WAR”到底是什么意思?我没有运行“mvn install”,所以没有在文件夹“target”中创建 .war 文件……我想这意味着我没有使用 WAR。但是,即使“target”文件夹中存在 .war 文件,考虑到“target”文件夹的内容没有被推送到 heroku(即被 git 忽略),这对 heroku 有什么影响?
  • 我正在使用 Intellij IDEA 社区版在本地运行应用程序。 Intellij IDEA 后台使用的是哪种类型的服务器(Glassfish、tomcat 等)我不知道。
【解决方案2】:

只用创建Procfile

web: java -Dspring.profiles.active=default -Dserver.port=$PORT -jar target/*.jar

不要忘记通过heroku create 将heroku 的源代码添加到heroku git。这会将源代码放到 heroku git 中,当构建 dynos 时,它将从源代码部署您的应用程序。

这是我的示例项目,它是您将 Spring Boot 应用程序部署到云的入门。 https://github.com/reflexdemon/cloud-project

我还写了一篇关于将 Spring Boot 应用程序部署到 Heroku 的博客。希望有帮助。 https://blog.vpv.io/2018/02/undocumented-java-web-application.html

【讨论】:

    【解决方案3】:

    您似乎正在尝试部署 WAR 文件。没有 Web 服务器就无法运行 WAR 文件。你有两个选择:

    1. Spring Boot 可以将您的应用程序与嵌入式 Web 服务器捆绑在一起。这将完全避免这个问题。
    2. 使用webapp-runner 将为您运行一个WAR 文件。 Heroku 的Maven plugin 可以帮助您进行设置。

    我推荐第一种方法。 Heroku 有 a great walkthrough 设置 Spring boot 应用程序。

    【讨论】:

    • 非常感谢您的评论。我遵循了部署您评论中链接的 Spring Boot 应用程序的演练。尽管 heroku 似乎已成功构建应用程序,但我仍然收到应用程序错误。我重写了我的问题,以描述我到底做了什么以及遇到了什么错误(见上文)
    • 我可能需要包含一个 Procfile 吗?
    【解决方案4】:

    更灵活的方法是使用 Heroku 容器注册表,它允许运行基于 Docker 的应用程序。
    这种方法允许运行您在本地构建/测试的相同应用程序映像,并且不需要添加特定于 Heroku 的配置(Procfile)。

    先决条件

    工作的 Docker 和 Heroku 客户端,并确保您的帐户已通过身份验证:

    • 登录 Heroku heroku login
    • 登录容器注册表heroku container:login

    定义 Docker 映像

    创建一个 Dockerfile

    FROM adoptopenjdk/openjdk11:latest
    
    RUN mkdir -p /software
    ADD target/myapp.jar /software/myapp.jar
    CMD java -Dserver.port=$PORT $JAVA_OPTS -jar /software/myapp.jar
    

    注意:注入 env 变量 $PORT 是在 Heroku 上运行 SpringBoot 应用程序所必需的

    构建图像

    docker build -t mydomain/myapp .
    

    并在本地测试

    docker run -it --name myapp -p 8886:8886 mydomain/myapp 
    

    注意:在上面的示例中,您的 application.properties 定义了 server.port=8886 以使用 8886 作为 Spring Boot 应用程序的端口

    标记、推送和部署到 Heroku

    接下来标记图像,然后将其推送到 Heroku:

    docker tag mydomain/myapp registry.heroku.com/myapp/web
    docker push registry.heroku.com/myapp/web
    

    终于可以启动应用了:

    heroku container:release web -a myapp
    

    您还可以放大(或缩小)应用程序:

    # undeploy
    heroku ps:scale web=0 --app myapp
    

    参考
    https://devcenter.heroku.com/articles/container-registry-and-runtime

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-25
      • 2020-12-01
      • 1970-01-01
      • 2012-04-25
      • 2012-07-09
      • 2022-08-07
      • 1970-01-01
      • 2020-11-23
      相关资源
      最近更新 更多