介绍
在本指南中,我们将在Ubuntu 14.04上使用Flask微框架设置一个简单的Python应用程序。 这篇文章的大部分将是关于如何设置Gunicorn应用程序服务器启动应用程序和Nginx充当前端逆向代理。
先决条件
在开始本指南之前,您应该在服务器上配置非root用户。 这个用户需要具有sudo
权限,以便可以执行管理功能。 要了解如何设置的,按照我们最初的服务器设置指南 。
要了解更多关于我们的应用程序服务器将使用我们的应用程序Flask沟通WSGI规范,你可以阅读的链接部分本指南 。 了解这些概念将使本指南更容易遵循。
当您准备好继续时,请继续阅读。
从Ubuntu存储库安装组件
我们的第一步是安装我们需要的所有零件,从存储库。 我们将安装pip
,Python的包管理器,以便安装和管理我们的Python组件。 我们还将获得构建一些Gunicorn组件所需的Python开发文件。 我们现在也将安装Nginx。
更新您的本地包索引,然后键入以下内容安装包:
sudo apt-get update
sudo apt-get install python-pip python-dev nginx
创建Python虚拟环境
接下来,我们将设置一个虚拟环境,以便将Flask应用程序与系统上的其他Python文件隔离开来。
通过安装启动virtualenv
使用包pip
:
sudo pip install virtualenv
现在,我们可以为我们的Flask项目创建一个父目录。 在创建目录后移动到目录:
mkdir ~/myproject
cd ~/myproject
我们可以创建一个虚拟环境来存储Flask项目的Python需求,方法是键入:
virtualenv myprojectenv
这将安装Python的本地副本和pip
变成一个名为myprojectenv
项目目录之内。
在我们在虚拟环境中安装应用程序之前,我们需要激活它。 您可以键入以下内容:
source myprojectenv/bin/activate
您的提示将更改为表示您现在在虚拟环境中操作。 它看起来像这样( myprojectenv ) user @ host :~/ myproject $
。
设置Flask应用程序
现在,你在你的虚拟环境中,我们可以安装Flask和Gunicorn,并开始设计我们的应用程序:
安装Flask和Gunicorn
我们可以使用本地实例pip
安装瓶和Gunicorn。 键入以下命令以获取这两个组件:
pip install gunicorn flask
创建示例应用程序
现在我们有Flask可用,我们可以创建一个简单的应用程序。 Flask是一个微框架。 它不包括许多更全功能的框架可能的工具,并且主要作为一个模块,您可以导入到您的项目,以帮助您初始化Web应用程序。
当你的应用程序可能会比较复杂,我们将创建我们在一个文件中,我们将其称为瓶应用myproject.py
:
nano ~/myproject/myproject.py
在这个文件中,我们将放置我们的应用程序代码。 基本上,我们需要导入Flask并实例化一个Flask对象。 我们可以使用它来定义当请求特定路由时应该运行的函数。 我们将调用代码瓶的应用application
来复制你的WSGI规范找到的例子:
from flask import Flask
application = Flask(__name__)
@application.route("/")
def hello():
return "<h1 style='color:blue'>Hello There!</h1>"
if __name__ == "__main__":
application.run(host='0.0.0.0')
这基本上定义了访问根域时要呈现的内容。 保存并在完成后关闭文件。
您可以键入以下内容来测试Flask应用程序:
python myproject.py
访问您的服务器的域名或IP地址,然后在终端输出指定的端口号(最有可能的:5000
)在Web浏览器。 你应该看到这样的:
完成后,在终端窗口中按CTRL-C几次以停止Flask开发服务器。
创建WSGI入口点
接下来,我们将创建一个文件,作为我们的应用程序的入口点。 这将告诉我们的Gunicorn服务器如何与应用程序交互。
我们将调用文件wsgi.py
:
nano ~/myproject/wsgi.py
该文件是非常简单的,我们可以简单地从我们的应用程序导入Flask实例,然后运行它:
from myproject import application
if __name__ == "__main__":
application.run()
保存并在完成后关闭文件。
测试Gunicorn的能力服务项目
在继续前,我们应该检查Gunicorn可以正确。
我们可以通过简单地传递它的入口点的名称来做到这一点。 我们还将指定要绑定的接口和端口,以便它将在公开可用的接口上启动:
cd ~/myproject
gunicorn --bind 0.0.0.0:8000 wsgi
如果你访问你的服务器的域名或IP地址有:8000
追加到Web浏览器结束时,你应该会看到一个页面,如下所示:
当您确认它正常工作时,请在终端窗口中按CTRL-C。
我们现在已经完成了我们的虚拟环境,因此我们可以停用它:
deactivate
现在的任何操作都将对系统的Python环境完成。
创建Upstart脚本
下一个我们需要关心的是Upstart脚本。 创建一个Upstart脚本将允许Ubuntu的init系统自动启动Gunicorn并在服务器启动时为我们的Flask应用程序提供服务。
创建结尾的脚本文件.conf
的范围内/etc/init
目录开始:
sudo nano /etc/init/myproject.conf
在内部,我们将从脚本的目的的简单描述开始。 紧接着,我们将定义该脚本将由系统启动和停止的条件。 正常的系统运行时间数字是2,3,4和5,所以我们会告诉它在系统达到这些运行级别之一时启动我们的脚本。 我们会告诉它停止在任何其他运行级别(例如当服务器正在重新启动,关闭或在单用户模式下):
description "Gunicorn application server running myproject"
start on runlevel [2345]
stop on runlevel [!2345]
我们将告诉init系统它应该重新启动进程,如果它失败。 接下来,我们需要定义Gunicorn应该运行的用户和组。 我们的项目文件都由我们自己的用户帐户拥有,所以我们将自己设置为用户运行。 Nginx的服务器下运行www-data
组。 我们需要Nginx能够读取和写入套接字文件,所以我们将给这个组的所有权的过程:
description "Gunicorn application server running myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid user
setgid www-data
接下来,我们需要设置进程,以便它可以正确找到我们的文件并处理它们。 我们已经将所有的Python组件安装到一个虚拟环境中,因此我们需要设置一个环境变量作为我们的路径。 我们还需要更改到我们的项目目录。 然后,我们可以简单地调用Gunicorn应用程序与我们想使用的选项。
我们将告诉它启动3个工作进程(根据需要进行调整)。 我们也将告诉它创建和绑定到我们的项目目录中的Unix套接字文件名为myproject .sock
。 我们将设置的umask值007
,使创建套接字文件提供访问所有者和组,同时限制其他访问。 最后,我们需要传入WSGI入口点文件名:
description "Gunicorn application server running myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid user
setgid www-data
env PATH=/home/user/myproject/myprojectenv/bin
chdir /home/user/myproject
exec gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi
保存并在完成后关闭文件。
您可以通过键入以下内容立即开始此过程:
sudo start myproject
配置Nginx到代理请求
我们的Gunicorn应用程序服务器现在应该启动并运行,等待项目目录中的套接字文件上的请求。 我们需要配置Nginx通过对其配置文件进行一些小的添加来将Web请求传递给该套接字。
通过创建的Nginx的一个新的服务器模块的配置文件开始sites-available
目录。 我们将简单地称之为myproject
保持符合指南的其余部分:
sudo nano /etc/nginx/sites-available/myproject
打开一个服务器块,并告诉Nginx监听默认端口80.我们还需要告诉它使用这个块来请求我们服务器的域名或IP地址:
server {
listen 80;
server_name server_domain_or_IP;
}
我们需要添加的唯一的另一件事是一个匹配每个请求的位置块。 在此块中,我们将包括proxy_params
文件,指定了需要设置一些一般的代理参数。 然后,我们将通过请求,我们使用定义的插座proxy_pass
指令:
server {
listen 80;
server_name server_domain_or_IP;
location / {
include proxy_params;
proxy_pass http://unix:/home/user/myproject/myproject.sock;
}
}
这实际上是我们需要为我们的应用程序服务。 保存并在完成后关闭文件。
为了使我们刚刚创建的Nginx的服务器模块配置,文件链接到sites-enabled
目录:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
使用该目录中的文件,我们可以通过键入以下内容来测试语法错误:
sudo nginx -t
如果这返回没有指示任何问题,我们可以重新启动Nginx进程读取我们的新配置:
sudo service nginx restart
您现在应该能够在Web浏览器中转到您服务器的域名或IP地址,并查看您的应用程序:
结论
在本指南中,我们在Python虚拟环境中创建了一个简单的Flask应用程序。 我们创建一个WSGI入口点,以便任何支持WSGI的应用程序服务器可以与它接口,然后配置Gunicorn应用程序服务器以提供此功能。 然后,我们创建了一个Upstart脚本,在启动时自动启动应用程序服务器。 我们创建了一个Nginx服务器块,将Web客户端流量传递到应用程序服务器,中继外部请求。
Flask是一个非常简单但非常灵活的框架,旨在为您的应用程序提供功能,而不会对结构和设计造成过多的限制。 您可以使用本指南中描述的常规来为您设计的Flask应用程序提供服务。