端口

时间:2017-12-31 01:16:35

标签: python flask kibana flask-login

我在xx.xxx.xxx.xxx:5601上运行了Kibana(弹性搜索堆栈的一部分)。由于Kibana没有自己的身份验证,我试图将它包装在我的烧瓶登录设置下。换句话说,如果有人试图访问xx.xxx.xxx.xxx:5601,我需要将页面重定向到我的烧瓶登录页面。我可以在URL上使用@login_required装饰器来实现这一点......但我不知道如何设置烧瓶路径URL以处理端口5601,因为它需要以前导斜杠开头。

@app.route("/")
@login_required

有什么建议吗?

EDIT @senaps:App 1是烧瓶,运行在0.0.0.0,端口9500,App 2是node.js基于Kibana,我可以选择在localhost端口5601上运行然后通过nginx公开,或者我可以直接在IP上公开:5601。无论哪种方式,它都是作为"服务"在启动和随时收听5601。

问题陈述 - 应用2包含在App 1登录下。我不想使用nginx来验证App 2,而是使用App 1 flask登录设置。

我目前正在使用gunicorn来提供烧瓶应用程序并使用nginx反向代理设置来路由到烧瓶应用程序。随后的指南是digitalocean

选项1 - 在IP:5601上向公众公开的Node.js Kibana应用程序。

server {
listen 80;
server_name example.com;

location / {
    include proxy_params;
    proxy_pass http://unix:/home/ubuntu/myproject/myproject.sock;
}}

如果我访问IP,它会转到我的烧瓶应用程序,很棒。如果有人访问IP:5601,我无法弄清楚如何处理烧瓶视图网址。它应该重定向到我的烧瓶应用程序进行身份验证,而不是将它们带到Kibana。

我尝试添加另一个服务器块来监听5601和proxy_pass到烧瓶sock文件,我得到一个nginx错误,说它无法绑定到5601并要求我在5601杀死监听器。但我需要Kibana在5601运行在任何时候(除非我能找到通过python烧瓶启动此服务的方法)。

选项2 - Kibana应用程序在安装在" / kibana"的本地主机端口5601上运行。为了不与" /"烧瓶需要。然后通过nginx反向代理公开它。

server {
listen 80;
server_name example.com;

location / {
    include proxy_params;
    proxy_pass http://unix:/home/ubuntu/myproject/myproject.sock;
}
location /kibana/ {
    proxy_pass http://localhost:5601;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    rewrite /kibana/(.*)$ /$1 break;
}}

通过这种设置,可以通过IP / kibana访问Kibana。但是选项2的问题是如果我在我的烧瓶应用程序中有一个/ kibana视图来捕获它,它不会生效,因为重定向到Kibana发生在nginx,所以flask永远不会介入。

由于大多数解决方案都使用nginx来验证Kibana而不是任何其他python应用程序,因此我无法在堆栈等上找到更多信息。

鉴于此,我将如何为您的解决方案提供服务?非常感谢您对此进行调查。

2 个答案:

答案 0 :(得分:0)

一种方法是通过Flask应用程序代理到Kibana服务器的所有流量。您可以使用catch-all路由来处理不同路径的转发。您不允许从Flask应用程序以外的来源访问Kibana。

import requests  # may require `pip install requests`

kibana_server_baseurl = 'https://xxx.xxx.xxx.xxx:5601/'

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
@login_required
def proxy_kibana_requests(path):
    # ref http://flask.pocoo.org/snippets/118/
    url = kibana_server_baseurl + path
    req = requests.get(url, stream = True)
    return Response(stream_with_context(req.iter_content()), content_type = req.headers['content-type'])

另一个选择是使用Nginx作为反向代理并使用Nginx来处理身份验证。如果满足您的需求,最简单的方法是使用基本身份验证。 https://www.nginx.com/resources/admin-guide/restricting-access-auth-basic/

或者,您可以在访问Kibana应用程序时检查Nginx配置中的自定义标头,如果缺少,则重定向到Flask应用程序。

另一种选择是使用现有的Kibana身份验证代理。商业选择,Elastic x-pack是一种流行的选择。另一个OSS选项是https://github.com/fangli/kibana-authentication-proxy。我个人也没用过。

答案 1 :(得分:0)

所以你有两个独立的应用程序吗? 如果用户通过第一个应用程序进行身份验证,您希望第二个应用程序正常工作。

最简单的方法是,使用相同的db.this方式,flask登录将检查用户的基于相同数据库的身份验证。话虽如此,你可能无法处理会话完全没问题。

诀窍在uwsgi nad nginx。您应使用Emperor uwsgi模式,以便部署这两个应用。

@app.route("/")
@login_required
def function()

现在,问题可能是如果第一个应用也有这条路线,我们将如何获得第二个应用的/路线。好吧,这不会是一个问题,因为网址是不同的。但您需要nginx配置为将xx.x.x.x的请求转发给第一个应用,将x.x.x.x:y转发给第二个应用。

server {
    listen       80;
    server_name  example.org  www.example.org;
    root         /var/www/port80/
}

server {
    listen       5601;
    server_name  example.org  www.example.org;
    root         /var/www/port81/
}

因为您询问了有关如何操作的建议,所以我不会包含代码。所以你可以根据你的设置找出答案。或者您应该告诉我们您如何设置和提供这两个应用程序,以便我们提供更多代码。