利用Dash+plotly+gunicorn+nginx创建交互式数据分析网站

    本文介绍Python环境下交互式数据分析网站的搭建过程,以利于读者查询及自己记忆。
    Python3+Dash+gunicorn+nginx可以满足生产环境要求也不失其便捷性。

这两天尝试了一下构建交互式数据分析网站,在实践的过程中发现互联网上这方面专门介绍的东西很少而且大多不太正确,所以在网站调通之际总结一下,以利于其他朋友在设置的时候走弯路也防止自己后面忘记了。
首先展示下做的网站demo的样子,后面一步一步介绍如何搭建。


image.png

构建这个网站首先需要构建Python3+Dash环境,为了方便管理建议使用虚拟环境进行代码开发。安装虚拟环境方法如下:

1) Python3安装

python3我采用的是Anaconda的3.7版本,系统环境是CentOS7,安装包路径:
https://www.anaconda.com/distribution/
大家根据自己系统的情况选择合适的安装包,建议这次安装将该版本设置成系统的python版本,从目前来看使用python3已经是一个必然的趋势,就没必要一定要坚持用python2了,当然有特殊限制的场景除外。

2) 安装virtualenv

首先pip安装virtualenv及virtualenvwrapper
pip install -y virtualenv virtualenvwrapper
一般需要设置国内的源进行安装,关于设置国内的源的方法这里就不做详细介绍了,大家可以自行在网上搜索。
在用户.bashrc中设置路径:

export PATH="/your_python_path/bin:$PATH"
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/your_python_path/bin/python
source /your_python_path/bin/virtualenvwrapper.sh

保存退出
source /your_python_path/bin/virtualenvwrapper.sh
创建虚拟环境
mkvirtualenv your_venv_name
workon 切换环境
deactivate 退出当前环境
lsvirtualenv 列出虚拟环境列表
其他命令:
lsvirtualenv cpvirtualenv cdsitepackages lssitepackages setvirtualenvproject setvirtualenvproject

3 安装Dash

首先切换到刚刚建好的虚拟环境:
workon your_venv_name
pip安装:
pip install dash会自动安装好依赖
安装好后创建项目文件夹,如果需要git配合需要首先git init初始化git环境,添加.gitignore文件,这里也不再赘述。在文件夹下创建dash文件app.py:

import os
import dash
import dash_core_components as dcc
import dash_html_components as html
import numpy

x = numpy.linspace(0, 2 * numpy.pi, 100)
y = 10 * 2 * numpy.cos(x)

app = dash.Dash(__name__)
server = app.server
app.layout = html.Div([
    html.H2('可视化数据分析_DASH'),
    dcc.Dropdown(
        id='dropdown',
        options=[{'label': i, 'value': i} for i in ['2017', '2018', '2019']],
        value='2018'
    ),
    html.Div(id='display-value'),
    dcc.Graph(
    id='curve',
    figure={
    'data': [
    {'x': x, 'y': y, 'type': 'Scatter', 'name': 'Testme'},
    ],
    'layout': {
    'title': 'Test Curve'
    } } )

])
@app.callback(dash.dependencies.Output('display-value', 'children'),
              [dash.dependencies.Input('dropdown', 'value')])
def display_value(value):
    return 'You have selected "{}"'.format(value)
if __name__ == '__main__':
    app.run_server(debug=True)

首先用python app.py启动测试首页是否有错误,运行后默认在localhost:8050可以打开网页,说明编写正确。

python app.py 
Running on http://127.0.0.1:8050/

4 安装gunicorn

我首先尝试直接用uwsgi来配置服务,遇到了很多坑,配置起来很麻烦。后来选择gunicorn。Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。
安装gunicorn pip install gunicorn
然后创建your_name.conf文件作为配置文件,典型的配置参见:

workers = 4
threads = 2
bind = '127.0.0.1:8050'
daemon = 'false'
worker_class = 'gevent'
worker_connections = 200
pidfile = '/var/run/gunicorn.pid'

assesslog = '/var/log/gunicorn_access.log'
errorlog = '/var/log/gunicorn_error.log'

loglevel = 'warning'

利用配置文件启动刚刚的网站:

#后台启动
nohup gunicorn -c gunicorn.conf app:server >> log.log 2>&1 &
前台启动
gunicorn -c gunicorn.conf app:server

这里会有一个警告,提示配置文件要用py文件,没做仔细研究应该是py文件可以配置更多的信息,后续在研究吧。
另外gunicorn会启动多个进程,提供一个简单的关闭gunicorn的脚本:
ps -ef|grep gunicorn|grep -v grep|cut -c 9-15|xargs kill -9

5 安装配置nginx

Nginx 是异步框架的网页服务器,也可以用作反向代理、负载平衡器和 HTTP 缓存。 Nginx 是免费的开源软件,根据类 BSD 许可证的条款发布。


image.png

安装nginx方法不详细介绍,本文只用yum方式安装。

 server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/dash_web;#这里设置你网站的跟路径

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                proxy_read_timeout 500;
                proxy_connect_timeout 500;
                proxy_pass http://127.0.0.1:8050;
                #include uwsgi_params;
                #uwsgi_pass unix:/usr/share/dash_web/start.sock;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
        }

    }

注意:proxy_pass应该和上面gunicorn设置的一致,外网访问需要开放防火墙对应的外网端口,本设置中为80.
nginx加入到开机启动,更改配置时用nginx -s reload

6 总结

经过上述5个步骤,一个满足生产要求的基于Dash的数据分析网站框架搭建完毕,后面大家就可以在此基础上进行相应的开发工作。
希望上述介绍可以帮助到各位。

你可能感兴趣的:(利用Dash+plotly+gunicorn+nginx创建交互式数据分析网站)