Mephisto

个人站

欢迎来到我的个人站~


Flask + uWSGI + Nginx部署

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

配置:

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

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

安装需要工具与环境

安装pip

sudo apt-get install pip

安装VirtualEnv

sudo pip install virtualenv

安装 Nginx

sudo apt-get install nginx

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

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

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

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

virtualenv venv #创建虚拟环境
source venv/bin/activate  #激活虚拟环境

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

安装完uWSGI

(venv)pip install uwsgi

环境配置

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

$ 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的默认配置文件:具体参数可以查看官方文档,本文仅提供最简单的配置:传送门

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

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

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

重启 Nginx:

$ sudo /etc/init.d/nginx restart

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

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

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

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

安装Supervisor

$ sudo apt-get install supervisor

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

/etc/supervisor/supervisor.conf

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

/etc/supervisor/conf.d/

my_flask_supervisor.conf文件内容如下:

[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		   

启动服务

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

完成,收工!

最近的文章

Markdown: 语法(转载)

Markdown: 语法 概述 宗旨 兼容 HTML 特殊字符自动转换 区块元素 段落和换行 标题 区块引用 列表 代码区块 分隔线 区段元素 链接 强调 代码 图片 其它 自动链接 反斜杠 ####注意####1.这份文件是用 Markdown 写的,你可...…

Markdown继续阅读
更早的文章

Python中 os模块相关函数的使用方法介绍

前几天自己写脚本程序的时候有用到了相关知识,但是网上的都不太全面,故此收集整理下…

python继续阅读