我有一个带有JS和index.html
的SPA(单页应用程序(。
我正在/public
目录的后端Golang应用程序中提供它
我正在Heroku上部署这个Golang应用程序:一切正常!
现在我正在使用Svelte Kit(或者NextJS,我仍然需要决定(构建一个SSR(服务器端渲染(应用程序。
给定:
SSR应用程序是一个NodeJS应用程序,它需要一个专用的Heroku dyno:我想我不能像现在这样从/public
目录中提供它。
抛开专用dyno的额外成本不谈,现在还有提供的额外延迟的新问题
-
前端SSR应用程序(在
frontend.herokuapp.com
上(需要调用backend.herokuapp.com
; -
新的CORS调用不同的域
问题:
有没有办法在同一个dyno上部署两个应用程序?
也许在他们前面有一个代理(例如:nginx或HA(,这样我就可以有一个同时包含这两个的域:
-
myapp.heroku.com
->服务SSR应用程序(index.html
,它可以使用/api
和NOTbackend.herokuapp.com/api
调用我的后端( -
myapp.heroku.com/api
->可以从前端应用程序调用,而无需CORS调用
我完全疯了吗?
上下文:
这是一个浏览量很少的小应用程序。
根据网上的问题和建议,答案是否。
根据许多社区和专家的说法,Heroku的模式是每个dyno运行一个应用程序(通常单个应用程序运行多个dyno(。
但是等一下,有一种情况是,将两个服务器部署到一个dyno上,它也起作用了。您可以在此处查看:https://medium.com/@nadayar/heroku-fu多服务器对一dyno-6fc68d57b373
希望这能解决你的问题!
Heroku每个Dyno只允许一个端口(因此只有一个应用程序能够接收和处理web请求(,但有一种变通方法,可以使用Heroku Docker注册表将两个应用程序组合在一个Dyno中。
该解决方案包括创建一个Dockerfile,该文件同时具有两个应用程序,并且在Heroku上部署时将同时启动这两个应用
只有一个应用程序(web前端(将绑定到Heroku端口,从而接受来自web的请求。当第一个应用程序能够访问容器时,第二个应用程序(后端(将无法在容器外使用。
带有2个Java服务的Dockerfile示例(其他语言/框架也是可能的(:
RUN mkdir -p /software
# copy first app (run on $PORT)
ADD target/app1.jar /software/app1.jar
# copy second app (run always on 8888)
ADD lib/app2.jar /software/app2.jar
ADD startup.sh /software/startup.sh
USER root
RUN chmod a+x /software/startup.sh
CMD /software/startup.sh
startup.sh
必须并行启动中的两个应用程序
java -Dserver.port=$PORT $JAVA_OPTS -jar /software/app1.jar &
java -Dserver.port=8888 -jar /software/app2.jar && fg
对Dyno(app.herokuapp.com
(的web请求将解析到web前端(在上面的示例中为app1(。前端可以使用本地地址/端口连接到后端
http://localhost:8888/