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

时间:2017-09-13 19:35:22

标签: node.js docker nginx

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

当我通过简单地在主机上的nginx.conf中添加一个位置来实现这个目的时:
location / metrics {
    proxy_pass http://localhost:4012;
}

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

它没有将/ metrics附加到资产,就像它获取index.html一样... 我在这里错过了什么? 如果它意味着什么,则webapp正在nodejs express服务器上运行,该服务器正在侦听docker容器上的端口3000。

1 个答案:

答案 0 :(得分:0)

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

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">';
}

因此,向html添加<base>标记有助于将/css更改为/metrics/css。然后使用sub_filter更改绝对网址。