使用uwsgi和Nginx部署flask应用

646 查看

最近打算使用python+flask搭建一个简单的个人网站,使用nginx+uwsgi部署,在此记录下部署过程。


  1. 环境
    ubuntu12.04, python2.7.3, virtualenv1.7.1.2, uwsgi2.0.8
  2. 准备
    安装virtualenv: 使用virtualenv创建一个独立的python开发环境具有很多好处,ubuntu12.04默认是没有安装的,因此先安装virtualenv: sudo apt-get install virtualenv。安装完成后运行virtualenv ~/demo在我的个人目录下面创建一个名为demo的虚拟环境。
    安装uwsgi: 直接使用ubuntu12.04软件包里的uwsgi版本太低,因此需要去uwsgi官网下载最新的版本安装,我的方式是按照文档说明直接使用make命令:

    wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
    tar zxvf uwsgi-latest.tar.gz
    cd uwsgi-lastest
    make

    运行uwsgi --version确认是否安装成功。

  3. 开发
    cddemo目录,使用source bin/active激活当前的虚拟环境,因为我们需要使用到flask,因此需要在当前环境中安装flask:pip install flask(注意:若未激活当前虚拟环境pip install会默认安装到全局的python环境中,导致permission denied错误) 现在就可以写一个最简单的flask应用了:
   from flask import Flask
   app = Flask(__name__)
   @app.route('/')
   def helloworld():
       return 'hello, world.'
   
  1. 部署
    现在使用uwsginginx把helloworld应用部署一下。
    先配置nginx,在nginx的conf.d目录下创建一个helloworld.conf文件,然后做如下配置

    server {
            listen 80;
            server_name 127.0.0.1;
            location /helloworld {
                    include uwsgi_params;
                    uwsgi_pass unix:/tmp/uwsgi.sock;
            }
    }

    保存,nginx reload以使上面的配置生效。
    使用uwsgi启动helloworld应用:uwsgi -s /tmp/uwsgi.sock --chmod-sock=666 -H /home/victor/demo --module helloworld -callable app, 执行后没有报任何异常即可。
    现在在浏览器里输入127.0.0.1/helloworld即可访问helloworld应用,浏览器将显示hello,world.
    (注意:由于是在虚拟环境中开发的这个应用,因此在使用uswgi启动引发用时需要使用-H /path/to/virtualenv设置使用当前虚拟环境变量,否则我们只在当前虚拟环境中安装的flask会无法import进来。或者,在运行之前先将当前虚拟环境加入到PYTHONPATH中,export PYTHONPATH=$PYTHONPATH:/home/victor/demo/lib/python2.7/site-packages)

  2. 参考资料
    flask快速上手
    使用uwsgi启动flask应用以及nginx配置
    uwsgi document