由于python2.x和python3.x所用的命令和配置有所区别,在本文中如果有不一致的地方将特别标明。
首先更新一下系统和软件:
apt-get update apt-get upgrade
安装pip
apt-get install pip #python2.x apt-get install pip3 #python3.x
(可选)如果是python3.x,为了方便这里统一一下pip命令,之后python3.x环境也可以直接执行pip命令
cd /usr/bin ln -s pip3 pip
安装virtualenv虚拟环境
pip install virtualenv
下面我们在/var/www目录下创建一个flask项目:
mkdir -p /var/www/myproj/ cd /var/www/myproj/ vim manage.py
项目内容很简单,就是一个典型的flask app
# /var/www/myproj/manage.py --- from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run(host='0.0.0.0')
下面我们要创建运行flask的虚拟环境。
首先创建一个虚拟环境:
cd /var/www/myproj/ virtualenv venv --no-site-packages # 需求虚拟环境使用的python版本和系统环境相同 virtualenv -p /usr/bin/python3 venv # 系统环境为python2.x, 虚拟环境为python3.x virtualenv -p /usr/bin/python2 venv # 系统环境为python3.x, 虚拟环境为python2.x
启动虚拟环境并安装flask:
cd /var/www/myproj/ . venv/bin/activate (venv)# pip install flask
测试一下能否正常运行:
python manage.py
不报错即为正常。
下面安装uwsgi和nginx。
apt-get install nginx uwsgi apt-get install uwsgi-plugin-python # python2.x apt-get install uwsgi-plugin-python3 # python3.x
创建一个socket用于链接nginx和uwsgi
cd /tmp/ touch myproj.sock chown www-data:www-data myproj.sock
配置uwsgi
创建uwsgi配置文件/etc/uwsgi/apps-available/myproj.ini
[uwsgi] vhost = true socket = /tmp/myproj.sock venv = /var/www/myproj/env chdir = /var/www/myproj module = manage # flask的启动脚本名称 callable = app # flask实例名称
如果flask的启动脚本为/var/www/myproj/run.py,flask的实例声明如下:
my_app = Flask(__name__)
则uwsgi配置文件中应做如下修改
module = run callable = my_app
使配置生效
ln -s /etc/uwsgi/apps-available/myproj.ini /etc/uwsgi/apps-enabled/myproj.ini service uwsgi restart
最后修改nginx配置文件/etc/nginx/sites-available/myproj
server { listen 80; server_tokens off; server_name www.myproj.com myproj.com; location / { include uwsgi_params; uwsgi_pass unix:/tmp/myproj.sock; } location /static { alias /var/www/myproj/static; } ## Only requests to our Host are allowed if ($host !~ ^(myproj.com|www.myproj.com)$ ) { return 444; } }
使nginx配置生效
ln -s /etc/nginx/sites-available/myproj /etc/nginx/sites-enabled/myproj service nginx restart
这样配置就结束了。最后是几个容易出现的问题:
- myproj.sock文件的所有者不是www-data。由于uwsgi的默认用户是www-data,所以.sock需要保持一致。
- 使用python3时未配置对应的插件和命令。uwsgi-plugin-python(3)这个脚本请安装对应版本。
- 更多问题参见nginx和uwsgi的log,都在/var/log/目录下
参考:
Running flask with virtualenv, uwsgi, and nginx
How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 14.04