使用Nginx作为反向代理设置Apache Superset

6

我遇到了设置Apache Superset与Nginx作为反向代理的问题(这可能是Nginx配置错误)。

服务器配置块(如果我漏掉了什么,请告诉我,我会添加它):

server {
    listen 80 default_server;
    server_name _;
    root /var/www/data;
    error_log   /var/www/bokehapps/log/nginx.error.log info;
    location /static {
        alias /usr/lib/python2.7/site-packages/bokeh/server/static;
    }

 
    location /superset {
        proxy_pass http://0.0.0.0:8088;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;
        send_timeout 600;
    }
}

我可以使用curl命令访问0.0.0.0:8088并获得重定向页面,我的请求已经传递到werkzeug。但是在浏览器中,所有内容都是404错误。

1
不要使用 0.0.0.0,而是在 nginx 的 proxy_pass 和浏览器中使用 127.0.0.1 - Tarun Lalwani
1个回答

5

由于您正在使用预设位置(/superset)进行服务,即使您代理到/,werkzeug也会尝试提供/superset路由,但该路由不存在,因此返回404错误。

您需要定义一个前缀中间件,在这个线程中可以找到非常好的解释:Add a prefix to all Flask routes

该中间件应作为superset-config.py的一部分传递给Superset/FAB,相关文档

结合以上两点,您可能会在superset-config.py中得到以下内容:

class PrefixMiddleware(object):

def __init__(self, app, prefix='superset'):
    self.app = app
    self.prefix = prefix

def __call__(self, environ, start_response):

    if environ['PATH_INFO'].startswith(self.prefix):
        environ['PATH_INFO'] = environ['PATH_INFO'][len(self.prefix):]
        environ['SCRIPT_NAME'] = self.prefix
        return self.app(environ, start_response)
    else:
        start_response('404', [('Content-Type', 'text/plain')])
        return ["This url does not belong to the app.".encode()]
    
ADDITIONAL_MIDDLEWARE = [PrefixMiddleware, ]

谢谢您的回复,我正在尝试您的解决方案,但是我不知道在哪里放置superset-config.py文件。非常感谢您能给予指导。 - mapping dom
@mappingdom 我已经将它放在你运行 superset runserver 命令的相同目录中,应该会被识别。 - Drazen Urch
1
这是一个很好的解决方案,但会破坏大部分静态内容,因为浏览器会使用“/static”前缀而不是“/superset/static”来请求它们。 - ramdesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接