NGINX反向代理到docker容器运行web应用程序

在主机上,我有docker容器在端口4012,并在docker容器的Web应用程序运行在端口3000(0.0.0.0:4012->3000/tcp)所以访问webapp我只需要http://主机名: 4012和网页显示正常。 我希望能够去http:// hostname / metrics从我的浏览器运行相同的网页。

当我通过在主机上的nginx.conf中添加一个位置来完成这个工作时:
位置/指标{
proxy_pass http:// localhost:4012 ;
}

所有加载的是index.html(我在http:// localhost:4012和http:// hostname / metrics上看到相同的html源代码),但是http:// hostname / metrics不会加载需要的javascript资源运行webapp。 从开发人员工具中,我看到非代理站点加载如下所示的资产: http:// hostname:4012 / assets / styles.css转到/ metrics的代理版本尝试加载,如下所示: http:// hostname / assets / styles.css的

它不会将/度量值附加到资产,就像它获取index.html …我在这里错过了什么? 如果这意味着什么,webapp将运行在监听器容器上的端口3000上的nodejs express服务器上。

你需要让应用程序以这种方式工作

location /metrics/ { proxy_pass http://localhost:4012/; sub_filter_once off; sub_filter 'http://localhost:4012/' '$scheme://$host/metrics/'; sub_filter '<head>' '<head>\n<base href="hostname:4012">'; } 

所以添加一个<base>标签到html有助于将/css改为/metrics/css 。 然后使用sub_filter也改变绝对的URL。