如何为在Ubuntu 16.04 Flask应用程序与Gunicorn和Nginx的

在本指南中,我们将设置使用在Ubuntu 16.04的瓶微架构一个简单的Python应用程序。这篇文章的大部分将如何建立Gunicorn应用服务器启动应用程序和Nginx的作为前端逆向...

介绍

在本指南中,我们将在Ubuntu 16.04上使用Flask微框架设置一个简单的Python应用程序。 这篇文章的大部分将是关于如何设置Gunicorn应用程序服务器启动应用程序和Nginx充当前端逆向代理。

先决条件

在开始本指南之前,您应该在服务器上配置非root用户。 这个用户需要具有sudo权限,以便可以执行管理功能。 要了解如何设置的,按照我们最初的服务器设置指南

要了解更多关于我们的应用程序服务器将使用我们的应用程序Flask沟通WSGI规范,你可以阅读的链接部分本指南 了解这些概念将使本指南更容易遵循。

当您准备好继续时,请继续阅读。

从Ubuntu存储库安装组件

我们的第一步是安装我们需要的所有零件,从存储库。 我们将安装pip ,Python的包管理器,以便安装和管理我们的Python组件。 我们还将获得构建一些Gunicorn组件所需的Python开发文件。 我们现在也将安装Nginx。

更新本地软件包索引,然后安装软件包。 您需要的特定软件包将取决于您为项目使用的Python版本。

如果您正在使用Python 2,请键入:

sudo apt-get update
sudo apt-get install python-pip python-dev nginx

相反,如果你正在使用Python 3,键入:

sudo apt-get update
sudo apt-get install python3-pip python3-dev nginx

创建Python虚拟环境

接下来,我们将设置一个虚拟环境,以便将Flask应用程序与系统上的其他Python文件隔离开来。

通过安装启动virtualenv使用包pip

如果您正在使用Python 2,请键入:

sudo pip install virtualenv

如果您正在使用Python 3,键入:

sudo pip3 install virtualenv

现在,我们可以为我们的Flask项目创建一个父目录。 在创建目录后移动到目录:

mkdir ~/myproject
cd ~/myproject

我们可以创建一个虚拟环境来存储Flask项目的Python需求,方法是键入:

virtualenv myprojectenv

这将安装Python的本地副本和pip变成一个名为myprojectenv项目目录之内。

在我们在虚拟环境中安装应用程序之前,我们需要激活它。 您可以键入以下内容:

source myprojectenv/bin/activate

您的提示将更改为表示您现在在虚拟环境中操作。 它看起来像这样( myprojectenv ) user @ host :~/ myproject $

设置Flask应用程序

现在,你在你的虚拟环境中,我们可以安装Flask和Gunicorn,并开始设计我们的应用程序:

安装Flask和Gunicorn

我们可以使用本地实例pip安装瓶和Gunicorn。 键入以下命令以获取这两个组件:

注意
无论哪个版本的Python您正在使用,当虚拟环境中被激活,你应该使用pip命令(不pip3 )。
pip install gunicorn flask

创建示例应用程序

现在我们有Flask可用,我们可以创建一个简单的应用程序。 Flask是一个微框架。 它不包括许多更全功能的框架可能的工具,并且主要作为一个模块,您可以导入到您的项目,以帮助您初始化Web应用程序。

当你的应用程序可能会比较复杂,我们将创建我们在一个文件中,我们将其称为瓶应用myproject.py

nano ~/myproject/myproject.py

在这个文件中,我们将放置我们的应用程序代码。 基本上,我们需要导入Flask并实例化一个Flask对象。 我们可以使用它来定义在请求特定路由时应该运行的函数:

〜/ myproject / myproject.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1 style='color:blue'>Hello There!</h1>"

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

这基本上定义了访问根域时要呈现的内容。 保存并在完成后关闭文件。

如果您遵循初始服务器设置指南,则应启用UFW防火墙。 为了测试我们的应用程序,我们需要允许访问端口5000。

键入以下命令打开端口5000:

sudo ufw allow 5000

现在,您可以通过键入以下内容来测试您的Flask应用程序:

python myproject.py

访问您的服务器的域名或IP地址后面:5000在Web浏览器:

http://server_domain_or_IP:5000

你应该看到这样的:

Flask示例应用程序

完成后,在终端窗口中按CTRL-C几次以停止Flask开发服务器。

创建WSGI入口点

接下来,我们将创建一个文件,作为我们的应用程序的入口点。 这将告诉我们的Gunicorn服务器如何与应用程序交互。

我们将调用文件wsgi.py

nano ~/myproject/wsgi.py

该文件是非常简单的,我们可以简单地从我们的应用程序导入Flask实例,然后运行它:

〜/ myproject / wsgi.py
from myproject import app

if __name__ == "__main__":
    app.run()

保存并在完成后关闭文件。

测试Gunicorn的能力服务项目

在继续前,我们应该检查Gunicorn可以正确。

我们可以通过简单地传递它的入口点的名称来做到这一点。 这由模块(减去的名称构成.py扩展,像往常一样)加上应用程序内调用的名称。 对我们来说,这将是wsgi:app

我们还将指定要绑定的接口和端口,以便它将在公开可用的接口上启动:

cd ~/myproject
gunicorn --bind 0.0.0.0:5000 wsgi:app

访问您的服务器的域名或IP地址用:5000附加到您的Web浏览器的结尾再次:

http://server_domain_or_IP:5000

您应该再次看到您的应用程序的输出:

Flask示例应用程序

当您确认它正常工作时,请在终端窗口中按CTRL-C。

我们现在已经完成了我们的虚拟环境,因此我们可以停用它:

deactivate

任何Python命令现在将再次使用系统的Python环境。

创建systemd单元文件

下一个我们需要关心的是systemd服务单元文件。 创建systemd单元文件将允许Ubuntu的init系统自动启动Gunicorn并在服务器启动时为我们的Flask应用程序提供服务。

在/ etc / systemd / system目录中创建以.service结尾的单元文件,以开始:

sudo nano /etc/systemd/system/myproject.service

里面,我们将在开始[Unit]部分,它是用来指定的元数据和依赖关系。 我们将在这里描述我们的服务,并告诉init系统只有在达到网络目标后才启动:

/etc/systemd/system/myproject.service
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

接下来,我们将打开[Service]部分。 我们将指定我们希望进程运行的用户和组。 我们将给予流程的常规用户帐户所有权,因为它拥有所有相关文件。 我们将给组所有权的www-data组,以便Nginx的可以与Gunicorn过程很容易沟通。

然后,我们将映射出工作目录,并设置PATH环境变量,所以init系统知道我们该进程的可执行文件的位置(我们的虚拟环境中)。 然后我们将指定启动服务的命令。 Systemd要求我们提供Gunicorn可执行文件的完整路径,该路径安装在我们的虚拟环境中。

我们将告诉它启动3个工作进程(根据需要进行调整)。 我们也将告诉它创建和绑定到我们的项目目录中的Unix套接字文件名为myproject .sock 我们将设置的umask值007 ,使创建套接字文件提供访问所有者和组,同时限制其他访问。 最后,我们需要传入WSGI入口点文件名和Python中的callable:

/etc/systemd/system/myproject.service
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app

最后,我们将添加一个[Install]部分。 这将告诉systemd什么链接这个服务,如果我们启用它在启动时启动。 我们希望在常规多用户系统启动并运行时启动此服务:

/etc/systemd/system/myproject.service
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target

这样,我们的systemd服务文件就完成了。 保存并立即关闭。

我们现在可以启动我们创建的Gunicorn服务,并启用它,以便它在启动时启动:

sudo systemctl start myproject
sudo systemctl enable myproject

配置Nginx到代理请求

我们的Gunicorn应用程序服务器现在应该启动并运行,等待项目目录中的套接字文件上的请求。 我们需要配置Nginx通过对其配置文件进行一些小的添加来将Web请求传递给该套接字。

通过创建的Nginx的一个新的服务器模块的配置文件开始sites-available目录。 我们将简单地称之为myproject保持符合指南的其余部分:

sudo nano /etc/nginx/sites-available/myproject

打开一个服务器块,并告诉Nginx监听默认端口80.我们还需要告诉它使用这个块来请求我们服务器的域名或IP地址:

/ etc / nginx / sites-available / myproject
server {
    listen 80;
    server_name server_domain_or_IP;
}

我们需要添加的唯一的另一件事是一个匹配每个请求的位置块。 在此块中,我们将包括proxy_params文件,指定了需要设置一些一般的代理参数。 然后,我们将通过请求,我们使用定义的插座proxy_pass指令:

/ etc / nginx / sites-available / myproject
server {
    listen 80;
    server_name server_domain_or_IP;

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/sammy/myproject/myproject.sock;
    }
}

这实际上是我们需要为我们的应用程序服务。 保存并在完成后关闭文件。

为了使我们刚刚创建的Nginx的服务器模块配置,文件链接到sites-enabled目录:

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

使用该目录中的文件,我们可以通过键入以下内容来测试语法错误:

sudo nginx -t

如果这返回没有指示任何问题,我们可以重新启动Nginx进程读取我们的新配置:

sudo systemctl restart nginx

我们需要做的最后一件事是再次调整我们的防火墙。 我们不再需要通过端口5000访问,因此我们可以删除该规则。 然后我们可以允许访问Nginx服务器:

sudo ufw delete allow 5000
sudo ufw allow 'Nginx Full'

您现在应该可以在您的网络浏览器中访问您的服务器的域名或IP地址:

http://server_domain_or_IP

您应该会看到应用程序的输出:

Flask示例应用程序

注意

配置Nginx后,下一步应该是使用SSL / TLS确保流量到服务器。 这很重要,因为没有它,所有信息,包括密码都通过网络以纯文本发送。

获取SSL证书以确保流量的最简单方法是使用Let's Encrypt。 按照本指南设置让我们Nginx的加密在Ubuntu 16.04。

结论

在本指南中,我们在Python虚拟环境中创建了一个简单的Flask应用程序。 我们创建一个WSGI入口点,以便任何支持WSGI的应用程序服务器可以与它接口,然后配置Gunicorn应用程序服务器以提供此功能。 然后,我们创建了一个systemd单元文件,以便在启动时自动启动应用程序服务器。 我们创建了一个Nginx服务器块,将Web客户端流量传递到应用程序服务器,中继外部请求。

Flask是一个非常简单但非常灵活的框架,旨在为您的应用程序提供功能,而不会对结构和设计造成过多的限制。 您可以使用本指南中描述的常规来为您设计的Flask应用程序提供服务。