前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 16.04上使用Gunicorn和Nginx部署Falcon Web应用程序

如何在Ubuntu 16.04上使用Gunicorn和Nginx部署Falcon Web应用程序

原创
作者头像
姚啊姚
修改2018-09-26 16:27:54
1.7K0
修改2018-09-26 16:27:54
举报

介绍

Falcon是用于构建Web应用程序的最小Python框架。它非常适合构建遵循REST架构风格的API 。它是一个低级别,高性能的框架,可以在不牺牲开发速度的情况下尽可能少地执行。

在本教程中,您将构建和部署Falcon Web应用程序。Falcon是一个WSGI框架,因此您将安装和使用Gunicorn,一个WSGI应用程序服务器来为该应用程序提供服务。然后,您将使用Nginx作为反向代理服务器创建生产就绪环境,以在传入请求到达Gunicorn之前处理它们。

准备

要完成本教程,您需要:

  • 一台已经设置好可以使用sudo命令的非root账号的Ubuntu 16.04服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

第1步 - 创建Python虚拟环境

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

以非root用户身份连接到您的服务器:

代码语言:javascript
复制
ssh sammy@your_server_ip

Falcon适用于Python 2.x和Python 3.x,但我们将使用Ubuntu 16.04(Python 3.5)中提供的最新版本的Python。

我们将使用pipvirtualenv来设置我们的Falcon应用程序。

首先,安装virtualenv:

代码语言:javascript
复制
sudo apt-get install virtualenv

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

代码语言:javascript
复制
mkdir falcon_app
cd falcon_app

然后创建虚拟环境:

代码语言:javascript
复制
virtualenv venv -p /usr/bin/python3

此命令在目录venv中创建虚拟环境。该-p标志指定在虚拟环境中使用的Python版本。

你会看到这个输出:

代码语言:javascript
复制
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/sammy/falcon_app/venv/bin/python3
Also creating executable in /home/sammy/falcon_app/venv/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.

现在激活虚拟环境:

代码语言:javascript
复制
. venv/bin/activate

要切换回系统范围的Python解释器,请通过发出以下命令来停用虚拟环境:

代码语言:javascript
复制
deactivate

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

第2步 - 用pip安装Falcon和Gunicorn

我们需要安装falcon软件包,因为我们使用Gunicorn来为我们的应用程序提供服务,所以我们也需要安装它。这两个都可以通过pip来安装。

你可以用两种方式安装Falcon。Falcon有一个你可以用pip install falcon安装的二进制文件,但是当用Cython编译时,Falcon可以获得额外的速度提升。发出以下命令来安装Cython,然后通知Falcon检测它并使用系统的C编译器自行编译:

代码语言:javascript
复制
sudo apt-get install build-essential python3-dev
pip install cython
pip install --no-binary :all: falcon

接下来,安装Gunicorn:

代码语言:javascript
复制
pip install gunicorn

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

第3步 - 使用Falcon编写简单的Web应用程序

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

代码语言:javascript
复制
nano main.py

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

代码语言:javascript
复制
import falcon
​
class TestResource(object):
    def on_get(self, req, res):
        """Handles all GET requests."""
        res.status = falcon.HTTP_200  # This is the default status
        res.body = ('This is me, Falcon, serving a resource!')
​
# Create the Falcon application object
app = falcon.API()
​
# Instantiate the TestResource class
test_resource = TestResource()
​
# Add a route to serve the resource
app.add_route('/test', test_resource)

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

每当GET/testURL 发送请求时,TestResource的方法on_get()都会调用方法。响应状态和身体使用变量设置res.statusres.body来分别。

保存文件并关闭编辑器。我们来测试一下这个应用程序。

第4步 - 与Gunicorn一起提供Falcon应用程序

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

确保您在falcon_app目录中。使用以下命令启动Gunicorn:

代码语言:javascript
复制
gunicorn -b 0.0.0.0:5000 main:app --reload

这将启动Gunicorn并在端口5000上提供我们的Web应用程序服务0.0.0.0,您可以从其输出中看到:

代码语言:javascript
复制
[2016-11-14 16:33:41 +0000] [9428] [INFO] Starting gunicorn 19.6.0
[2016-11-14 16:33:41 +0000] [9428] [INFO] Listening at: http://0.0.0.0:5000 (9428)
[2016-11-14 16:33:41 +0000] [9428] [INFO] Using worker: sync
[2016-11-14 16:33:41 +0000] [9431] [INFO] Booting worker with pid: 9431

您可以使用任何您喜欢的端口号,但要确保它在1024上面,并且任何其他程序都不会使用它。

main:app选项告诉Gunicorn调用文件main.py中可用的应用程序对象app

Gunicorn提供了一个可选的--reload开关,告诉Gunicorn动态检测任何代码变化。这样您就可以更改代码而无需重新启动Gunicorn。

通过在本地计算机上打开Web浏览器并在浏览器中访问http://your_server_ip:5000/test来测试应用程序。您将从Web应用程序中看到以下输出:

按下 CTRL+C停止Gunicorn。让我们以更具生产性的方式来设置它。

第5步 - 使用Nginx向Gunicorn发送代理请求

我们将设置和配置Nginx以代理向Gunicorn的所有Web请求,而不是让Gunicorn直接向外界提供请求。通过这样做,Nginx首先遇到Web应用程序的所有请求,然后路由到应用程序服务器。

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

代码语言:javascript
复制
sudo apt-get install nginx

接下来,在/etc/nginx/sites-available目录中创建调用的新配置文件falcon_app.conf。此文件将配置Nginx以将来自服务器IP地址的所有请求代理到我们Falcon应用程序的Gunicorn服务器。

代码语言:javascript
复制
sudo nano /etc/nginx/sites-available/falcon_app.conf

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

代码语言:javascript
复制
server {
    listen 80;
    server_name your_server_ip_or_domain;
​
    location / {
        include proxy_params;
        proxy_pass http://localhost:5000;
    }
}

这个配置告诉Nginx监听端口80并代理所有的HTTP请求http://localhost:5000,这是Gunicorn将要监听的地方。

通过在/etc/nginx/sites-enabled目录中创建指向此文件的符号链接来激活此配置:

代码语言:javascript
复制
sudo ln -s /etc/nginx/sites-available/falcon_app.conf /etc/nginx/sites-enabled/falcon_app.conf

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

代码语言:javascript
复制
sudo rm /etc/nginx/sites-enabled/default

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

代码语言:javascript
复制
sudo nginx -t

如果您有一个有效的配置,您将看到此消息:

代码语言:javascript
复制
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

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

重新启动Nginx以使新配置生效。

代码语言:javascript
复制
sudo systemctl restart nginx

现在重新开始Gunicorn,但改变监听地址0.0.0.0localhost以防止Gunicorn公共访问:

代码语言:javascript
复制
gunicorn -b localhost:5000 main:app --reload

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

代码语言:javascript
复制
sudo ufw allow 80

注意:如果您使用的https是为Web应用程序提供服务,请确保允许端口443使用ufw

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

请注意,您不再需要URL中的端口号,因为您的请求现在通过Nginx,它在端口80(默认HTTP端口)上运行。您将在浏览器中看到以下输出:

按下CTRL+C停止应用服务器。让我们将Falcon应用程序配置为在后台自动启动,就像我们的其他服务一样。

第7步 - 使用Systemd管理Gunicorn

我们应该确保每次服务器启动时我们的应用程序都会自动启动,就像Nginx一样。如果我们的服务器意外重启或因任何原因不得不重新启动,我们就不必手动启动Gunicorn。

要配置它,我们将为 Gunicorn应用程序创建一个Systemd单元文件,以便我们对其进行管理。

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

代码语言:javascript
复制
sudo nano /etc/systemd/system/falcon_app.service

单元文件由部分组成。该[Unit]部分用于指定我们服务的元数据和依赖关系,包括我们的服务描述以及何时启动我们的服务。

将此配置添加到文件中:

代码语言:javascript
复制
[Unit]
Description=Gunicorn instance to serve the falcon application
After=network.target

我们指定服务应达到网络目标启动。换句话说,我们只在网络服务准备好后才启动此服务。

在该[Unit]部分之后,我们定义了指定如何启动服务的部分[Service]。将其添加到配置文件中:

代码语言:javascript
复制
[Service]
User=sammy
Group=www-data
PIDFile=/tmp/gunicorn.pid
Environment="PATH=/home/sammy/falcon_app/venv/bin"
WorkingDirectory=/home/sammy/falcon_app
ExecStart=/home/sammy/falcon_app/venv/bin/gunicorn --workers 3 -b localhost:5000 main:app
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

我们首先定义服务运行的用户和组。然后我们定义一个文件来存储服务的PID(进程ID); 此PID用于停止或重新加载服务。

此外,我们还指定了Python虚拟环境,即应用程序的工作目录。以及执行以启动应用程序的命令。我们将命令分配给ExecStart变量以启动Gunicorn 。该--workers标志用于定义Gunicorn应该开始的工人数量。该Gunicorn文档建议您设置的工人要数为2n+1,这里n为CPU内核的数量。假设您的服务器有一个CPU核心,我们就会得到这个数字3

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

最后,我们添加了如下所示的[Install]部分:

代码语言:javascript
复制
[Install]
WantedBy=multi-user.target

Install部分允许您启用和禁用该服务。该WantedBy指令在目录/etc/systemd/system中创建一个名为multi-user.target,并在那里创建该文件的符号链接。禁用此服务将从目录中删除此文件。

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

代码语言:javascript
复制
sudo systemctl start falcon_app

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

代码语言:javascript
复制
sudo systemctl enable falcon_app

再一次,指向浏览器在http://your_server_ip/test``falcon_app上来查看您的应用程序。Nginx和Gunicorn都在后台运行。如果您需要更新Falcon应用程序,请重新启动该服务:

代码语言:javascript
复制
sudo systemctl restart falcon_app

结论

在本指南中,您配置并部署了第一个Falcon Web应用程序。您设置了Python环境并在服务器上编写了应用程序代码,然后使用Gunicorn为Web应用程序提供服务。然后,您配置了Nginx,以便将Web请求传递给我们的Gunicorn应用程序。最后,您编写了一个Systemd单元文件并启用了该服务,以便在服务器启动时启动Web应用程序。

当您将自己的应用程序投入生产时,您将需要使用主机名而不是IP地址访问它们。

想要了解更多关于使用Gunicorn和Nginx部署Falcon Web应用程序的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How to Deploy Falcon Web Applications with Gunicorn and Nginx on Ubuntu 16.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第1步 - 创建Python虚拟环境
  • 第2步 - 用pip安装Falcon和Gunicorn
  • 第3步 - 使用Falcon编写简单的Web应用程序
  • 第4步 - 与Gunicorn一起提供Falcon应用程序
  • 第5步 - 使用Nginx向Gunicorn发送代理请求
  • 第7步 - 使用Systemd管理Gunicorn
  • 结论
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档