阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

在 Ubuntu 上使用 Nginx 部署 Flask 应用

490次阅读
没有评论

共计 7838 个字符,预计需要花费 20 分钟才能阅读完成。

我职业生涯的大部分都在使用微软的架构,最近我决定走出技术的舒适区,步入开源软件世界。我现在日常工作的项目是一个 RESTful 服务,这个服务需要在主流硬件上运行,且能够按照需要进行水平拓展。为完成这项工作我决定使用 Flask 和 Nginx。Flask 是一个轻量级的 Python Web 框架,Nginx 是一个非常稳定的 Web 服务器,它们在廉价硬件平台上工作良好。

在这篇文章中我将指导你完成使用 Nginx 服务器托管 Flask 应用的安装、配置过程。我所使用的操作系统是 Ubuntu 13.04。

前提条件

在我们开始安装 Nginx 及其他所需软件之前先安装一些前提软件。首先,我们需要 PIP 与 virtualenv:

sudo apt-get install python-setuptools
sudo easy_install pip
sudo pip install virtualenv

使用 apt-get 安装 Nginx 的话,我们需要添加 Nginx 库到 apt-get source 中:

sudo add-apt-repository ppa:nginx/stable

注意:如果“add-apt-repository”命令在你的 Ubuntu 版本中不存在的话,你需要安装“software-properties-common”包,使用命令:sudo apt-get software-properties-common(感谢 get_with_it 在评论中提到)

升级已有的包,确保系统上有 uWSGI 所需的编译器和工具:

sudo apt-get update && sudo apt-get upgrade

sudo apt-get install build-essential python python-dev

Nginx

安装并运行 Nginx:

sudo apt-get install nginx
sudo /etc/init.d/nginx start

Nginx 是一个提供静态文件访问的 web 服务,然而,它不能直接执行托管 Python 应用程序,而 uWSGI 解决了这个问题。让我们先安装 uWSGI,稍候再配置 Nginx 和 uWSGI 之间的交互。

sudo pip install uwsgi

里程碑 #1

打开浏览器访问你的服务器,你应该能看到 Nginx 欢迎页:

在 Ubuntu 上使用 Nginx 部署 Flask 应用

 

示例应用

我们将托管的应用是经典的“Hello, world!”。这个应用只有一个页面,已经猜到页面上将有什么内容了吧。将所有应用相关的文件存放在 /var/www/demoapp 文件夹中。下面创建这个文件夹并在其中初始化一个虚拟环境:

sudo mkdir /var/www
sudo mkdir /var/www/demoapp

由于我们使用 root 权限创建了这个文件夹,它目前归 root 用户所有,让我们更改它的所有权给你登录的用户(我的例子中是 ubuntu)

sudo chown -R ubuntu:ubuntu /var/www/demoapp/

创建并激活一个虚拟环境,在其中安装 Flask:

cd /var/www/demoapp
virtualenv venv
. venv/bin/activate
pip install flask

使用下面的代码创建 hello.py 文件:

from flask import Flask
app = Flask(__name__)
 
@app.route(“/”)
def hello():
    return “Hello World!”
 
if __name__ == “__main__”:
    app.run(host=’0.0.0.0′, port=8080)

里程碑 #2

让我们执行我们刚创建的脚本:

python hello.py

现在你可以通过浏览器访问你服务器的 8080 端口,看,应用生效了:

在 Ubuntu 上使用 Nginx 部署 Flask 应用

注意:因为 80 端口已被 Nginx 使用,这里我使用 8080 端口。

现在应用是由 Flask 内置的 web 服务托管的,对于开发和调试这确实是个不错的工具,但不推荐在生产环境中使用。让我们配置 Nginx 来挑起这个重担吧。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2015-09/123597p2.htm

Ubuntu Server 14.04.2 LTS 配置 Nginx + Uwsgi + Django  http://www.linuxidc.com/Linux/2015-04/116397.htm

Ubuntu 12.04 下部署 Nginx+uWSGI+Flask http://www.linuxidc.com/Linux/2014-01/96007.htm

你应该使用 Nginx + uWSGI http://www.linuxidc.com/Linux/2013-07/87286.htm

uWSGI + Nginx 部署 Flask Web 应用 http://www.linuxidc.com/Linux/2013-06/85828.htm

Django+Nginx+uWSGI 部署 http://www.linuxidc.com/Linux/2013-02/79862.htm

Linux 下 Nginx+uWSGI 部署 Python 应用 http://www.linuxidc.com/Linux/2012-10/72443.htm

Ubuntu Server 12.04 安装 Nginx+uWSGI+Django 环境 http://www.linuxidc.com/Linux/2012-05/60639.htm

CentOS 5.5 + Nginx 0.8.50 + uWSGI + Django 1.2.3 部署 Django 项目 http://www.linuxidc.com/Linux/2011-05/36399.htm

配置 Nginx

首先删除掉 Nginx 的默认配置文件:

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

注意:如果你安装了其他版本的 Nginx,默认配置文件可能在 /etc/nginx/conf.d 文件夹下。

创建一个我们应用使用的新配置文件 /var/www/demoapp/demoapp_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/demoapp/demoapp_uwsgi.sock;
    }
}

将刚建立的配置文件使用符号链接到 Nginx 配置文件文件夹中,重启 Nginx:

sudo ln -s /var/www/demoapp/demoapp_nginx.conf /etc/nginx/conf.d/
sudo /etc/init.d/nginx restart

里程碑 #3

访问服务器的公共 ip 地址,你会看到一个错误:

在 Ubuntu 上使用 Nginx 部署 Flask 应用

别担心,这个错误是正常的,它代表 Nginx 已经使用了我们新创建的配置文件,但在链接到我们的 Python 应用网关 uWSGI 时遇到了问题。到 uWSGI 的链接在 Nginx 配置文件的第 10 行定义:

uwsgi_pass unix:/var/www/demoapp/demoapp_uwsgi.sock;

这代表 Nginx 和 uWSGI 之间的链接是通过一个 socket 文件,这个文件位于/var/www/demoapp/demoapp_uwsgi.sock。因为我们还没有配置 uWSGI,所以这个文件还不存在,因此 Nginx 返回“bad gateway”错误,让我们马上修正它吧。

配置 uWSGI

创建一个新的 uWSGI 配置文件/var/www/demoapp/demoapp_uwsgi.ini

[uwsgi]
#application’s base folder
base = /var/www/demoapp
 
#python module to import
app = hello
module = %(app)
 
home = %(base)/venv
pythonpath = %(base)
 
#socket file’s location
socket = /var/www/demoapp/%n.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
 
#location of log files
logto = /var/log/uwsgi/%n.log

创建一个新文件夹存放 uWSGI 日志,更改文件夹的所有权:

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

里程碑 #4

执行 uWSGI,用新创建的配置文件作为参数:

uwsgi –ini /var/www/demoapp/demoapp_uwsgi.ini

接下来访问你的服务器,现在 Nginx 可以连接到 uWSGI 进程了:

在 Ubuntu 上使用 Nginx 部署 Flask 应用

我们现在基本完成了,唯一剩下的事情是配置 uWSGI 在后台运行,这是 uWSGI Emperor 的职责。

uWSGI Emperor

uWSGI Emperor (很拉风的名字,是不?) 负责读取配置文件并且生成 uWSGI 进程来执行它们。创建一个初始配置来运行 emperor – /etc/init/uwsgi.conf

description “uWSGI”
start on runlevel [2345]
stop on runlevel [06]
respawn
 
env UWSGI=/usr/local/bin/uwsgi
env LOGTO=/var/log/uwsgi/emperor.log
 
exec $UWSGI –master –emperor /etc/uwsgi/vassals –die-on-term –uid www-data –gid www-data –logto $LOGTO

最后一行运行 uWSGI 守护进程并让它到 /etc/uwsgi/vassals 文件夹查找配置文件。创建这个文件夹,在其中建立一个到链到我们刚创建配置文件的符号链接。

sudo mkdir /etc/uwsgi && sudo mkdir /etc/uwsgi/vassals

sudo ln -s /var/www/demoapp/demoapp_uwsgi.ini /etc/uwsgi/vassals

同时,最后一行说明用来运行守护进程的用户是 www-data。为简单起见,将这个用户设置成应用和日志文件夹的所有者。

sudo chown -R www-data:www-data /var/www/demoapp/

sudo chown -R www-data:www-data /var/log/uwsgi/

注意:我们先前安装的 Nginx 版本使用“www-data”这个用户来运行 Nginx,其他 Nginx 版本的可能使用“Nginx”这个替代用户。

由于 Nginx 和 uWSGI 都由同一个用户运行,我们可以在 uWSGI 配置中添加一个安全提升项。打开 uWSGI 配置文件,将 chmod-socket 值由 666 更改为 644:

#permissions for the socket file

chmod-socket    = 644

现在我们可以运行 uWSGI 了:

sudo start uwsgi

最后,Nginx 和 uWSGI 被配置成启动后立即对外提供我们的应用服务。

问题解决

如果出现错误的话,第一个检查的地方是日志文件。Nginx 默认将错误信息写到 /var/log/nginx/errors.log 文件。

我们已经配置了 uWSGI emperor 将日志写到/var/log/uwsgi/emperor.log。这个文件夹还包含着每个配置应用的单独日志。我们的例子是 – /var/log/uwsgi/demoapp_uwsgi.log

静态文件

如果你的应用提供静态文件的话,将下面的规则添加到 demoapp_nginx.conf 文件:

location /static {
    root /var/www/demoapp/;
}

上面配置的结果就是所有在 /var/www/demoapp/static 文件夹中的文件将由提供 Nginx 对外服务(谢谢 Bastianh 指出)

托管多个应用

如果你想在一台服务器上托管多个 Flask 应用,为每个应用创建一个单独的文件夹,像我们前面所做的一样,创建 Nginx 及 uWSGI 配置文件到应用文件夹的符号链接。

使用 Distribute 部署应用

使用 distribute 部署 Flask 应用的话,首先,按照 Flask 文档里的步骤将应用转化成 package,然后复制 distribute 通用安装包到服务器上,使用虚拟环境中的 Python 来安装它。如下:

python setup.py install

最后且同样重要的是,uwsgi 配置里应用属性的值要设置成包含 Flask 应用的包的名称。

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里

更多 Ubuntu 相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2

英文原文:Serving Flask With Nginx

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-09/123597.htm

我职业生涯的大部分都在使用微软的架构,最近我决定走出技术的舒适区,步入开源软件世界。我现在日常工作的项目是一个 RESTful 服务,这个服务需要在主流硬件上运行,且能够按照需要进行水平拓展。为完成这项工作我决定使用 Flask 和 Nginx。Flask 是一个轻量级的 Python Web 框架,Nginx 是一个非常稳定的 Web 服务器,它们在廉价硬件平台上工作良好。

在这篇文章中我将指导你完成使用 Nginx 服务器托管 Flask 应用的安装、配置过程。我所使用的操作系统是 Ubuntu 13.04。

前提条件

在我们开始安装 Nginx 及其他所需软件之前先安装一些前提软件。首先,我们需要 PIP 与 virtualenv:

sudo apt-get install python-setuptools
sudo easy_install pip
sudo pip install virtualenv

使用 apt-get 安装 Nginx 的话,我们需要添加 Nginx 库到 apt-get source 中:

sudo add-apt-repository ppa:nginx/stable

注意:如果“add-apt-repository”命令在你的 Ubuntu 版本中不存在的话,你需要安装“software-properties-common”包,使用命令:sudo apt-get software-properties-common(感谢 get_with_it 在评论中提到)

升级已有的包,确保系统上有 uWSGI 所需的编译器和工具:

sudo apt-get update && sudo apt-get upgrade

sudo apt-get install build-essential python python-dev

Nginx

安装并运行 Nginx:

sudo apt-get install nginx
sudo /etc/init.d/nginx start

Nginx 是一个提供静态文件访问的 web 服务,然而,它不能直接执行托管 Python 应用程序,而 uWSGI 解决了这个问题。让我们先安装 uWSGI,稍候再配置 Nginx 和 uWSGI 之间的交互。

sudo pip install uwsgi

里程碑 #1

打开浏览器访问你的服务器,你应该能看到 Nginx 欢迎页:

在 Ubuntu 上使用 Nginx 部署 Flask 应用

 

示例应用

我们将托管的应用是经典的“Hello, world!”。这个应用只有一个页面,已经猜到页面上将有什么内容了吧。将所有应用相关的文件存放在 /var/www/demoapp 文件夹中。下面创建这个文件夹并在其中初始化一个虚拟环境:

sudo mkdir /var/www
sudo mkdir /var/www/demoapp

由于我们使用 root 权限创建了这个文件夹,它目前归 root 用户所有,让我们更改它的所有权给你登录的用户(我的例子中是 ubuntu)

sudo chown -R ubuntu:ubuntu /var/www/demoapp/

创建并激活一个虚拟环境,在其中安装 Flask:

cd /var/www/demoapp
virtualenv venv
. venv/bin/activate
pip install flask

使用下面的代码创建 hello.py 文件:

from flask import Flask
app = Flask(__name__)
 
@app.route(“/”)
def hello():
    return “Hello World!”
 
if __name__ == “__main__”:
    app.run(host=’0.0.0.0′, port=8080)

里程碑 #2

让我们执行我们刚创建的脚本:

python hello.py

现在你可以通过浏览器访问你服务器的 8080 端口,看,应用生效了:

在 Ubuntu 上使用 Nginx 部署 Flask 应用

注意:因为 80 端口已被 Nginx 使用,这里我使用 8080 端口。

现在应用是由 Flask 内置的 web 服务托管的,对于开发和调试这确实是个不错的工具,但不推荐在生产环境中使用。让我们配置 Nginx 来挑起这个重担吧。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2015-09/123597p2.htm

Ubuntu Server 14.04.2 LTS 配置 Nginx + Uwsgi + Django  http://www.linuxidc.com/Linux/2015-04/116397.htm

Ubuntu 12.04 下部署 Nginx+uWSGI+Flask http://www.linuxidc.com/Linux/2014-01/96007.htm

你应该使用 Nginx + uWSGI http://www.linuxidc.com/Linux/2013-07/87286.htm

uWSGI + Nginx 部署 Flask Web 应用 http://www.linuxidc.com/Linux/2013-06/85828.htm

Django+Nginx+uWSGI 部署 http://www.linuxidc.com/Linux/2013-02/79862.htm

Linux 下 Nginx+uWSGI 部署 Python 应用 http://www.linuxidc.com/Linux/2012-10/72443.htm

Ubuntu Server 12.04 安装 Nginx+uWSGI+Django 环境 http://www.linuxidc.com/Linux/2012-05/60639.htm

CentOS 5.5 + Nginx 0.8.50 + uWSGI + Django 1.2.3 部署 Django 项目 http://www.linuxidc.com/Linux/2011-05/36399.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计7838字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7963525
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛 NAS-4:飞牛 NAS 安装 istore 旁路由,家庭网络升级的最佳实践 开始 大家好我是...
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛 NAS 硬件 03:五盘位 +N5105+ 双网口的成品 NAS 值得入手吗 前言 大家好,我...
免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

  免费无广告!这款跨平台 AI RSS 阅读器,拯救你的信息焦虑 在算法推荐主导信息流的时代,我们...