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

介绍

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。 我们将使用PIPVIRTUALENV建立我们的Falcon应用。 要了解更多关于这些工具,请阅读我们的教程常见的Python工具 。 首先,安装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包。

第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.pyfalcon_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.statusres.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 ,因为你可以从它的输出看:
[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应用程序看到以下输出: Falcon的回应 按停止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
如果您具有有效的配置,则会看到此消息:
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.0localhost ,防止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端口。您将在浏览器中看到以下输出: Falcon现在通过Nginx代理 按停止应用服务器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 。 的ExecReloadExecStop变量定义如何服务应该被启动和停止。 最后,我们将添加[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单位和单位的文件

结论

在本指南中,您配置和部署了第一个Falcon Web应用程序。您设置Python环境并在服务器上编写应用程序代码,然后为Gunicorn提供Web应用程序。然后你配置Nginx,以便它传递Web请求到我们的Gunicorn应用程序。最后,您编写了一个Systemd Unit文件并启用了该服务,以便在服务器启动时启动Web应用程序。 当您将自己的应用程序投入生产时,您需要使用主机名而不是IP地址访问它们。看看如何设置一个主机名与DigitalOcean在你的服务器来指向您的域名。