介绍
在本指南中,我们将使用 Ubuntu 14.04 上的 Flask 微框架设置一个简单的 Python 应用程序,本文的大部分内容将是如何设置 uWSGI 应用程序服务器来启动应用程序和 Nginx 作为前端反向代理。
前提条件
在开始本指南之前,您应该在您的服务器上配置一个非根用户。该用户需要具有sudo
权限,以便执行管理功能。
要了解更多關於 uWSGI、我們的應用伺服器和 WSGI 規格,您可以閱讀 本指南的連結部分。
当你准备好继续阅读时,继续阅读。
安装来自 Ubuntu 存储库的组件
我们的第一步将是从存储库中安装我们需要的所有部件,我们将安装Python包管理器pip
,以便安装和管理我们的Python组件,我们还将获得构建uWSGI所需的Python开发文件,我们现在也将安装Nginx。
更新本地包索引,然后通过键入安装包:
1sudo apt-get update
2sudo apt-get install python-pip python-dev nginx
创建 Python 虚拟环境
接下来,我们将设置一个虚拟环境,以便将我们的Flask应用程序与系统上的其他Python文件隔离。
开始使用pip
安装virtualenv
包:
1sudo pip install virtualenv
现在,我们可以为我们的 Flask 项目创建一个母目录. 在您创建后移动到目录:
1mkdir ~/myproject
2cd ~/myproject
我们可以创建一个虚拟环境来存储我们的Flask项目的Python要求,通过键入:
1virtualenv myprojectenv
这将安装Python的本地副本和pip
到项目目录中的名为myprojectenv
的目录中。
在我们在虚拟环境中安装应用程序之前,我们需要激活它,您可以通过键入:
1source myprojectenv/bin/activate
您的提示将更改,表示您现在在虚拟环境中运行,它将看起来像(myprojectenv)user@host:~/myproject$
。
创建一个Flask应用程序
现在你在你的虚拟环境中,我们可以安装Flask和uWSGI,并开始设计我们的应用程序:
安装 Flask 和 uWSGI
我们可以使用本地实例pip
来安装 Flask 和 uWSGI. 输入以下命令来获取这两个组件:
1pip install uwsgi flask
创建样本应用程序
现在我们有Flask可用,我们可以创建一个简单的应用程序. Flask是一个微框架. 它不包括更多功能框架可能的许多工具,并且主要是作为一个模块,您可以导入到您的项目,以帮助您初始化Web应用程序。
虽然您的应用程序可能更复杂,但我们将创建我们的Flask应用程序在一个文件中,我们将其命名为myproject.py
:
1nano ~/myproject/myproject.py
在此文件中,我们将放置我们的应用程序代码. 基本上,我们需要导入 flask 并实例化一个 Flask 对象. 我们可以用此来定义需要执行特定路径时的函数。
1from flask import Flask
2application = Flask(__name__)
3
4@application.route("/")
5def hello():
6 return "<h1 style='color:blue'>Hello There!</h1>"
7
8if __name__ == "__main__":
9 application.run(host='0.0.0.0')
这基本上定义了在访问根域时要呈现的内容。
您可以通过键入测试您的 Flask 应用程序:
1python myproject.py
请访问您的服务器的域名或 IP 地址,然后在您的 Web 浏览器的终端输出中指定的端口号码(最有可能是 :5000
)。
完成后,在终端窗口中按 CTRL-C 几次来停止 Flask 开发服务器。
创建 WSGI 入口点
接下来,我们将创建一个文件,它将作为我们的应用程序的入口点,这将告诉我们的 uWSGI 服务器如何与应用程序进行交互。
我们将文件命名为wsgi.py
:
1nano ~/myproject/wsgi.py
文件非常简单,我们可以简单地从我们的应用程序中导入Flask实例,然后运行它:
1from myproject import application
2
3if __name__ == "__main__":
4 application.run()
保存并关闭文件,当你完成。
配置 UWSGI
我们的申请现在已经写成,我们的入口点已经建立,我们现在可以转到uWSGI。
试用UWSGI
我们要做的第一件事是测试,以确保uWSGI能够服务于我们的应用程序。
我们还将指定接口,以便它在公开可用的接口和协议上启动,以便它使用HTTP而不是uwsgi
二进制协议:
1uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi
如果您访问您的服务器的域名或 IP 地址,在您的 Web 浏览器的末端附有:8000
,您应该看到一个看起来像这样的页面:
当您确认它正常工作时,请在终端窗口中按 CTRL-C。
我们现在已经完成了我们的虚拟环境,所以我们可以禁用它:
1deactivate
任何操作现在都将被执行到系统的Python环境中。
创建 uWSGI 配置文件
我们已经测试了 uWSGI 是否能够为我们的应用提供服务,但我们想要更强大的东西来长期使用,我们可以创建一个 uWSGI 配置文件,使用我们想要的选项。
让我们把它放在我们的项目目录中,并称之为myproject.ini
:
1nano ~/myproject/myproject.ini
内部,我们将从[uwsgi]
标题开始,以便 uWSGI 知道如何应用设置. 我们将通过参考我们的wsgi.py
文件来指定模块,减去扩展:
1[uwsgi]
2module = wsgi
接下来,我们会告诉 uWSGI 在主模式下启动并生成五个工人流程,以满足实际请求:
1[uwsgi]
2module = wsgi
3
4master = true
5processes = 5
当我们测试时,我们在网络端口上暴露了uWSGI,然而,我们将使用nginx来处理实际的客户端连接,然后将请求传递给uWSGI。
我们将在以后给 Nginx 群组对 uWSGI 流程的所有权,所以我们需要确保群组所有者可以从它读取信息并写入它,我们还会通过添加真空
选项来清理流程停止时的插槽:
1[uwsgi]
2module = wsgi
3
4master = true
5processes = 5
6
7socket = myproject.sock
8chmod-socket = 660
9vacuum = true
我们需要做的最后一件事是设置死于期限
选项,这是必要的,因为Upstart init系统和uWSGI对不同的流程信号应该意味着什么有不同的想法。
1[uwsgi]
2module = wsgi
3
4master = true
5processes = 5
6
7socket = myproject.sock
8chmod-socket = 660
9vacuum = true
10
11die-on-term = true
你可能已经注意到,我们没有从命令行中指定一个协议,这是因为默认情况下,uWSGI使用uwsgi
协议,这是一个快速的二进制协议,旨在与其他服务器进行通信。
完成后,保存并关闭文件。
创建一个 Upstart 脚本
创建一个Upstart脚本将允许Ubuntu的 init系统自动启动uWSGI并在服务器启动时为我们的Flask应用程序提供服务。
在/etc/init
目录中创建一个以.conf
结束的脚本文件,开始:
1sudo nano /etc/init/myproject.conf
在内部,我们将从一个简单的描述脚本的目的开始。之后,我们将定义该脚本将由系统启动和停止的条件. 正常的系统运行时间数字是2,3,4和5,所以我们会告诉它在系统达到这些运行水平之一时启动我们的脚本。
1description "uWSGI server instance configured to serve myproject"
2
3start on runlevel [2345]
4stop on runlevel [!2345]
接下来,我们需要定义使用者和组将 uWSGI 运行为. 我们的项目文件都是我们自己的用户帐户所有,所以我们将自己设置为运行的用户。 Nginx 服务器在www-data
组下运行。
1description "uWSGI server instance configured to serve myproject"
2
3start on runlevel [2345]
4stop on runlevel [!2345]
5
6setuid user
7setgid www-data
接下来,我们需要设置流程,以便它能够正确地找到我们的文件并处理它们. 我们已经将所有我们的Python组件安装到虚拟环境中,所以我们需要将一个环境变量设置为我们的路径。
1description "uWSGI server instance configured to serve myproject"
2
3start on runlevel [2345]
4stop on runlevel [!2345]
5
6setuid user
7setgid www-data
8
9env PATH=/home/user/myproject/myprojectenv/bin
10chdir /home/user/myproject
11exec uwsgi --ini myproject.ini
保存并关闭文件,当你完成。
您可以立即通过键入开始该过程:
1sudo start myproject
将 Nginx 配置为 proxy 请求
我们的 uWSGI 应用服务器现在应该运行,等待项目目录中的插件文件上的请求。
首先,在 Nginx 的网站可用
目录中创建一个新的服务器封锁配置文件,我们将简单地称之为myproject
,以与其他指南保持一致:
1sudo nano /etc/nginx/sites-available/myproject
打开一个服务器块,并告诉 Nginx 倾听默认端口 80。我们还需要告诉它使用这个块来请求我们的服务器的域名或IP地址:
1server {
2 listen 80;
3 server_name server_domain_or_IP;
4}
我们只需要添加一个位置块来匹配每个请求,在这个块内,我们将包含一个uwsgi_params
文件,它指定了一些需要设置的一些一般 uWSGI 参数,然后我们将请求传递给我们使用uwsgi_pass
指令定义的接口:
1server {
2 listen 80;
3 server_name server_domain_or_IP;
4
5 location / {
6 include uwsgi_params;
7 uwsgi_pass unix:/home/user/myproject/myproject.sock;
8 }
9}
这实际上是我们需要的服务我们的应用程序. 保存和关闭文件,当你完成。
要启用我们刚刚创建的 Nginx 服务器封锁配置,请将文件链接到网站启用
目录:
1sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
使用该目录中的文件,我们可以通过键入测试语法错误:
1sudo nginx -t
如果返回没有表示任何问题,我们可以重新启动 Nginx 流程来阅读我们的新配置:
1sudo service nginx restart
您现在应该能够访问您的服务器的域名或 IP 地址,并查看您的应用程序:
结论
在本指南中,我们在Python虚拟环境中创建了一个简单的Flask应用程序. 我们创建了一个WSGI入口点,以便任何具有WSGI能力的应用程序服务器可以与其进行交互,然后配置了uWSGI应用程序服务器以提供此功能。
Flask 是一个非常简单但非常灵活的框架,旨在为您的应用提供功能,而不会过于限制结构和设计。