Falcon是用于构建Web应用程序的最小Python框架。它非常适合构建遵循REST架构风格的API 。它是一个低级别,高性能的框架,可以在不牺牲开发速度的情况下尽可能少地执行。
在本教程中,您将构建和部署Falcon Web应用程序。Falcon是一个WSGI框架,因此您将安装和使用Gunicorn,一个WSGI应用程序服务器来为该应用程序提供服务。然后,您将使用Nginx作为反向代理服务器创建生产就绪环境,以在传入请求到达Gunicorn之前处理它们。
要完成本教程,您需要:
sudo
命令的非root账号的Ubuntu 16.04服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。在我们深入编写代码或设置服务之前,我们将在服务器上为我们的应用程序创建一个Python虚拟环境。
以非root用户身份连接到您的服务器:
ssh sammy@your_server_ip
Falcon适用于Python 2.x和Python 3.x,但我们将使用Ubuntu 16.04(Python 3.5)中提供的最新版本的Python。
我们将使用pip和virtualenv来设置我们的Falcon应用程序。
首先,安装virtualenv:
sudo apt-get install virtualenv
接下来,创建一个包含应用程序源代码和虚拟环境的目录,然后切换到该目录:
mkdir falcon_app
cd falcon_app
然后创建虚拟环境:
virtualenv venv -p /usr/bin/python3
此命令在目录venv
中创建虚拟环境。该-p
标志指定在虚拟环境中使用的Python版本。
你会看到这个输出:
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.
现在激活虚拟环境:
. venv/bin/activate
要切换回系统范围的Python解释器,请通过发出以下命令来停用虚拟环境:
deactivate
现在您已经设置了Python虚拟环境,让我们安装所需的Python包。
我们需要安装falcon
软件包,因为我们使用Gunicorn来为我们的应用程序提供服务,所以我们也需要安装它。这两个都可以通过pip
来安装。
你可以用两种方式安装Falcon。Falcon有一个你可以用pip install falcon
安装的二进制文件,但是当用Cython编译时,Falcon可以获得额外的速度提升。发出以下命令来安装Cython,然后通知Falcon检测它并使用系统的C编译器自行编译:
sudo apt-get install build-essential python3-dev
pip install cython
pip install --no-binary :all: falcon
接下来,安装Gunicorn:
pip install gunicorn
让我们继续编写简单的Falcon应用程序。
让我们创建一个简单的单文件Falcon应用程序。在falcon_app
目录中创建文件main.py
:
nano main.py
使用以下内容填充文件,这将创建一个Falcon应用程序,当人们访问/test
路径时显示一条简单的测试消息:
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
向/test
URL 发送请求时,TestResource
的方法on_get()
都会调用方法。响应状态和身体使用变量设置res.status
和res.body
来分别。
保存文件并关闭编辑器。我们来测试一下这个应用程序。
在我们通过使用Nginx完成我们的应用程序生产准备工作之前,让我们确保我们的应用程序通过Gunicorn提供服务。
确保您在falcon_app
目录中。使用以下命令启动Gunicorn:
gunicorn -b 0.0.0.0:5000 main:app --reload
这将启动Gunicorn并在端口5000
上提供我们的Web应用程序服务0.0.0.0
,您可以从其输出中看到:
[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。让我们以更具生产性的方式来设置它。
我们将设置和配置Nginx以代理向Gunicorn的所有Web请求,而不是让Gunicorn直接向外界提供请求。通过这样做,Nginx首先遇到Web应用程序的所有请求,然后路由到应用程序服务器。
首先,执行以下命令安装Nginx:
sudo apt-get install nginx
接下来,在/etc/nginx/sites-available
目录中创建调用的新配置文件falcon_app.conf
。此文件将配置Nginx以将来自服务器IP地址的所有请求代理到我们Falcon应用程序的Gunicorn服务器。
sudo nano /etc/nginx/sites-available/falcon_app.conf
将以下内容添加到文件中:
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
目录中创建指向此文件的符号链接来激活此配置:
sudo ln -s /etc/nginx/sites-available/falcon_app.conf /etc/nginx/sites-enabled/falcon_app.conf
然后通过从/etc/nginx/sites-enabled
目录中删除其符号链接来禁用默认的Nginx配置文件:
sudo rm /etc/nginx/sites-enabled/default
确保您的任何Nginx文件中没有语法错误:
sudo nginx -t
如果您有一个有效的配置,您将看到此消息:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
如果您发现任何错误,请修复它们并再次测试。
重新启动Nginx以使新配置生效。
sudo systemctl restart nginx
现在重新开始Gunicorn,但改变监听地址0.0.0.0
为localhost
以防止Gunicorn公共访问:
gunicorn -b localhost:5000 main:app --reload
如果已启用,则允许通过服务器的防火墙访问端口80
:
sudo ufw allow 80
注意:如果您使用的https
是为Web应用程序提供服务,请确保允许端口443
使用ufw
。
最后,通过访问http://your_server_ip/test
测试应用程序,您将看到之前看到的相同输出。
请注意,您不再需要URL中的端口号,因为您的请求现在通过Nginx,它在端口80
(默认HTTP端口)上运行。您将在浏览器中看到以下输出:
按下CTRL+C
停止应用服务器。让我们将Falcon应用程序配置为在后台自动启动,就像我们的其他服务一样。
我们应该确保每次服务器启动时我们的应用程序都会自动启动,就像Nginx一样。如果我们的服务器意外重启或因任何原因不得不重新启动,我们就不必手动启动Gunicorn。
要配置它,我们将为 Gunicorn应用程序创建一个Systemd单元文件,以便我们对其进行管理。
首先,我们使用.service
扩展名在目录/etc/systemd/system
中为我们的应用程序创建一个文件 :
sudo nano /etc/systemd/system/falcon_app.service
单元文件由部分组成。该[Unit]
部分用于指定我们服务的元数据和依赖关系,包括我们的服务描述以及何时启动我们的服务。
将此配置添加到文件中:
[Unit]
Description=Gunicorn instance to serve the falcon application
After=network.target
我们指定服务应在达到网络目标后启动。换句话说,我们只在网络服务准备好后才启动此服务。
在该[Unit]
部分之后,我们定义了指定如何启动服务的部分[Service]
。将其添加到配置文件中:
[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
。
ExecReload
与ExecStop
变量定义服务应如何启动和停止。
最后,我们添加了如下所示的[Install]
部分:
[Install]
WantedBy=multi-user.target
该Install
部分允许您启用和禁用该服务。该WantedBy
指令在目录/etc/systemd/system
中创建一个名为multi-user.target
,并在那里创建该文件的符号链接。禁用此服务将从目录中删除此文件。
保存文件,关闭编辑器,然后启动新服务:
sudo systemctl start falcon_app
然后启用此服务,以便每次服务器启动时,Gunicorn都会开始为Web应用程序提供服务:
sudo systemctl enable falcon_app
再一次,指向浏览器在http://your_server_ip/test``falcon_app
上来查看您的应用程序。Nginx和Gunicorn都在后台运行。如果您需要更新Falcon应用程序,请重新启动该服务:
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 删除。