在heroku上为Django / NodeJS应用程序设置node-http-proxy

时间:2018-03-15 21:17:55

标签: node.js django heroku proxy

我正在部署一个同时使用nodeJS的Django应用程序 有了这个,我偶然发现了

https://blog.heroku.com/heroku-django-node

我能够设置buildpacks和procfiles 但我在设置node-http-proxy

方面遇到了问题

所以我想这部分让我感到困惑(来自上面的链接):

  

当然,网络dyno上只有一个进程可以绑定到PORT。通过添加环境变量(我们称之为DJANGO_PORT)并将node-http-proxy添加到我们的节点脚本,我们能够将节点绑定到PORT并将所有正常的Web流量代理到127.0.0.1以上的Django。生成的Procfiles看起来像这样:

我已经将env变量添加到我的heroku应用程序中。

2个问题

  • 这是你如何正确绑定server.js中的PORT? 我有:
const PORT = process.env.PORT
httpProxy.createProxyServer({target:'app_url:8080'}).listen(PORT);
  • 8080是我的DJANGO_PORT,我期待这也可以将流量路由到我的django服务器?

我收到上述错误:

    /app/node_modules/http-proxy/lib/http-proxy/index.js:119
     throw err;
     ^

 Error: connect ECONNREFUSED {ip_address}:8080
     at Object._errnoException (util.js:1022:11)
     at _exceptionWithHostPort (util.js:1044:20)
     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1198:14)

需要帮助,至少知道我的想法或理解是否正确。 只是想知道我是否正确的思考方向

先谢谢!

1 个答案:

答案 0 :(得分:0)

解决了问题

对于想要在heroku上的单个dyno上运行Django和NodeJS的人。

这就是我做过的事情

我通过Heroku CLI将自定义buildpack添加到我的应用程序以及heroku / python和heroku / nodejs(多个buildpacks)

http://www.github.heroku.com/heroku/heroku_buildpack_runit

创建Procfile

web: bin/runsvdir-dyno

Procfile.web DJANGO_PORT在Heroku的Envs上

django: gunicorn appname.wsgi:application --bind 127.0.0.1:$DJANGO_PORT
node: node server.js

最后使用node-http-proxy如下。这是我的端口3000上运行的节点应用程序

var webpack = require('webpack')
var WebpackDevServer = require('webpack-dev-server')
var config = require('./webpack.local.config')
var httpProxy = require('http-proxy')
const PORT = process.env.PORT
// ::::::::::::::::::Starting from here
var NODE_PORT = 3000;
var http = require('http')
var proxy = httpProxy.createProxyServer({});

http.createServer(function(req, res) {
    // For all URLs beginning with /channel proxy to the Node.JS app, for all other URLs proxy to the Django app running on DJANGO_PORT
    if(req.url.indexOf('/channel') === 0) {
        // Depending on your application structure you can proxy to a node application running on another port, or serve content directly here
        proxy.web(req, res, { target: 'http://localhost:' + NODE_PORT });

        // Proxy WebSocket requests if needed
        proxy.on('upgrade', function(req, socket, head) {
            proxy.ws(req, socket, head, { target: 'ws://localhost:' + NODE_PORT });
        });
    } else {
        proxy.web(req, res, { target: 'http://localhost:' + process.env.DJANGO_PORT });
    }
}).listen(process.env.PORT);
// :::::::::::::::::::To HERE
new WebpackDevServer(webpack(config), {
  publicPath: config.output.publicPath,
  hot: true,
  inline: true,
  historyApiFallback: true,
  watchOptions: {
    aggregateTimeout: 300,
    poll: 1000
  },
  headers: { "Access-Control-Allow-Origin": "*" },
}).listen(3000, config.ip, function (err, result) {
  if (err) {
    console.log(err)
  }

  console.log('Listening at ' + config.ip + ':3000')
})