繁体   English   中英

将 spring boot 应用程序部署到 heroku - 错误消息“没有 Web 进程正在运行”

[英]Deploying spring boot application to heroku - error message "No web processes running"

我创建了一个 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]:由用户 michaels@icloud.com 创建的 Release v1 2020-02-06T20:42:19.598724+00:00 app[api]:由用户创建的 Release v2用户 michaels@icloud.com 2020-02-06T20:42:19.262364+00:00 app[api]:用户 michaels@icloud.com 2020-02-06T20:42:19.598724+00:00 app[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 开始构建app[api]:发布 v3 由用户 michaels@icloud.com 2020-02-06T20:46:56.626428+00:00 app[api]:由用户 michaels@icloud.com 部署 93b6dfea 2020-02-06T20:47: 04.000000+00:00 app[api]: 构建成功 2020-02-06T20:48:22.485742+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path=" /" host=my-app.herokuapp.com request_id=22e30a92-5094-4f8b-a51c-3f21177b19dc fwd="95.88.203.176" dyno= connect= service= status=503 bytes= protocol=https

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

heroku ps

结果:

⬢无限天空81114上没有dynos

然后我运行以下命令来启动一个 dyno:

heroku ps:scale web=1

结果:

缩放动态...! ▸ 找不到该进程类型 (web)。

因此该应用程序无法运行,因为没有 dyno - 但我无法启动 dyno。

我怎样才能使这项工作?

假设您使用的是 JAR,默认情况下将创建Procfile 你确定你的网络测功机还在运行吗? 如果您使用的是 cli,则可以使用heroku ps检查状态。 如果它说没有 dynos,您可以使用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 插件) 在此处输入图片说明 Demo Application(注意SpringBootServletInitializer的使用)。 如果你不使用它,你会得到 404。

在此处输入图片说明

主页在此处输入图片说明

Heroku 日志在此处输入图片说明

看起来您正在尝试部署 WAR 文件。 如果没有 Web 服务器,您将无法运行 WAR 文件。 您有两个选择:

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

我推荐第一种方法。 Heroku 在设置 Spring 启动应用程序方面有很好的演练

只需创建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

更灵活的方法是使用Heroku Container Registry ,它允许运行基于 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

亲爱的 s7vr 你帮了我很多。 感谢 jou 提供了我一直在寻找的答案。 保护你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM