如何在 Ubuntu 16.04 上使用 Gunicorn 和 Nginx 服务 Flask 应用程序

介绍

在本指南中,我们将使用 Ubuntu 16.04 上的 Flask 微框架设置一个简单的 Python 应用程序,本文的大部分内容将是如何设置 Gunicorn 应用程序服务器来启动应用程序,以及 Nginx 作为前端反向代理。

前提条件

在开始本指南之前,您应该在您的服务器上配置一个非根用户。该用户需要具有sudo权限,以便执行管理功能。

要了解更多关于我们的应用程序服务器将使用的 WSGI 规格与我们的 Flask 应用程序进行通信,您可以阅读链接的部分 本指南

当你准备好继续阅读时,继续阅读。

安装来自 Ubuntu 存储库的组件

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

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

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

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

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

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

创建 Python 虚拟环境

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

开始使用pip安装virtualenv包。

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

1sudo pip install virtualenv

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

1sudo pip3 install virtualenv

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

1mkdir ~/myproject
2cd ~/myproject

我们可以创建一个虚拟环境来存储我们的Flask项目的Python要求,通过键入:

1virtualenv myprojectenv

这将安装Python的本地副本和pip到项目目录中的名为myprojectenv的目录中。

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

1source myprojectenv/bin/activate

您的提示将更改,表示您现在在虚拟环境中运行,它将看起来像(myprojectenv)user@host:~/myproject$

创建一个Flask应用程序

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

安装Flask和Gunicorn

我们可以使用本地实例pip来安装 Flask 和 Gunicorn. 输入以下命令来获取这两个组件:

<$>[注] [标签注] 无论您正在使用哪个版本的 Python,当虚拟环境被激活时,您应该使用pip命令(而不是pip3)。

1pip install gunicorn flask

创建样本应用程序

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

虽然您的应用程序可能更复杂,但我们将创建我们的Flask应用程序在一个文件中,我们将其命名为myproject.py:

1nano ~/myproject/myproject.py

在此文件中,我们将放置我们的应用程序代码. 基本上,我们需要导入Flash并实例化Flask对象。

 1[label ~/myproject/myproject.py]
 2from flask import Flask
 3app = Flask(__name__)
 4
 5@app.route("/")
 6def hello():
 7    return "<h1 style='color:blue'>Hello There!</h1>"
 8
 9if __name__ == "__main__":
10    app.run(host='0.0.0.0')

这基本上定义了在访问根域时要呈现的内容。

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

打开端口 5000 键入:

1sudo ufw allow 5000

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

1python myproject.py

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

1http://server_domain_or_IP:5000

你应该看到这样的东西:

Flask sample app

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

创建 WSGI 入口点

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

我们将文件命名为wsgi.py:

1nano ~/myproject/wsgi.py

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

1[label ~/myproject/wsgi.py]
2from myproject import app
3
4if __name__ == "__main__":
5    app.run()

保存并关闭文件,当你完成。

测试 Gunicorn 服务项目的能力

在继续前,我们应该检查Gunicorn能否正确。

我们可以这样做,简单地将其传递给我们的入口点的名称,这是由模块的名称(如往常一样减去.py扩展)以及应用程序内可呼叫的名称构建的。

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

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

再次访问您的服务器的域名或 IP 地址: 5000 附在您的 Web 浏览器的末端:

1http://server_domain_or_IP:5000

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

Flask sample app

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

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

1deactivate

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

创建系统单元文件

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

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

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

内部,我们将从[单位]部分开始,该部分用于指定元数据和依赖性,我们将在这里列出我们的服务的描述,并告诉 init 系统在实现网络目标后才启动:

1[label /etc/systemd/system/myproject.service]
2[Unit]
3Description=Gunicorn instance to serve myproject
4After=network.target

接下来,我们将打开[服务]部分,我们将指定我们希望该进程运行的用户和组,我们将给我们的常规用户帐户拥有该进程,因为它拥有所有相关的文件,我们将向www-data组提供组所有权,以便 Nginx 可以轻松地与 Gunicorn 进程进行通信。

然后,我们将绘制工作目录,并设置PATH环境变量,以便 init 系统知道我们的进程可执行的位置(在我们的虚拟环境中)。

我们会告诉它启动3个工人流程(根据需要调整)。我们还会告诉它在我们的项目目录中创建并连接到一个名为myproject.sock的Unix接口文件。我们会设置一个UMASK值为007,以便创建接口文件,为所有者和组提供访问权限,同时限制其他访问权限。

 1[label /etc/systemd/system/myproject.service]
 2[Unit]
 3Description=Gunicorn instance to serve myproject
 4After=network.target
 5
 6[Service]
 7User=sammy
 8Group=www-data
 9WorkingDirectory=/home/sammy/myproject
10Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
11ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app

最后,我们将添加一个 [安装] 部分,这将告诉系统d如果我们允许该服务在启动时启动,该服务将连接到什么。

 1[label /etc/systemd/system/myproject.service]
 2[Unit]
 3Description=Gunicorn instance to serve myproject
 4After=network.target
 5
 6[Service]
 7User=sammy
 8Group=www-data
 9WorkingDirectory=/home/sammy/myproject
10Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
11ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app
12
13[Install]
14WantedBy=multi-user.target

这样,我们的 systemd 服务文件就完成了. 现在保存并关闭它。

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

1sudo systemctl start myproject
2sudo systemctl enable myproject

将 Nginx 配置为 proxy 请求

我们的Gunicorn应用程序服务器现在应该运行,在项目目录中等待接口文件上的请求。

首先,在 Nginx 的网站可用目录中创建一个新的服务器封锁配置文件,我们将简单地称之为myproject,以与其他指南保持一致:

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

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

1[label /etc/nginx/sites-available/myproject]
2server {
3    listen 80;
4    server_name server_domain_or_IP;
5}

我们需要添加的另一个东西是一个匹配每个请求的位置块,在这个块中,我们将包括指定一些需要设置的通用代理参数的proxy_params文件,然后我们将请求传递给我们使用proxy_pass指令定义的接口:

 1[label /etc/nginx/sites-available/myproject]
 2server {
 3    listen 80;
 4    server_name server_domain_or_IP;
 5
 6    location / {
 7        include proxy_params;
 8        proxy_pass http://unix:/home/sammy/myproject/myproject.sock;
 9    }
10}

这实际上是我们需要的服务我们的应用程序. 保存和关闭文件,当你完成。

要启用我们刚刚创建的 Nginx 服务器封锁配置,请将文件链接到网站启用目录:

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

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

1sudo nginx -t

如果返回没有表示任何问题,我们可以重新启动 Nginx 流程来阅读我们的新配置:

1sudo systemctl restart nginx

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

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

您现在应该能够在您的 Web 浏览器中访问您的服务器的域名或 IP 地址:

1http://server_domain_or_IP

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

Flask sample app

<$>[注] [标签注] 配置 Nginx 后,下一步应该是使用 SSL/TLS 来确保服务器的流量。

获取SSL证书以保护您的流量最简单的方法是使用 Let's Encrypt。 遵循此指南(https://andsky.com/tech/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04)在Ubuntu 16.04 上设置 Let's Encrypt with Nginx。

结论

在本指南中,我们在Python虚拟环境中创建了一个简单的Flask应用程序。我们创建了一个WSGI入口点,以便任何具有WSGI能力的应用程序服务器都可以与其进行交互,然后配置了Gunicorn应用程序服务器以提供此功能。

Flask 是一个非常简单但非常灵活的框架,旨在为您的应用提供功能,而不会过于限制结构和设计。

Published At
Categories with 技术
comments powered by Disqus