介绍
Falcon是构建Web应用程序的最小的Python框架。 它非常适合于构建遵循的API REST建筑风格。它是一个低级别,高性能的框架,尽可能少地做,而不牺牲开发速度。 在本教程中,您将构建和部署Falcon Web应用程序。Falcon是一个 WSGI框架,所以你安装和使用 Gunicorn ,一个WSGI应用服务器,服务应用程序。然后,您将创建一个生产就绪的环境,使用Nginx作为反向代理服务器来处理传入的请求,直到他们到达Gunicorn。先决条件
要完成本教程,您需要:- 一个Ubuntu 16.04服务器通过遵循[Ubuntu 16.04初始服务器设置指南](...)设置,包括sudo非root用户和防火墙。
第1步 - 创建Python虚拟环境
在我们开始编写代码或设置服务之前,我们将在服务器上为我们的应用程序创建一个Python虚拟环境。 以非root用户身份连接到您的服务器:ssh sammy@your_server_ip
Falcon与Python 2.x和Python 3.x兼容,但我们将使用Ubuntu 16.04中最新版本的Python,即Python 3.5。 我们将使用
PIP和
VIRTUALENV建立我们的Falcon应用。 要了解更多关于这些工具,请阅读我们的教程
常见的Python工具 。 首先,安装virtualenv:
sudo apt-get install virtualenv
接下来,创建一个目录来保存应用程序的源代码和虚拟环境,然后切换到该目录:
mkdir falcon_app
cd falcon_app
然后创建虚拟环境:
virtualenv venv -p /usr/bin/python3
此命令创建目录内的虚拟环境
venv
。 该
-p
标志指定哪个Python版本在虚拟环境中使用。 您将看到此输出:
OutputAlready 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包。
第2步 - 用pip安装Falcon和Gunicorn
我们需要安装falcon
包,因为我们使用Gunicorn为我们的应用程序,我们需要安装了。 这两种都可以通过
pip
, 您可以通过两种方式安装Falcon。Falcon已经可以用安装二进制
pip install falcon
,可是当编译Falcon可以获得额外的速度提升
用Cython 。发出以下命令来安装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应用程序。
第3步 - 使用Falcon编写一个简单的Web应用程序
让我们创建一个简单的单文件Falcon应用程序。创建文件main.py
在
falcon_app
目录:
nano main.py
填充以下内容,这会创建一个显示当人们访问一个简单的测试消息的Falcon应用程序的文件
/test
路线:
main.py
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
定义我们要发送的响应方法。 然后,我们创建了FalconAPI和实例
TestResource
。 然后我们路由添加
/test
的API和资源对象附加
test_resource
到它。 每当一
GET
请求被发送到
/test
URL,则
on_get()
的方法
TestResource
被调用。 响应状态和身体所使用的变量设置
res.status
和
res.body
分别。 保存文件并关闭编辑器。让我们测试一下应用程序。
第4步 - 用Gunicorn提供Falcon应用程序
在我们通过使用Nginx来完成我们的应用程序生产准备的工作之前,让我们确保我们的应用程序通过为Gunicorn服务。 请确保你在falcon_app
目录。使用以下命令启动Gunicorn:
gunicorn -b 0.0.0.0:5000 main:app --reload
这将启动Gunicorn,并提供我们的web应用程序
0.0.0.0
在端口
5000
,因为你可以从它的输出看:
Output[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调用应用程序对象
app
在文件中提供
main.py
。 Gunicorn提供可选的
--reload
开关,告诉Gunicorn检测动态更改任何代码。这样,您可以更改您的代码,而无需重新启动Gunicorn。 通过在本地计算机上打开Web浏览器,并访问测试您的应用
http:// your_server_ip :5000/test
在浏览器中。您将从Web应用程序看到以下输出:
按停止Gunicorn
CTRL+C
。让我们设置一个更多的生产就绪的方式。
第5步 - 使用Nginx代理请求Gunicorn
我们将设置和配置Nginx代理所有的网络请求到Gunicorn,而不是让Gunicorn直接服务来自外部世界的请求。通过这样做,您的Web应用程序的所有请求首先由Nginx遇到,然后路由到应用程序服务器。 首先,通过执行以下命令安装Nginx:sudo apt-get install nginx
接下来,创建一个新的名为配置文件
falcon_app.conf
中
/etc/nginx/sites-available
目录。此文件将配置Nginx代理所有请求到您的服务器的IP地址到我们的Falcon应用程序的Gunicorn服务器。
sudo nano /etc/nginx/sites-available/falcon_app.conf
将以下内容添加到文件:
/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
然后,从删除其符号链接禁用默认配置Nginx的文件
/etc/nginx/sites-enabled
目录:
sudo rm /etc/nginx/sites-enabled/default
确保您的任何Nginx文件中没有语法错误:
sudo nginx -t
如果您具有有效的配置,则会看到此消息:
Outputnginx: 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
。此外,请务必仔细阅读我们的文章如何安全使用Nginx让我们加密 。 最后,通过访问测试出应用程序
http:// your_server_ip /test
,你会看到你以前看到相同的输出。 请注意,你不再需要的端口号的网址,因为您的请求正在经历Nginx的现在,它运行在端口
80
,默认的HTTP端口。您将在浏览器中看到以下输出:
按停止应用服务器
CTRL+C
。让我们将我们的Falcon应用程序配置为在后台像我们的其他服务一样自动启动。
第7步 - 管理Gunicorn与Systemd
我们应该确保我们的应用程序每次我们的服务器启动时自动启动,就像Nginx。如果我们的服务器意外重新启动或由于任何原因必须重新启动,我们不应手动启动Gunicorn。 要配置此,我们要为我们的Gunicorn应用 Systemd单元文件,这样我们就可以管理它。 首先,我们为我们的内部应用程序的文件/etc/systemd/system
与目录
.service
延伸:
sudo nano /etc/systemd/system/falcon_app.service
单元文件由节组成。在
[Unit]
部分用于指定我们的服务的元数据和依赖关系,包括我们的服务以及何时启动我们的服务的描述。 将此配置添加到文件:
/etc/systemd/system/falcon_app.service
[Unit]
Description=Gunicorn instance to serve the falcon application
After=network.target
我们指定的网络目标已经达成
后 ,服务应该启动。换句话说,我们只在网络服务准备就绪后才启动此服务。 后
[Unit]
部分中,我们定义
[Service]
部分,在那里,我们指定如何启动该服务。将其添加到配置文件:
/etc/systemd/system/falcon_app.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虚拟环境,应用程序的工作目录。以及执行以启动应用程序的命令。我们分配命令来启动Gunicorn到
ExecStart
变量。 该
--workers
标志用来定义工人该Gunicorn应启动的数目。 该Gunicorn文档建议你设置的工人数量为
2n+1
,其中
n
是CPU内核的数量。 假设你的服务器有一个单一的CPU核心,我们到达数
3
。 的
ExecReload
和
ExecStop
变量定义如何服务应该被启动和停止。 最后,我们将添加
[Install]
部分,它看起来是这样的:
/etc/systemd/system/falcon_app.service
[Install]
WantedBy=multi-user.target
该
Install
部分,您可以启用和禁用服务。 该
WantedBy
指令创建一个名为
multi-user.target
内
/etc/systemd/system
和该文件将在那里创建的符号链接。禁用此服务将从目录中删除此文件。 保存文件,关闭编辑器,然后启动新服务:
sudo systemctl start falcon_app
然后启用此服务,以便每次服务器启动时,Gunicorn开始服务Web应用程序:
sudo systemctl enable falcon_app
再次,在点你的浏览器中
http:// your_server_ip /test
,看看你的应用程序。 Nginx和Gunicorn都在后台运行。 如果您需要更新您的应用程序Falcon,重新启动
falcon_app
服务:
sudo systemctl restart falcon_app
要了解更多有关单位的文件,阅读教程
了解Systemd单位和单位的文件 。