首页 Flask + uWSGI + Nginx部署
文章
取消

Flask + uWSGI + Nginx部署

由于自己的项目需要,写了一个基于flask_restful框架的后台应用,但是部署的时候遇到了很多坑,再次记录一下.

配置

  • 服务器: 1核1G基础服务器
  • 操作系统: UBuntu16.04LTS
  • 部署框架: Nginx, uWSGI
  • python: python3.6

好吧,让我们开始吧,首先如果是一台全新的服务器,需要安装 Python的环境,一个是 Python 的虚拟环境virtualenv,一个是python下的安装工具easy_install,顺便由于自己使用的是 mac系统,强烈推荐一个好用的ssh连接应用shuttle:传送门

安装需要工具与环境

安装pip

1
sudo apt-get install pip

安装VirtualEnv

1
sudo pip install virtualenv

安装 Nginx

1
sudo apt-get install nginx

剩下的还有uWSGI没有安装,这个最好在虚拟环境下安装,但是由于uWSGI十个一基于C语言的框架,还需要安装他的依赖包

1
2
3
4
5
# 因为我使用的是 Python3 所以这里安装的是 Python3 的依赖包
sudo apt-get install build-essential python3-dev

# 如果报错可以试着安装这个
sudo apt-get install build-essential python-dev

安装完uWSGI的依赖包以后,创建虚拟环境

1
2
3
4
5
virtualenv venv #创建虚拟环境
source venv/bin/activate  #激活虚拟环境

# 安装自己项目所需要的依赖包,比如
# (venv)pip3 install -r requirements.txt

安装完uWSGI

1
(venv)pip install uwsgi

环境配置

部署项目需要项目文件,这里以flask最简单的7行示例代码来完成部署,首先,使用ssh连接服务器,使用命令创建一个项目,并打开:

1
2
3
4
5
6
    mkdir my_flask_app
    cd my_flask_app
    touch hello.py
    touch run.py
    touch helloflask_nginx.conf  #nginx 配置文件
    touch helloflask_uwsgi.ini   #uwsgi 配置文件

hello.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', port=5001)

run.py文件内容如下:

    from hello import app

    if __name__ == '__main__' :
            app.run(host='0.0.0.0',port=5001)

helloflask_nginx.conf文件内容如下:

    server {
        listen 80;             
        server_name xxx.xxx.xx.xxx;  

        location / {
            include uwsgi_params;   #uwsgi 需要参数,不需要改动
            uwsgi_pass 127.0.0.1:3031;   
        }
    }

参数意义:

  • listen: 监听端口 80(默认)
  • server_name: 部署服务器ip地址,或者域名
  • uwsgi_pass : Nginx 与 uwsgi本地通讯地址

helloflask_uwsgi.ini文件内容如下:


    [uwsgi]
    master = true
    home = /home/ubuntu/my_flask_app/venv    
    chdir = /home/ubuntu/my_flask_app        
    wsgi-file = run.py       
    callable = app        
    socket = 127.0.0.1:3031      
    processes = 4         
    threads = 2      
    buffer-size = 32768       
    stats = 127.0.0.1:9091      

参数意义:

  • home: 虚拟环境路径
  • chdir: 项目文件路径
  • wsgi-file: 项目启动文件
  • callable: 项目启动实例,这个项目就是app = Flask(__name__)里面的这个app
  • socket: Nginx 与 uwsgi本地通讯地址
  • processes:进程数
  • buffer-size:缓存大小
  • stats:状态检测地址

helloflask_nginx.conf文件中需要重点介绍的是uwsgi_pass,也是配置成功的重点,这个是地方的地址,需要与helloflask_uwsgi.ini文件中的socket地址保持一致,这个是他们之间用于通信的端口地址,当然有的教程里面会把这个配置我一个.sock文件的样子,这个也是可以的,但我个人还是比较倾向于上面的端口配置。

当一个请求从 app发起后,首先它会通过80端口到达nginx,然后nginx通过设置的本地端口将请求转发给uwsgi,最后由uwsgi分发给应用服务器完成请求的处理,实现一个完成的请求流程。

启动配置

首先,删除nginx的默认配置文件:具体参数可以查看官方文档,本文仅提供最简单的配置:传送门

1
sudo rm /etc/nginx/sites-enabled/default

使用软连接将项目配置文件连接到nginx的工作目录中

1
sudo ln -s /home/my_flask_app/helloflask_nginx.conf /etc/nginx/conf.d/

重启 Nginx:

1
sudo /etc/init.d/nginx restart

如果这个时候您刷新自己服务器,浏览器应该会报一个502的错误,这说明nginx已经启动成功,最后让我们来启动uwsgi,运行命令:

1
uwsgi --ini helloflask_uwsgi.ini &    #  & 后台运行

如果一切顺利,再次刷新,应该可以看到一切的起源Hello World!,到此,项目部署完成!恭喜你!

但是,如果需要更加稳定,还需要使用Supervisor来监听程序,当它发现uwsgi或者 Nginx挂了会自动将其重启,所以….让我们继续吧。

安装Supervisor

1
sudo apt-get install supervisor

一般情况,Supervisor 的全局的配置文件位置在:

1
/etc/supervisor/supervisor.conf

但我们不需要去对其作出改动,添加一个新的配置文件*.conf在该目录:(该项目文件名为:my_flask_supervisor.conf)

1
/etc/supervisor/conf.d/

my_flask_supervisor.conf文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
    [program:my_flask]
    # 启动命令入口
    command=/home/ubuntu/my_flask_app/helloflask_uwsgi.ini

    # 命令程序所在目录
    directory=/home/ubuntu/my_flask_app
    #运行命令的用户名
    user=root
      
    autostart=true
    autorestart=true
    #日志地址
    stdout_logfile=/home/ubuntu/my_flask_app/logs/uwsgi_supervisor.log     

启动服务

1
2
$ sudo service supervisor start
#  $ sudo service supervisor stop  停止服务命令

完成,收工!

本文由作者按照 CC BY 4.0 进行授权