在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(阿波罗)配置中心单机模式