nginx+uwsgi阿里云ubuntu服务器上简单部署flask RESTful风格项目

ubuntu16.04上利用Nginx代理uwsgi处理Flask web应用

1、环境要求

  ubuntu16.04 ---- 阿里云的服务器

  Nginx

  python2

  uwsgi

2、简单介绍Nginx

  nginx是一个高性能的http和反向代理的服务器,Nginx采采用的epoll的机制,而没有使用select和poll,虽然,在用户活跃数量比较高的时候,epoll性能不如select,但是,我们用Nginx来作为web服务器还是很不错的。nginx是一个轻量级的web服务器,他占用内存少,并发能力强,非常适合作为静态资源的服务器使用。

  apt-get安装nginx:

    

    sudo apt-get update
    sudo apt-get install software-properties-common
    sudo add-apt-repository ppa:nginx/stable
    sudo apt-get update
    sudo apt-get install nginx

   安装完成后,打开浏览器访问你的服务器,如果看到了nginx的欢迎页,说明你安装成功了,如果没有看到欢迎页,也不用着急,先检查自己的阿里云服务器的安全组规则中是否允许了80端口,如果没有,直接添加安全组规则。

  添加安全组规则方法链接:https://jingyan.baidu.com/article/fea4511a2e387cf7bb912532.html

3、简单介绍uWsgi

  uwsgi是一个web服务器,它实现了wsgi、uwsgi、http等协议。

  uwsgi可以理解为Nginx和flask项目之间的桥梁,当nginx发现用户请求的不是static文件时,他就请求uwsgi,uwsgi又将请求抛给了flask,flask找到相应的api然后返回。

  安装uwsgi:pip install uwsgi

  让我们从一个简单的”Hello World”开始:

  def application(env, start_response):
      start_response('200 OK', [('Content-Type','text/html')])
      return [b"Hello World"]

  (将其保存为 foobar.py)。

  正如你所见,它由一个简单的Python函数组成。之所以称之为 “application”,是因为它是uWSGI Python加载器将会搜索的默认函数 (但你显然可以自定义)。

  将其部署在http端口9090,如果是阿里云服务器需要注意,添加9090端口到安全组

  现在,启动uWSGI来运行一个HTTP服务器/路由器,它会传递请求到你的WSGI应用:

  uwsgi --http :9090 --wsgi-file foobar.py

4、线上调式flask项目

  确保项目所需文件都安装完成,使用flask自带的web应用服务器Werkzeug运行项目

  如果项目运行失败,请自行检查问题所在

  注意:添加端口到安全组

5、配置uwsgi

  确定nginx,uwsgi都安装正常,同时flask也能正常运行。

[uwsgi]
socket = 127.0.0.1:8080    #配置nginx
chdir = /home/python/app    #配置项目目录
module = manage   #加载指定的python WSGI模块(模块路径必须在PYTHONPATH里)
wsgi-file = manage.py   #配置入口模块
master = True   #开启master
callable = app   #设置在收到请求时,uWSGI加载的模块中哪个变量将被调用,默认是名字为“application”的变量
processes = 1   #配置进程数
threads = 1   #配置线程数
vacuum = true   #推出是清空变量环境
daemonize = wsgi.log   #配置守护进程
pidfile=uwsgi.pid   #进程pid

6、配置nginx

  如果按照我的方法,用apt安装的话,配置文件应该在/etc/nginx/sites-enabled/目录下有个defalut文件,我们就直接修改这个文件,当然 ,在修改前最好先备份一下。

  a、首先将下面的代码注释掉

     #location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                #try_files $uri $uri/ =404;
        #}

  b、添加一下代码(注意:一定要确保自己的项目目录下存在logs/access.log和logs/error.log两个文件夹,不然nginx将会报错)

    location /api  将符合/api的请求转给uwsgi处理

    location /   指定静态文件处理时的目录 (注意:用alias的话,路径的末尾一定要加/,不然会找不到报forbidden错误)

     access_log  /home/python/app/logs/access.log;
        error_log  /home/python/app/logs/error.log;
        location /api {
            include        uwsgi_params;
            uwsgi_pass     127.0.0.1:8080;
        }
        location /{
            alias /home/python/app/www/static/html/;
        }