在 Debian 8.1 上部署 Flask + Nginx + uWSGI 环境

前几天手贱把自己的服务器又给干掉了……于是重新部署了一个新的。然后之前的博客用的是Github上的一个flask-blog。后来我自己照着别人的例子写了一个,正好这次部署上来。说实话,这次没少踩坑,甚至在有些配置和权限上直接卡了我大半天。不过好在我最后都解决了。

首先,nginx和uWSGI是运行在www-data这个用户组中的。为了防止权限出现问题,我们需要将网站所在目录的所有者改为www-data

接下来,出现了第一大天坑,uWSGI 运行的时候出现了 ImportError: no module named flask。十分诡异!因为直接运行的话是没问题的。

接下来查了查资料发现有人说 uWSGI 的配置中除了指定 virtualenv 的位置以外,还要指定库的 pythonpath.

然后将 pythonpath = venv路径/lib/python2.7/site-packages 添加到 uWSGI 的 ini 文件中后,出现了 ImportError: no module named functools。当时心想这是什么鬼,一查,发现有人说要将 lib-dynload 也要加入pythonpath。一试,不行。正当一筹莫展的时候,突然想到了个主意:将pythonpath全加进去。

于是在 virtualenv 中打开 python 终端,执行以下命令:

import sys
for l in sys.path:
print(l)

然后找到所有 python 库的目录全都加入 pythonpath 。于是成功!

不过接下来问题又出现了:www-data 用户没有权限访问数据库!

不过根据这篇文章的讲解,将www-data添加到数据库中并给予相应权限即可。

CREATE USER "www-data" WITH PASSWORD 'password';
GRANT CONNECT ON DATABASE dbname TO "www-data";

\c dbname

GRANT USAGE ON SCHEMA public TO "www-data";
GRANT SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA public TO "www-data";
GRANT SELECT, UPDATE ON ALL TABLES IN SCHEMA public TO "www-data";

于是问题解决!