我在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应用程序,因此我无法在堆栈等上找到更多信息。
鉴于此,我将如何为您的解决方案提供服务?非常感谢您对此进行调查。
答案 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/
}
因为您询问了有关如何操作的建议,所以我不会包含代码。所以你可以根据你的设置找出答案。或者您应该告诉我们您如何设置和提供这两个应用程序,以便我们提供更多代码。