简体   繁体   English

Heroku node.js和Flask应用程序在本地运行,但不在服务器中运行

[英]Heroku node.js and Flask application working locally but not in server

I have a web application which uses node.js and communicates with a Flask application to retrieve some configurations and send jobs to the back-end. 我有一个Web应用程序,它使用node.js并与Flask应用程序通信以检索一些配置并将作业发送到后端。 The Flask returns a JSON with the information Flask返回带有信息的JSON

Flask file (REST.PY): 烧瓶文件(REST.PY):

from flask import Flask, jsonify, request, redirect, url_for
import subprocess

import os
import json
from cross_domain import *
app = Flask(__name__)

...

@app.route('/api/v1.0/proteins', methods=['GET', 'OPTIONS'])
@crossdomain(origin='*')
def get_protein_names():
proteins = os.walk(TARGET).next()[1]
protein_lst = [{"filename": protein} for protein in sorted(proteins) if  protein != "scripts"]
return jsonify({"files": protein_lst})

if __name__ == '__main__':
app.run(debug=True,port=9000)

and here is the js code: 这是js代码:

...

this.restAddr = "http://127.0.0.1:9000";

...

this.httpGet = function(url, callback) {
var xmlHttp;
xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
  if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {
    callback(xmlHttp.responseText);
  }
};

...

httpGet(restAddr + "/api/v1.0/proteins", populateProteins);

I'm currently using this buildback in order to run both commands in the Procfile. 我当前正在使用此构建 ,以便在Procfile中运行两个命令。 It works when I run locally with foreman start , but when I deploy to Heroku the frameworks doesn't communicate with each other anymore and there is no response in the XMLHTTPRequests. 当我使用foreman start在本地运行时,它可以工作,但是当我部署到Heroku时,框架不再相互通信,并且XMLHTTPRequests中没有响应。 I can still work with the node.js part, though. 不过,我仍然可以使用node.js部分。

Here is the Heroku logs: 这是Heroku日志:

...
2016-06-16T20:08:59.174025+00:00 app[web.1]: buildpack=runit ps=python at=start
2016-06-16T20:08:59.174156+00:00 app[web.1]: buildpack=runit ps=node at=start
2016-06-16T20:09:04.490687+00:00 app[web.1]:  * Running on http://127.0.0.1:9000/ (Press CTRL+C to quit)
2016-06-16T20:09:04.515389+00:00 app[web.1]:  * Restarting with stat
2016-06-16T20:09:05.138990+00:00 heroku[web.1]: State changed from starting to up
2016-06-16T20:09:05.568687+00:00 app[web.1]:  * Debugger is active!
2016-06-16T20:09:05.593316+00:00 app[web.1]:  * Debugger pin code: 237-920-039
2016-06-16T20:09:06.730693+00:00 app[web.1]: Succeeded connected to: <MONGODB_URI> in port 35556

Here is what appears when running Foreman: 这是运行Foreman时出现的内容:

 $ foreman start -f Procfile.local 
14:59:30 node.1   | started with pid 21241
14:59:30 python.1 | started with pid 21242
14:59:31 python.1 |  * Running on http://127.0.0.1:9000/ (Press CTRL+C to quit)
14:59:31 python.1 |  * Restarting with stat
14:59:31 python.1 |  * Debugger is active!
14:59:31 python.1 |  * Debugger pin code: 215-168-436
14:59:31 node.1   | Succeeded connected to: mongodb://localhost/algdock in port 3000

I need an insight about why is not working when it's deployed or if there is some another better approach to this problem. 我需要了解为什么在部署它时还是无法解决问题,或者是否还有其他更好的方法可以解决此问题。

EDIT: using gunicorn for python it gives the Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch 编辑:使用gunicorn for python,它会给出Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

Procfile.web Procfile.web

web: node gui/web_app/AlGDock/bin/www
web: gunicorn --pythonpath gui/api --bind 127.0.0.1:9000 wsgi:app

wsgi.py wsgi.py

from REST import app
if __name__ == "__main__":
    app.run()

Heroku Logs: Heroku日志:

2016-06-17T00:35:25.808594+00:00 heroku[web.1]: Starting process with command `bin/runsvdir-dyno`
2016-06-17T00:35:26.398041+00:00 heroku[web.1]: Process exited with status 0
2016-06-17T00:35:28.003708+00:00 app[web.1]: buildpack=runit ps=web at=start
2016-06-17T00:35:28.376799+00:00 app[web.1]: [2016-06-17 00:35:28 +0000] [15] [INFO] Starting gunicorn 19.6.0
2016-06-17T00:35:28.377454+00:00 app[web.1]: [2016-06-17 00:35:28 +0000] [15] [INFO] Listening at: http://127.0.0.1:9000 (15)
2016-06-17T00:35:28.377583+00:00 app[web.1]: [2016-06-17 00:35:28 +0000] [15] [INFO] Using worker: sync
2016-06-17T00:35:28.385995+00:00 app[web.1]: [2016-06-17 00:35:28 +0000] [20] [INFO] Booting worker with pid: 20
2016-06-17T00:35:28.826322+00:00 app[web.1]: /app/target/
2016-06-17T00:35:28.826340+00:00 app[web.1]: /app/AlGDock/
2016-06-17T00:36:25.826633+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

You dont know the heroku server port used that's a problem. 您不知道使用的heroku服务器端口是一个问题。 It won't be 9000. You need to be able to get the heroku app port if it exists and take this in consideration or use a default port. 不会是9000。您需要能够获取heroku应用程序端口(如果存在)并将其考虑在内或使用默认端口。

Sorry for posting as an answer I missclicked... 抱歉,我错过了答案,将其发布为答案...

If you are running a web dyno then heroku needs to be able to connect to it within 60s or it assumes that it isn't working and shuts down the dyno. 如果您正在运行Web dyno,则heroku需要能够在60秒钟内连接到它,或者假设它无法正常工作并关闭dyno。 The port heroku uses isn't set so you need to grab the port from the dynos environment I had the same error when starting out as you have no control over what port heroku assigns. 没有设置heroku使用的端口,因此您需要从dynos环境中获取该端口,因为您无法控制heroku分配的端口,所以启动时我遇到了相同的错误。

The node + express version is app.set('port', (process.env.PORT)); 节点+快速版本为app.set('port', (process.env.PORT));

This question shows the how to grab this value when using flask Deploying Flask app to Heroku 此问题显示了在使用Flask Deploying Flask应用程序到Heroku时如何获取此值

Edit: Also from heroku python docs 编辑:同样从heroku python文档

port = int(os.environ.get("PORT", 5000)) app.run(host='0.0.0.0', port=port)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM