介绍
Falcon是构建 Web 应用程序的最小型 Python 框架,适用于构建遵循 REST 架构风格的 API。 它是一个低水平、高性能的框架,试图尽可能少地完成,而不牺牲开发速度。
在本教程中,您将构建和部署一个 Falcon Web 应用程序。Falcon 是一个 WSGI框架,因此您将安装和使用 Gunicorn,一个 WSGI 应用程序服务器,以服务应用程序。
前提条件
要完成本教程,您将需要:
- 一个 Ubuntu 16.04 服务器是按照 Ubuntu 16.04 初始服务器设置指南设置的,包括一个 sudo 非根用户和一个防火墙。
第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.
我们将使用 pip 和 virtualenv 来设置我们的 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.status和
res.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
。
停止 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 端口上。
通过按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 应该启动的工人数量。
ExecReload
和ExecStop
变量定义了该服务应该如何启动和停止。
最后,我们添加了[安装]
部分,它看起来像这样:
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 设置主机名称以指向您的服务器域名。