使用uwsgi运行flask

由于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

 

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注