Flask应用程序在反向代理后面运行时无法流式传输

问题描述

我已经实现了Display the contents of a log file as it is updated中提出的解决方案。

当我在localhost:8080上运行我的Flask应用程序时,此解决方案有效。意思是,当我运行waitress-serve --call 'server:create_app'flask run并在浏览器中导航到API端点时,日志文件将被传输。

当我尝试在Nginx反向代理后面的VM上的生产环境中运行此命令时,日志不会流式传输。显示的唯一文本是我在layout.html中定义的HTML标头。每当我CTRL + C Flask服务器时,最终日志中的10行就会显示在Web浏览器上。

以下是我的Nginx配置。值得注意的是我的应用程序不是从域根目录运行的。

nginx.conf:

    server {
        listen 80;
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl;
    

        location /githubapp/ {
          proxy_pass http://127.0.0.1:8080/$request_uri;
          proxy_redirect     off;

          proxy_set_header   Host                 $host;
          proxy_set_header   X-Real-IP            $remote_addr;
          proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
          proxy_set_header   X-Forwarded-Proto    $scheme;
          #  proxy_set_header   X-Forwarded-Prefix   /githubapp;
        }
   }

flaskr/__init__.py:

from flask import Flask
def create_app(config=os.environ.get('FLASK_ENV','default')):
    app = Flask(__name__,instance_relative_config=True)

    from . import routes
    app.register_blueprint(routes.bp,url_prefix='/githubapp')
    return app

flaskr/routes.py

@bp.route('/logs/progressive',methods=['GET'])
def realtime_log():
    return render_template('stream.html')
        
@bp.route('/logs/stream',methods=['GET'])
def stream():
    def generate():
        with sp.Popen(['tail','-F','celery.log'],stdout=sp.PIPE,stderr=sp.PIPE) as proc:
            while True:
                yield proc.stdout.readline()
            sleep(1)

    return app.response_class(generate(),mimetype='text/plain')

flaskr/templates/stream.html

{% extends "layout.html" %}
{% block content %}
<pre id="output"></pre>
<script>
    var output = document.getElementById('output');

    var xhr = new XMLHttpRequest();
    xhr.open('GET','{{ url_for('routes.stream') }}');
    xhr.send();

    setInterval(function() {
        output.textContent = xhr.responseText;
    },1000);
</script>
{% endblock %}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...