在 Heroku 上部署以 nginx 作为代理的 Springboot 应用程序 [英] Springboot application with nginx as proxy deploy on Heroku
问题描述
我正在尝试使用 nginx 作为 Heroku 上的代理部署 Spring 启动应用程序.我可以在没有 nginx 的情况下部署应用程序而不会出现任何问题,但是当我尝试使用 https://github.com/heroku/heroku-buildpack-nginx 构建包,应用程序已部署文件但崩溃并显示以下错误消息.根据我在日志中读到的内容,发生这种情况是因为 Spring Boot 应用程序和 nginx 都试图使用相同的端口而不是使用单独的端口.
I am trying to deploy Spring boot application with nginx as proxy on Heroku. I am able to deploy the application without any issue without nginx in the front but when I try to add nginx using https://github.com/heroku/heroku-buildpack-nginx build pack, the application gets deployed file but it crashes with below error message. Based on I read in the logs, this happens because spring boot application and nginx both trying to use the same port rather than using separate one.
2018-04-14T17:09:24.427513Z app[web.1]: buildpack=nginx at=nginx-start
2018-04-14T17:09:24.440105Z app[web.1]: nginx: [emerg] bind() to 0.0.0.0:10949 failed (98: Address already in use)
2018-04-14T17:09:24.440137Z app[web.1]: 2018/04/14 17:09:24 [emerg] 159#0: bind() to 0.0.0.0:10949 failed (98: Address already in use)
2018-04-14T17:09:24.940239Z app[web.1]: nginx: [emerg] bind() to 0.0.0.0:10949 failed (98: Address already in use)
2018-04-14T17:09:24.940285Z app[web.1]: 2018/04/14 17:09:24 [emerg] 159#0: bind() to 0.0.0.0:10949 failed (98: Address already in use)
2018-04-14T17:09:25.440529Z app[web.1]: nginx: [emerg] bind() to 0.0.0.0:10949 failed (98: Address already in use)
2018-04-14T17:09:25.440569Z app[web.1]: 2018/04/14 17:09:24 [emerg] 159#0: bind() to 0.0.0.0:10949 failed (98: Address already in use)
2018-04-14T17:09:25.940679Z app[web.1]: nginx: [emerg] bind() to 0.0.0.0:10949 failed (98: Address already in use)
2018-04-14T17:09:25.940746Z app[web.1]: 2018/04/14 17:09:24 [emerg] 159#0: bind() to 0.0.0.0:10949 failed (98: Address already in use)
2018-04-14T17:09:26.440833Z app[web.1]: nginx: [emerg] bind() to 0.0.0.0:10949 failed (98: Address already in use)
2018-04-14T17:09:26.440876Z app[web.1]: 2018/04/14 17:09:24 [emerg] 159#0: bind() to 0.0.0.0:10949 failed (98: Address already in use)
2018-04-14T17:09:26.940976Z app[web.1]: nginx: [emerg] still could not bind()
2018-04-14T17:09:26.941031Z app[web.1]: 2018/04/14 17:09:24 [emerg] 159#0: still could not bind()
2018-04-14T17:09:26.941552Z app[web.1]: buildpack=nginx at=exit process=nginx
2018-04-14T17:09:26.946943Z system[web.1]: Process exited (exit status 1)
2018-04-14T17:09:26.965949+00:00 system[web.1]: State changed from up to crashed
以下是我所拥有的 procfile,请注意,如果我删除了 nginx 部分,它可以正常工作并且应用程序可以正常工作,但如果我将 nginx 保留在两者之间则无法工作.
Below is the procfile that I have in place, please note that if I remove nginx part, it works fine and application works without any issues but doesn't work if I keep nginx in between.
web: bin/start-nginx java -D server.port=$PORT -jar target/some-test-0.0.1-SNAPSHOT.jar
我的 nginx 配置与 buildpack 上提到的几乎相同.https://github.com/ryandotsmith/nginx-buildpack/blob/master/config/nginx.conf.erb 位置.
My nginx configuration is pretty much same as mentioned on buildpack. https://github.com/ryandotsmith/nginx-buildpack/blob/master/config/nginx.conf.erb location.
有人可以帮忙解决这个问题吗?
Can someone please help on how to fix this?
推荐答案
我能够使用以下更改修复此问题.我对 nginx 配置文件进行了以下更改.
I was able to fix this using below changes. I have made below changes on nginx config file.
nginx buildpack 上的默认更改如下:
Default changes on nginx buildpack is as below:
upstream app_server {
server unix:/tmp/nginx.socket fail_timeout=0;
}
我们已将这些配置文件更改如下.
We have changed these config file as below.
upstream app_server {
server localhost:<%= ENV["APP_PORT"] %> fail_timeout=0;
}
下面还有 proc 文件更改,其中我添加了新的环境变量 APPLICATION_PORT,它为我解决了问题.
Also below are the proc file changes where I have added new environment variable APPLICATION_PORT which fixed the issue for me.
web: bin/start-nginx java -Dserver.port=$APP_PORT -jar target/dashery-complete-0.0.1-SNAPSHOT.jar
这篇关于在 Heroku 上部署以 nginx 作为代理的 Springboot 应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!