在Ubuntu上搭建基于NginxuWSGI的Flask应用

Posted yubo_725

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Ubuntu上搭建基于NginxuWSGI的Flask应用相关的知识,希望对你有一定的参考价值。

在Ubuntu上搭建基于nginx、uWSGI的Flask应用

安装virtualenv

如果还没有安装pip,可以使用如下方式安装pip:

sudo apt-get install python-pip

安装完pip后,使用pip安装virtualenv:

sudo pip install virtualenv

virtualenv是python的一个虚拟环境,可以很方便的隔离不同的python应用和python版本

安装nginx

如果你的机器上还没有安装nginx,使用下面的命令安装:

sudo apt-get install nginx

安装完毕后,使用下面的命令启动nginx:

sudo service nginx start

// sudo service nginx stop       // 停止nginx服务
// sudo service nginx restart    // 重启nginx服务

启动完毕后,在浏览器中输入服务器IP,出现nginx欢迎页,就表示nginx安装成功。

创建Flask应用

// 进入这个目录,如果目录不存在,使用sudo mkdir /var/www创建它
cd /var/www  

// 创建app目录,该目录作为flask应用的根目录
sudo mkdir app

// 修改上一步创建的目录的所有者和用户组
// 这一步是将app目录修改为ubuntu用户的ubuntu组所有
sudo chown -R ubuntu:ubuntu ./app

// 进入app目录
cd ./app

// 在app目录下创建python虚拟环境目录venv
virtualenv venv

// 激活虚拟环境(退出虚拟环境直接使用deactivate命令)
. venv/bin/activate 

// 安装flask框架
pip install flask

// 编写python代码
vim app.py

在app.py中加入测试代码:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello App1!"

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

测试Flask应用

直接在flask应用的根目录下执行

python app.py

如果不报错,在浏览器中输入服务器IP,出现Hello App1!字样,则表示Flask应用运行成功。

使用uWSGI托管Flask应用

在上一步中,使用ctrl+c停止flask的服务,然后使用下面的命令安装uwsgi:

sudo pip install uwsgi

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。

WSGI(Web Server Gateway Interface)是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。

要让uwsgi来接管flask应用,需要分两步来做:

修改nginx配置

首先删除nginx的默认配置:

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

然后到之前我们创建的flask应用的根目录下,创建一个新的nginx配置文件,操作如下:

vim nginx.conf

文件内容如下:

server 
    listen      80;
    server_name localhost;
    charset     utf-8;
    client_max_body_size 75M;

    location /  try_files $uri @yourapplication; 
    location @yourapplication 
        include uwsgi_params;
        uwsgi_pass unix:/var/www/app/uwsgi.sock;
    

上面的配置文件,可以完全复制粘贴,前提是你的flask应用路径与本篇一致(/var/www/app)

创建完新的nginx配置文件后,需要将该文件链接到nginx配置文件的文件夹中,使用如下命令:

// 这里要注意,一定要写绝对路径/var/www/app/nginx.conf而不能在/var/www/app目录下使用相对路径
sudo ln -s /var/www/app/nginx.conf /etc/ngixn/conf.d/

该命令创建了一个类似于windows中的快捷方式,重启nginx服务时,就会自动读取我们新建的nginx配置了,使用下面的命令重启nginx服务:

sudo service nginx restart

编辑uwsgi配置

在flask应用的根目录下,创建uwsgi的配置文件:

vim uwsgi.ini

文件内容如下:

[uwsgi]
# flask应用的路径
base = /var/www/app

# flask应用的执行文件名称(本篇中为app.py)
app = app
module = %(app)

home = %(base)/venv
pythonpath = %(base)

# socket文件,与上面创建的nginx配置文件中的路径对应
socket = /var/www/app/uwsgi.sock

#permissions for the socket file
chmod-socket = 666

#the variable that holds a flask application inside the module imported at line #6
callable = app

# 日志文件路径
logto = /var/log/uwsgi/%n.log

创建日志文件夹

sudo mkdir -p /var/log/uwsgi
sudo chown -R ubuntu:ubuntu /var/log/uwsgi

到这里uwsgi的配置就做完了,下面执行uwsgi,使用我们新创建的uwsgi配置:

uwsgi --ini uwsgi.ini

如果所有以上步骤都没有问题,这时候在浏览器中打开服务器IP,应该也能访问到flask应用了。
注意:
上面的步骤中,使用uwsgi --ini uwsgi.ini命令开启uwsgi服务,终端会阻塞,要让uwsgi服务以守护进程的形式运行,可以加上-d参数:

uwsgi -d --ini uwsgi.ini

要停止uwsgi服务,可以使用下面的命令:

sudo pkill -9 -f uwsgi

使用uWSGI托管多个Flask应用

上面的步骤记录了使用nginx、uWSGI托管一个Flask应用,如果有多个Flask应用需要托管呢?其实也不麻烦,笔者搜索了一下,网上有一种基于vhost的方式可以使用一个uWSGI配置文件托管多个Flask应用,本篇不是使用该方法,而是为每个应用都创建一个uWSGI文件。

假设你有一个域名yourdomain.com

添加两个子域名分别为

app1.yourdomain.com

app2.yourdomain.com

并将这两个子域名都解析到你的Flask应用所在的服务器IP,

假设在/var/www目录下,你已经创建了两个Flask应用,分别在./app-1目录和./app-2目录下,这时候为这两个Flask应用创建一个nginx配置文件即可,这个配置文件放在/var/www目录,文件名nginx.conf,内容如下:

server 
    listen      80;
    server_name app1.yourdomain.com;   // (1)
    charset     utf-8;
    client_max_body_size 75M;

    location /  try_files $uri @yourapplication; 
    location @yourapplication 
        include uwsgi_params;
        uwsgi_pass unix:/var/www/app-1/app1.sock;   //  (2)
    


server 
    listen      80;
    server_name app2.yourdomain.com;
    charset     utf-8;
    client_max_body_size 75M;

    location /  try_files $uri @yourapplication; 
    location @yourapplication 
        include uwsgi_params;
        uwsgi_pass unix:/var/www/app-2/app2.sock;
    

上面的配置文件中配置了两个server,需要注意的是server_name配置和location/uwsgi_pass配置,为你的Flask应用配置不同的域名,然后重新链接一下配置文件:

// 删除原来的链接
sudo rm /etc/nginx/conf.d/nginx.conf

// 创建新的链接
sudo ln -s /var/www/nginx.conf /etc/nginx/conf.d/

// 重启nginx服务,使用上面的新配置
sudo service nginx restart

针对app-1和app-2这两个不同的Flask应用,创建不同的uwsgi配置文件,其内容与上面步骤中给出的配置相同,改下base、socket、logto等配置的路径即可。

使用两个目录下的uwsgi配置启动uwsgi服务

uwsgi -d --ini ./app-1/uwsgi.ini ./app-2/uwsgi.ini

启动完成后,即可使用上面两个不同的域名去访问不同的Flask应用了。

参考

https://www.oschina.net/translate/serving-flask-with-nginx-on-ubuntu?comments&p=2

以上是关于在Ubuntu上搭建基于NginxuWSGI的Flask应用的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop完全分布式环境搭建——基于Ubuntu16.04设置免密登录

Linux(ubuntu)搭建基于nginx-http-flv-module的视频推拉流服务器

Ubuntu 16.04下搭建基于携程Apollo(阿波罗)配置中心单机模式

ubuntu搭建gerrit+gitweb代码审核系统

Docker 搭建Ubuntu 16.0.4(银河麒麟V10) 构建环境

[AI开发]centOS7.5上基于keras/tensorflow深度学习环境搭建