我有一个嵌入在烧瓶和gunicorn中的散景应用程序(请参阅blask_gunicorn_embed.py(。当我通过Web服务器的IP地址访问所有内容时,这可以正常工作,但是当通过NGINX代理所有内容时。它将从烧瓶加载所有东西,但不能从散烧点(autoload.js
(加载。
示例:
我用
开始烧瓶gunicorn --workers 9 --bind 0.0.0.0:5000 --timeout 120 --log-file /some/directory/to/gunicorn/logs/gunicorn.log -m 0700 flask:app
我现在可以访问从烧瓶到 http://xxx.xxx.xxx.xxx:5000 的所有内容。我已经改编了 flask_gunicorn_embed.py ,最重要的位是
script = server_document('http://xxx.xxx.xxx.xxx:%d/bkapp' % port, resources=None)
sockets, port = bind_sockets("0.0.0.0", 0)
bokeh_tornado = BokehTornado({'/bkapp': bkapp}, extra_websocket_origins=["xxx.xxx.xxx.xxx:5000"])
如果我现在访问使用此散景服务器的页面,一切正常。它加载
http://xxx.xxx.xxx.xxx:XXXXX/bkapp/autoload.js?bokeh-autoload-element=1001&bokeh-app-path=/bkapp&bokeh-absolute-url=http://xxx.xxx.xxx.xxx:XXXXX/bkapp&resources=none
并显示图形,并为回调创建Web插座。
这是没有 nginx作为反向代理。我不想使用Web服务器的IP地址,因为我需要使用https,这需要一个域。
因此,我具有以下NGINX配置:
server {
listen 80;
server_name example.com;
return 301 https://$server_name/;
}
server {
listen 443;
server_name example.com;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
client_max_body_size 50M;
location / {
include proxy_params;
proxy_pass http://127.0.0.1:5000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host:$server_port;
proxy_buffering off;
}
location /static {
alias /some/directory/to/flask/static;
}
}
我用
开始枪瓶gunicorn --workers 9 --bind 127.0.0.1:5000 --timeout 120 --log-file /some/directory/to/gunicorn/logs/gunicorn.log -m 0700 flask:app
我现在可以访问从烧瓶到https://example.com的所有内容。 flask_gunicorn_embed.py 现在看起来像
script = server_document('https://example.com:%d/bkapp' % port, resources=None)
sockets, port = bind_sockets("0.0.0.0", 0)
bokeh_tornado = BokehTornado({'/bkapp': bkapp}, extra_websocket_origins=["example.com"])
但是,通过Bokeh的server_document
https://example.com:XXXXX/bkapp/autoload.js?bokeh-autoload-element=1001&bokeh-app-path=/bkapp&bokeh-absolute-url=https://example.com:XXXXX/bkapp&resources=none
导致A 连接时间 或A 连接拒绝,因此没有加载脚本。
如何使其连接并加载脚本?
它必须与nginx有关,因为如果我通过IP地址请求该文件仍然有效(由于bind_sockets("0.0.0.0", 0)
(。但是我无法弄清楚是什么原因引起了这个问题。
编辑:
它使用HTTPS似乎是一个问题。我的NGINX配置与散景文档中给出的配置相同。文档说使用--use_xheaders
,这是不可能的,因为我不使用bokeh serve
。
我确实有
conf = {'use_xheaders': True}
bokeh_tornado = BokehTornado({'/bkapp': bkapp}, extra_websocket_origins=["example.com"], **conf)
bokeh_http = HTTPServer(bokeh_tornado, xheaders=True)
,但它仍然不会为https页面加载脚本。
http://example_no_https.com将通过端口和https://example.com加载页面。
use_xheaders
是bokeh Server
类的参数(将其传递给龙卷风HTTPServer
(,而不是由 BokehTornado
。如果您不使用Server
,因为您正在协调BokehTornado
和HTTPServer
,那么您将在HTTP服务器上手动配置此选项,因为您没有Server
类为您使用:
http_server_kwargs.setdefault('xheaders', opts.use_xheaders)
HTTPServer(..., **http_server_kwargs)