本文介紹Python環(huán)境下交互式數(shù)據(jù)分析網(wǎng)站的搭建過程,以利于讀者查詢及自己記憶。
Python3+Dash+gunicorn+nginx可以滿足生產(chǎn)環(huán)境要求也不失其便捷性。
這兩天嘗試了一下構(gòu)建交互式數(shù)據(jù)分析網(wǎng)站,在實踐的過程中發(fā)現(xiàn)互聯(lián)網(wǎng)上這方面專門介紹的東西很少而且大多不太正確,所以在網(wǎng)站調(diào)通之際總結(jié)一下,以利于其他朋友在設置的時候走彎路也防止自己后面忘記了。
首先展示下做的網(wǎng)站demo的樣子,后面一步一步介紹如何搭建。

構(gòu)建這個網(wǎng)站首先需要構(gòu)建Python3+Dash環(huán)境,為了方便管理建議使用虛擬環(huán)境進行代碼開發(fā)。安裝虛擬環(huán)境方法如下:
1) Python3安裝
python3我采用的是Anaconda的3.7版本,系統(tǒng)環(huán)境是CentOS7,安裝包路徑:
https://www.anaconda.com/distribution/
大家根據(jù)自己系統(tǒng)的情況選擇合適的安裝包,建議這次安裝將該版本設置成系統(tǒng)的python版本,從目前來看使用python3已經(jīng)是一個必然的趨勢,就沒必要一定要堅持用python2了,當然有特殊限制的場景除外。
2) 安裝virtualenv
首先pip安裝virtualenv及virtualenvwrapper
pip install -y virtualenv virtualenvwrapper
一般需要設置國內(nèi)的源進行安裝,關于設置國內(nèi)的源的方法這里就不做詳細介紹了,大家可以自行在網(wǎng)上搜索。
在用戶.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
創(chuàng)建虛擬環(huán)境
mkvirtualenv your_venv_name
workon 切換環(huán)境
deactivate 退出當前環(huán)境
lsvirtualenv 列出虛擬環(huán)境列表
其他命令:
lsvirtualenv cpvirtualenv cdsitepackages lssitepackages setvirtualenvproject setvirtualenvproject
3 安裝Dash
首先切換到剛剛建好的虛擬環(huán)境:
workon your_venv_name
pip安裝:
pip install dash會自動安裝好依賴
安裝好后創(chuàng)建項目文件夾,如果需要git配合需要首先git init初始化git環(huán)境,添加.gitignore文件,這里也不再贅述。在文件夾下創(chuàng)建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('可視化數(shù)據(jù)分析_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可以打開網(wǎng)頁,說明編寫正確。
python app.py
Running on http://127.0.0.1:8050/
4 安裝gunicorn
我首先嘗試直接用uwsgi來配置服務,遇到了很多坑,配置起來很麻煩。后來選擇gunicorn。Gunicorn是一個unix上被廣泛使用的高性能的Python WSGI UNIX HTTP Server。和大多數(shù)的web框架兼容,并具有實現(xiàn)簡單,輕量級,高性能等特點。
安裝gunicorn pip install gunicorn
然后創(chuàng)建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'
利用配置文件啟動剛剛的網(wǎng)站:
#后臺啟動
nohup gunicorn -c gunicorn.conf app:server >> log.log 2>&1 &
前臺啟動
gunicorn -c gunicorn.conf app:server
這里會有一個警告,提示配置文件要用py文件,沒做仔細研究應該是py文件可以配置更多的信息,后續(xù)在研究吧。
另外gunicorn會啟動多個進程,提供一個簡單的關閉gunicorn的腳本:
ps -ef|grep gunicorn|grep -v grep|cut -c 9-15|xargs kill -9
5 安裝配置nginx
Nginx 是異步框架的網(wǎng)頁服務器,也可以用作反向代理、負載平衡器和 HTTP 緩存。 Nginx 是免費的開源軟件,根據(jù)類 BSD 許可證的條款發(fā)布。

安裝nginx方法不詳細介紹,本文只用yum方式安裝。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/dash_web;#這里設置你網(wǎng)站的跟路徑
# 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設置的一致,外網(wǎng)訪問需要開放防火墻對應的外網(wǎng)端口,本設置中為80.
nginx加入到開機啟動,更改配置時用nginx -s reload。
6 總結(jié)
經(jīng)過上述5個步驟,一個滿足生產(chǎn)要求的基于Dash的數(shù)據(jù)分析網(wǎng)站框架搭建完畢,后面大家就可以在此基礎上進行相應的開發(fā)工作。
希望上述介紹可以幫助到各位。