如何在 Ubuntu 16.04 上使用 Gunicorn 和 Nginx 部署猎鹰网络应用程序

介绍

Falcon是构建 Web 应用程序的最小型 Python 框架,适用于构建遵循 REST 架构风格的 API。 它是一个低水平、高性能的框架,试图尽可能少地完成,而不牺牲开发速度。

在本教程中,您将构建和部署一个 Falcon Web 应用程序。Falcon 是一个 WSGI框架,因此您将安装和使用 Gunicorn,一个 WSGI 应用程序服务器,以服务应用程序。

前提条件

要完成本教程,您将需要:

第1步:创建Python虚拟环境

在我们深入编写代码或设置服务之前,我们将为我们的应用程序在服务器上创建一个Python虚拟环境。

连接到您的服务器作为您的非根用户:

1[environment local]
2ssh sammy@your_server_ip

Falcon 与 Python 2.x 和 Python 3.x 一起工作,但我们将使用 Ubuntu 16.04 中可用的 Python 最新版本,即 Python 3.5.

我们将使用 pipvirtualenv 来设置我们的 Falcon 应用程序. 有关这些工具的更多信息,请阅读我们的教程在 common Python tools

首先,安装虚拟机:

1sudo apt-get install virtualenv

接下来,创建一个包含应用程序的源代码和虚拟环境的目录,然后更改到该目录:

1mkdir falcon_app
2cd falcon_app

创建虚拟环境:

1virtualenv venv -p /usr/bin/python3

这个命令会创建一个虚拟环境,在venv目录中,p旗指明在虚拟环境中使用的是哪个版本的 Python。

你会看到这个输出:

1[secondary_label Output]
2Already using interpreter /usr/bin/python3
3Using base prefix '/usr'
4New python executable in /home/sammy/falcon_app/venv/bin/python3
5Also creating executable in /home/sammy/falcon_app/venv/bin/python
6Installing setuptools, pkg_resources, pip, wheel...done.

现在启用虚拟环境:

1. venv/bin/activate

<$>[注] 若要重新切换到全系统的Python解释器,请通过发出命令禁用虚拟环境:

1deactivate

美元

现在你已经设置了你的Python虚拟环境,让我们安装所需的Python包。

步骤 2 — 安装 Falcon 和 Gunicorn 使用管道

我们需要安装falcon包,因为我们正在使用Gunicorn来服务我们的应用程序,我们也需要安装它。

你可以用两种方式安装Falcon。Falcon有一个二进制,你可以用)。发出以下命令来安装Cython,然后告知Falcon检测它并使用系统的C编译器编译自己:

1sudo apt-get install build-essential python3-dev
2pip install cython
3pip install --no-binary :all: falcon

接下来,安装 Gunicorn:

1pip install gunicorn

让我们继续写我们的简单的Falcon应用程序。

第3步:使用Falcon编写一个简单的Web应用程序

让我们创建一个简单的单个文件的Falcon应用程序,在falcon_app目录中创建main.py文件:

1nano main.py

填充以下内容的文件,创建一个Falcon应用程序,当人们访问‘/test’路径时显示一个简单的测试消息:

 1[label main.py]
 2import falcon
 3
 4class TestResource(object):
 5    def on_get(self, req, res):
 6        """Handles all GET requests."""
 7        res.status = falcon.HTTP_200  # This is the default status
 8        res.body = ('This is me, Falcon, serving a resource!')
 9
10# Create the Falcon application object
11app = falcon.API()
12
13# Instantiate the TestResource class
14test_resource = TestResource()
15
16# Add a route to serve the resource
17app.add_route('/test', test_resource)

在此文件中,我们创建了一个名为TestResource的类别,该类包含一个on_get方法,它定义了我们要发送的响应,然后我们创建了Falcon API和TestResource的实例,然后我们将路线/test添加到API,并附加到资源对象test_resource

每当一个)方法,然后使用变量res.statusres.body`来设置响应状态和身体。

保存文件并关闭编辑器. 让我们测试应用程序。

步骤 4 — 用 Gunicorn 服务一个 Falcon 应用程序

在我们通过使用 Nginx 完成我们的应用程序生产工作之前,让我们通过与 Gunicorn 服务来确保我们的应用程序工作。

请确保您位于falcon_app目录中,以以下命令启动 Gunicorn:

1gunicorn -b 0.0.0.0:5000 main:app --reload

这开始于Gunicorn,并在端口5000上服务于我们的Web应用程序0.0.0.0,正如您可以从其输出中看到的那样:

1[secondary_label Output]
2[2016-11-14 16:33:41 +0000] [9428] [INFO] Starting gunicorn 19.6.0
3[2016-11-14 16:33:41 +0000] [9428] [INFO] Listening at: http://0.0.0.0:5000 (9428)
4[2016-11-14 16:33:41 +0000] [9428] [INFO] Using worker: sync
5[2016-11-14 16:33:41 +0000] [9431] [INFO] Booting worker with pid: 9431

您可以使用任何您喜欢的端口号码,但请确保它位于1024以上,并且不被任何其他程序使用。

「main:app」選項告訴 Gunicorn 召喚在「main.py」檔案中可用的應用程式對象「app」。

Gunicorn提供一个可选的重新加载开关,该开关告诉Gunicorn在飞行中检测任何代码变化,这样您就可以更改代码而无需重新启动Gunicorn。

通过在本地计算机上打开您的Web浏览器来测试您的应用程序,并在浏览器中访问http://your_server_ip:5000/test

Falcon's response

停止 Gunicorn 通过按CTRL+C来。

步骤5 — 使用 Nginx 向 Gunicorn 提供代理请求

我们将设置并配置 Nginx 来向 Gunicorn 代理所有网页请求,而不是让 Gunicorn 直接服务于来自外部世界的请求。

首先,通过执行以下命令来安装 Nginx:

1sudo apt-get install nginx

接下来,在/etc/nginx/sites-available目录中创建一个名为falcon_app.conf的新配置文件,该文件将配置 Nginx 来向您服务器的 IP 地址发送的所有请求到我们的 Falcon 应用程序的 Gunicorn 服务器。

1sudo nano /etc/nginx/sites-available/falcon_app.conf

将以下内容添加到文件中:

 1[label /etc/nginx/sites-available/falcon_app.conf]
 2server {
 3    listen 80;
 4    server_name your_server_ip_or_domain;
 5
 6    location / {
 7        include proxy_params;
 8        proxy_pass http://localhost:5000;
 9    }
10}

此配置告诉 Nginx 在端口80上聆听,并将所有 HTTP 请求代理到http://localhost:5000,这是 Gunicorn 正在聆听的地方。

通过在 /etc/nginx/sites-enabled 目录中创建该文件的象征链接来激活此配置:

1sudo ln -s /etc/nginx/sites-available/falcon_app.conf /etc/nginx/sites-enabled/falcon_app.conf

然后通过从 /etc/nginx/sites-enabled 目录中删除其 symlink 来禁用默认的 Nginx 配置文件:

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

确保您的任何 Nginx 文件中没有语法错误:

1sudo nginx -t

如果您有工作配置,您将看到此消息:

1[secondary_label Output]
2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3nginx: configuration file /etc/nginx/nginx.conf test is successful

如果您看到任何错误,请修复它们并再次测试。

重新启动 Nginx 以便新的配置生效。

1sudo systemctl restart nginx

现在重新启动Gunicorn,但将收听地址从0.0.0.0更改为Localhost,以防止公众访问Gunicorn:

1gunicorn -b localhost:5000 main:app --reload

允许通过服务器的防火墙访问端口 80,如果您已启用它:

1sudo ufw allow 80

请注意,如果您正在使用)。

最后,通过访问http://your_server_ip/test来测试应用程序,您将看到之前所看到的相同的输出。

请注意,您不再需要 URL 中的端口号码,因为您的请求现在通过 Nginx 运行,该端口运行在 80,默认的 HTTP 端口上。

The Falcon is now proxied through Nginx

通过按CTRL+C来关闭应用程序服务器,让我们将我们的Falcon应用程序配置为在背景中自动启动,就像我们的其他服务一样。

第7步:使用 Systemd 管理 Gunicorn

我們應該確保我們的應用程式每次我們的伺服器啟動都會自動啟動,就像 Nginx 一樣. 如果我們的伺服器意外重新啟動或因任何原因不得不重新啟動,我們不應該手動啟動 Gunicorn。

为了配置,我们将为我们的 Gunicorn 应用程序创建一个 _Systemd 单元文件,以便我们可以管理它。

首先,我们为我们的应用程序在 /etc/systemd/system 目录中创建一个文件,其中包含一个 .service 扩展:

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

单元文件由部分组成.[单元]部分用于指定我们的服务的元数据和依赖性,包括我们服务的描述以及何时开始我们的服务。

将此配置添加到文件中:

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

我们指定该服务应该在实现网络目标后启动,换句话说,我们只在网络服务准备后启动该服务。

[单位]部分之后,我们定义了[服务]部分,我们指定如何启动服务。

 1[label /etc/systemd/system/falcon_app.service]
 2[Service]
 3User=sammy
 4Group=www-data
 5PIDFile=/tmp/gunicorn.pid
 6Environment="PATH=/home/sammy/falcon_app/venv/bin"
 7WorkingDirectory=/home/sammy/falcon_app
 8ExecStart=/home/sammy/falcon_app/venv/bin/gunicorn --workers 3 -b localhost:5000 main:app
 9ExecReload=/bin/kill -s HUP $MAINPID
10ExecStop=/bin/kill -s TERM $MAINPID

然后我们定义一个文件来存储服务的PID(进程ID);这个PID用于停止或重新加载服务。

此外,我们指定了 Python 虚拟环境、应用程序的工作目录和执行命令,以启动应用程序. 我们将启动 Gunicorn 命令分配给 ExecStart 变量. 使用 --workers 旗帜来定义 Gunicorn 应该启动的工人数量。

ExecReloadExecStop变量定义了该服务应该如何启动和停止。

最后,我们添加了[安装]部分,它看起来像这样:

1[Install]
2[label /etc/systemd/system/falcon_app.service]
3WantedBy=multi-user.target

安装部分允许您启用和禁用服务. WantedBy指令在/etc/systemd/system内部创建了一个名为multi-user.target的目录,并在那里创建该文件的象征链接。

保存文件,关闭编辑器,并启动新服务:

1sudo systemctl start falcon_app

然后启用此服务,以便每次服务器启动时,Gunicorn 开始服务 Web 应用程序:

1sudo systemctl enable falcon_app

再次点击http://your_server_ip/test,以查看您的应用程序。 Nginx 和 Gunicorn 都在背景中运行。如果您需要更新您的 Falcon 应用程序,请重新启动falcon_app服务:

1sudo systemctl restart falcon_app

要了解有关单元文件的更多信息,请阅读教程(https://andsky.com/tech/tutorials/understanding-systemd-units-and-unit-files)。

结论

在本指南中,您配置并部署了您的第一个FalconWeb应用程序。您设置了Python环境并在服务器上写了应用程序代码,然后用Gunicorn服务了Web应用程序。然后您配置了Nginx,以便它将Web请求传递到我们的Gunicorn应用程序。最后,您写了一个Systemd Unit文件并启用了服务,以便您的Web应用程序在服务器启动时启动。

当您将自己的应用程序投入生产时,您将希望使用主机名而不是 IP 地址访问它们。 请查看 如何使用 DigitalOcean 设置主机名称以指向您的服务器域名。

Published At
Categories with 技术
comments powered by Disqus