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版本在虚拟环境中使用。
您将看到此输出:
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
,可是当编译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应用程序。
main.py
在falcon_app
目录:
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
定义我们要发送的响应方法。 然后,我们创建了FalconAPI和实例TestResource
。 然后我们路由添加/test
的API和资源对象附加test_resource
到它。
每当一GET
请求被发送到/test
URL,则on_get()
的方法TestResource
被调用。 响应状态和身体所使用的变量设置res.status
和res.body
分别。
保存文件并关闭编辑器。让我们测试一下应用程序。
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应用程序看到以下输出:
CTRL+C
。让我们设置一个更多的生产就绪的方式。
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
将以下内容添加到文件:
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.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应用程序配置为在后台像我们的其他服务一样自动启动。
/etc/systemd/system
与目录.service
延伸:
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虚拟环境,应用程序的工作目录。以及执行以启动应用程序的命令。我们分配命令来启动Gunicorn到ExecStart
变量。 该--workers
标志用来定义工人该Gunicorn应启动的数目。 该Gunicorn文档建议你设置的工人数量为2n+1
,其中n
是CPU内核的数量。 假设你的服务器有一个单一的CPU核心,我们到达数3
。
的ExecReload
和ExecStop
变量定义如何服务应该被启动和停止。
最后,我们将添加[Install]
部分,它看起来是这样的:
[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单位和单位的文件 。
关注云架构公众号
Linux入门
QQ交流群:308781113